java - Java 中的动态绑定(bind)遇到问题

标签 java arrays dynamic binding polymorphism

所以我遇到了一个问题,并且已经绞尽脑汁试图弄清楚两天了,所以我认为是时候寻求一些帮助了。

所以我的问题是我有一个抽象类 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 的方法,例如,您需要告诉编译器 aC((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/

相关文章:

java - 玩!框架 : Layouts with different sections

dynamic - Clojure 是单类型的吗?

javascript - 清除 map 对象

java - 具有自定义布局的 AlertDialog.Builder 无法打开?

iphone - UITableViewCell中UILabel宽度的动态计算

java - 编写 hibernate 查询时遇到问题

Java Reflection - 从 set 方法中获取字段的名称

java - 在 java 字符串池中将创建多少个 String 对象?

javascript - 查找不包含数字的子数组的索引

arrays - Swift - 将对象数组保存到核心数据,检索时只取回一个对象