假设我有一个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类中的方法?怎样?
如果我不够清楚,我会稍后发布代码。但我也要求提供一些参考来研究对象数组和一起操作的继承。
2条答案
按热度按时间hm2xizp91#
这是很多教程中都包含的非常基本的内容,但我将尝试编译一个简短的答案。
首先,让我们把结构弄对。你有这种东西,是吗?
因此:
有没有办法将b或c对象添加到arraya中,以维护此类(b或c)的所有不同变量和方法?
你基本上是在问你是否可以把一个b或c的示例分配给
D.arrayA
? 如果是这样,那是可能的,因为两者都扩展了a,因此都有“is-a”属性。它们仍然分别是b或c示例(非常类似于单个汽车,即使它们位于只允许汽车的停车场上,它们仍然是相同的)。如果我想在主代码(调用addobjecttoarray)中向arraya添加一个b对象,然后在主代码的某些部分中标识该对象是哪个类(如果是a、b或c),或者甚至在d类中标识它(假设我已初始化并且一切正常)。我现在只是在操作阵列)我该怎么做?
你在问如何知道数组元素的类型,对吗?用于此用途
instanceof
,例如:有没有办法调用arraya上只存在于b类或c类中的方法?怎样?
是的,有,但你需要投,例如,在里面
if( element instanceof B)
然后你会这样做:一些注意事项:
使用
instanceof
而且强制转换通常不是解决问题的最佳方法,因为这可能是脆弱的(尝试将c示例强制转换为b示例),繁琐的(您总是必须首先检查类型或考虑添加E extends A
)等等。因此,您最终可能会找到几个原则:
重组合轻继承
程序到接口
在适当的地方使用泛型
mum43rcc2#
您可以将b或c示例放在
A[]
数组,它们保持原样,但当您从数组中检索它们时,编译器只知道它们是类型a,因此要调用b或c的唯一成员,必须在检索对象后将其强制转换为b或c。要安全地执行此操作,您必须执行以下操作:instanceof
先检查一下。例如:
然而,如果你发现你不得不使用
instanceof
很多情况下,您会遇到设计问题,通过更好地利用多态性(继承和接口),您的代码可以简化。这不是普遍正确的,但通常是正确的。一个常见的新手错误是认为强制转换将对象从一种类型更改为另一种类型。这是错误的。它只更改编译器查看对象类型的方式。如果您试图将对象强制转换为它尚未匹配的类型,您将在运行时得到classcastexception(崩溃)。