对象引用类型的java问题(动态绑定)?
基本上我有点小问题
我有一个超类和一个子类。我应该做一个赋值,从子类执行一个方法,这个方法重写了超类中的方法。这个很好用。我遇到的问题是“动态绑定”当我将引用变量类型声明为与子类属于同一个类时,它可以正常工作。然而,当我声明子类的类型不存在时,我也不承认它是超类的类型
这里有一个例子。我有一个叫做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 楼答案
你确定你没有误读这本书吗?Java不会像这样进行动态绑定。如果
setMaxPassengers
只在BabyShip
中声明了^{,,那么编译器做的事情完全正确。您只能访问要通过其访问的表达式的编译时类型已知的成员——在本例中ship
是Ship
类型,因此只有Ship
(及其超类)的成员可用如果不知道这本书到底说了什么,就很难确切地知道问题是什么。在普通Java中发生的唯一一种动态绑定是重写——如果您在
Ship
中声明了setMaxPassengers
,但随后在BabyShip
中重写了它,那么将在执行时调用重写的方法Java7在动态绑定方面有一些新特性,但听起来并不是这里所说的
如果你能引用这本书中的某一部分,你认为这应该有效,请这样做