所以我遇到了一个问题,并且已经绞尽脑汁试图弄清楚两天了,所以我认为是时候寻求一些帮助了。
所以我的问题是我有一个抽象类 B 扩展了抽象类 A,我没有重写 B 中的任何方法或任何内容,而是指定更专门的行为、变量等。
现在这就是我的问题所在,我有第三个类,比如说类 C,它实现了所有正确的方法,也许覆盖了一些方法(我使用了 @Override 符号,所以我知道它做得正确),并且也许添加一些它自己的方法和变量。
现在这很好,但是当我尝试创建一个 A 类型的数组时,我想使用动态绑定(bind),这样我就可以添加 C 类型的对象,或者像这样返回 A 的任何其他对象。
A[] AObjects = new A[3];
Aobject[0] = new C();
so on and so forth
现在假设我有一个像 getNum(); 这样的方法在 C 内部,只有 C 有,它一直告诉我 getNum();当我尝试使用它时,类型 A 中没有定义它。我错过了什么吗?因为据我了解,方法仅在运行时绑定(bind),所以我应该能够获取 A 类型的引用变量,并将其分配给 C 类型的对象,并能够调用 C 中的所有公共(public)成员,正确的?或者数组的规则不同?
p.s 我对我的变量使用 protected,对我的方法使用 public。
任何帮助将不胜感激! :)谢谢
最佳答案
只有当类有该方法的定义时,您才能调用该类的方法,因此如果 A
没有定义 getNum()
那么您就不能对其调用 getNum()
。这些是编译器的规则,而不是运行时的规则; A a
实际上可能是 C
,但编译器无法知道这一点。如果您想调用 C
的方法,例如,您需要告诉编译器 a
是 C
。 ((C)a).getNum();
如果事实证明 a
实际上不是 C
那么你会得到一个运行时ClassCastException
。为了防止这种情况,您可以使用 instanceof
运算符,
if(a instanceof C)
((C)a).getNum();
else
// do something else
但是像这样的强制转换通常表明设计很糟糕。但如果您确实想这样做,那么使用 instanceof
比捕获 ClassCastException
快得多(大约快一个数量级)。
关于java - Java 中的动态绑定(bind)遇到问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16049803/