对象引用类型的问题(动态绑定)?

时间:2011-11-12 08:02:57

标签: java variables inheritance variable-declaration

基本上我在这里遇到一些问题。

我有一个超类和一个子类。我应该做一个从子类执行方法的赋值,它从超类中重写方法。这很好用。我遇到的问题是“动态绑定”。当我将引用变量类型声明为与子类相同的类时,它可以正常工作。但是,当我声明类型是超类时,它不会识别任何子类的方法甚至存在。

这是一个例子。我有一个名为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

1 个答案:

答案 0 :(得分:2)

你确定你没有误读这本书吗? Java 像这样做动态绑定。如果setMaxPassengers仅在<{1}}中声明 ,则编译器正在做正确的事情。您只能访问您正在访问它们的表达式的编译时类型已知的成员 - 在这种情况下BabyShip的类型为ship,因此只有{{1}的成员(及其超类)可用。

如果不确切知道这本书的内容,很难确切地知道问题是什么。普通Java中唯一的动态绑定类型是覆盖 - 如果您在Ship中声明Ship但在setMaxPassengers覆盖它,那么重写的方法将在执行时调用。

Java 7在动态绑定方面有一些新功能,但听起来并不像你在这里谈论的那样。

如果你能引用你认为暗示这应该有用的书的特定部分,请这样做。