0

基本上我在这里有一个小问题。

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

这是一个例子。我有一个名为 Ship 的类和另一个名为 BabyShip 的 Ship 子类

如果我将 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
4

1 回答 1

2

你确定你没有看错书?Java不会像这样进行动态绑定。如果setMaxPassengers中声明BabyShip,则编译器正在做正确的事情。您只能访问您通过它们访问的表达式的编译时类型已知的成员 - 在这种情况下ship是 type Ship,因此只有Ship(及其超类)的成员可用。

如果不确切地知道书上说了什么,就很难确切地知道问题出在哪里。在普通 Java 中发生的唯一一种动态绑定是用于覆盖 - 如果您在 中声明但随后setMaxPassengers在中覆盖它,则将在执行时调用被覆盖的方法。ShipBabyShip

Java 7 在动态绑定方面有一些新特性,但听起来不像您在此处谈论的内容。

如果您可以引用书中的特定内容,您认为这意味着这应该有效,请这样做。

于 2011-11-12T08:07:46.217 回答