如何识别对象是哪种类型的继承类?JAVA

ffx8fchx  于 2021-08-20  发布在  Java
关注(0)|答案(2)|浏览(213)

假设我有一个java代码,包含5个类:

class a = superclass.
class b = class that inherits a methods and have others.'''
class c = class that inherits a methods and have others.'''
class d = class that have an array (lets call "arrayA") of class a objects and other methods(like addObjectToArray).
class e = main.

我的疑问是:
有没有办法将b或c对象添加到arraya中,以维护此类(b或c)的所有不同变量和方法?
如果我想在主代码(调用addobjecttoarray)中向arraya添加一个b对象,然后在主代码的某些部分中标识该对象是哪个类(如果是a、b或c),或者甚至在d类中标识它(假设我已初始化并且一切正常)。我现在只是在操作阵列)我该怎么做?
有没有办法调用arraya上只存在于b类或c类中的方法?怎样?
如果我不够清楚,我会稍后发布代码。但我也要求提供一些参考来研究对象数组和一起操作的继承。

hm2xizp9

hm2xizp91#

这是很多教程中都包含的非常基本的内容,但我将尝试编译一个简短的答案。
首先,让我们把结构弄对。你有这种东西,是吗?

class A {
}

class B extends A { 
  void someBMethod();
}

class C extends A{
}

class D {
  A[] arrayA;
}

因此:
有没有办法将b或c对象添加到arraya中,以维护此类(b或c)的所有不同变量和方法?
你基本上是在问你是否可以把一个b或c的示例分配给 D.arrayA ? 如果是这样,那是可能的,因为两者都扩展了a,因此都有“is-a”属性。它们仍然分别是b或c示例(非常类似于单个汽车,即使它们位于只允许汽车的停车场上,它们仍然是相同的)。
如果我想在主代码(调用addobjecttoarray)中向arraya添加一个b对象,然后在主代码的某些部分中标识该对象是哪个类(如果是a、b或c),或者甚至在d类中标识它(假设我已初始化并且一切正常)。我现在只是在操作阵列)我该怎么做?
你在问如何知道数组元素的类型,对吗?用于此用途 instanceof ,例如:

for(A element : arrayA) {
   if( element instanceof B ) {
     //it's a B
   } else if( element instanceof C ) {
     //it's a C
   }
}

有没有办法调用arraya上只存在于b类或c类中的方法?怎样?
是的,有,但你需要投,例如,在里面 if( element instanceof B) 然后你会这样做:

B casted = (B)element;
casted.someBMethod();

一些注意事项:
使用 instanceof 而且强制转换通常不是解决问题的最佳方法,因为这可能是脆弱的(尝试将c示例强制转换为b示例),繁琐的(您总是必须首先检查类型或考虑添加 E extends A )等等。
因此,您最终可能会找到几个原则:
重组合轻继承
程序到接口
在适当的地方使用泛型

mum43rcc

mum43rcc2#

您可以将b或c示例放在 A[] 数组,它们保持原样,但当您从数组中检索它们时,编译器只知道它们是类型a,因此要调用b或c的唯一成员,必须在检索对象后将其强制转换为b或c。要安全地执行此操作,您必须执行以下操作: instanceof 先检查一下。
例如:

for (A item: arrayA) {
    if (item instanceof B) {
        B b = (B)item;
        // do something with b
    }
}

然而,如果你发现你不得不使用 instanceof 很多情况下,您会遇到设计问题,通过更好地利用多态性(继承和接口),您的代码可以简化。这不是普遍正确的,但通常是正确的。
一个常见的新手错误是认为强制转换将对象从一种类型更改为另一种类型。这是错误的。它只更改编译器查看对象类型的方式。如果您试图将对象强制转换为它尚未匹配的类型,您将在运行时得到classcastexception(崩溃)。

相关问题