有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

对象引用类型的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) 个答案

  1. # 1 楼答案

    你确定你没有误读这本书吗?Java不会像这样进行动态绑定。如果setMaxPassengers只在BabyShip中声明了^{,那么编译器做的事情完全正确。您只能访问要通过其访问的表达式的编译时类型已知的成员——在本例中shipShip类型,因此只有Ship(及其超类)的成员可用

    如果不知道这本书到底说了什么,就很难确切地知道问题是什么。在普通Java中发生的唯一一种动态绑定是重写——如果您在Ship中声明了setMaxPassengers,但随后在BabyShip中重写了它,那么将在执行时调用重写的方法

    Java7在动态绑定方面有一些新特性,但听起来并不是这里所说的

    如果你能引用这本书中的某一部分,你认为这应该有效,请这样做