基本上我在这里遇到一些问题。
我有一个超类和一个子类。我应该做一个从子类执行方法的赋值,它从超类中重写方法。这很好用。我遇到的问题是“动态绑定”。当我将引用变量类型声明为与子类相同的类时,它可以正常工作。但是,当我声明类型是超类时,它不会识别任何子类的方法甚至存在。
这是一个例子。我有一个名为Ship的类和另一个名为BabyShip的子类
如果我将ShippyShip的引用声明为:
BabyShip subref = new BabyShip();
工作正常。但是,当我将其声明为:
Ship subref = new BabyShip();
如果我声明subref的类型是Ship,编译器甚至不会识别BabyShip中的任何方法......但是我的书清楚地说它应该。为什么要这样做?
在编译时,它会给常规找不到符号错误。
ShipTester.java:8: error: cannot find symbol
ship.setMaxPassengers(1);
^
symbol: method setMaxPassengers(int)
location: variable ship of type Ship
1 error
答案 0 :(得分:2)
你确定你没有误读这本书吗? Java 不像这样做动态绑定。如果setMaxPassengers
仅在<{1}}中声明 ,则编译器正在做正确的事情。您只能访问您正在访问它们的表达式的编译时类型已知的成员 - 在这种情况下BabyShip
的类型为ship
,因此只有{{1}的成员(及其超类)可用。
如果不确切知道这本书的内容,很难确切地知道问题是什么。普通Java中唯一的动态绑定类型是覆盖 - 如果您在Ship
中声明Ship
但在setMaxPassengers
中覆盖它,那么重写的方法将在执行时调用。
Java 7在动态绑定方面有一些新功能,但听起来并不像你在这里谈论的那样。
如果你能引用你认为暗示这应该有用的书的特定部分,请这样做。