2011-11-12 23 views
0

基本上我在这里有一个小问题。对象引用类型(动态绑定)的问题?

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

下面是一个例子。我有一个名为船舶类和船舶的另一个子类,称为BabyShip

如果我宣布为ShippyShip的参考:

BabyShip subref = new BabyShip(); 

它工作正常。然而,当我把它声明为:

Ship subref = new BabyShip(); 

编译器甚至不承认任何从BabyShip的方法,如果我宣布子参考的类型为船舶......但我的书中明确表示,它应该。它为什么这样做?

当我编译它时,它会给出一个正常的找不到符号错误。

ShipTester.java:8: error: cannot find symbol 
      ship.setMaxPassengers(1); 
       ^
    symbol: method setMaxPassengers(int) 
    location: variable ship of type Ship 
1 error 

回答

2

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

很难确切地知道问题出在哪里,而不知道书中的内容。在普通Java中发生的唯一一种动态绑定是为了覆盖 - 如果你在Ship中声明setMaxPassengers,然后在BabyShip中声明覆盖,那么将在执行时调用重写的方法。

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

如果您可以引用您认为应该起作用的书的某一部分,请这样做。

+0

对不起。你是对的,我没有清楚地看到它只能执行类型为类的方法。我想我需要使用另一种解决方法。 – Johnny

+2

@Johnny:如果你的代码只能用于特定的子类,那么它也应该是你的变量的类型。 –