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はタイプShipであるため、のメンバーShip(およびそのスーパークラス)のみが使用可能です。

本が何を言っているかを正確に知らなければ、問題が何であるかを正確に知ることは難しい。通常のJavaで発生する唯一の動的バインディングは、オーバーライドするためのものです。で宣言setMaxPassengersShipた後、でオーバーライドしたBabyShip場合、オーバーライドされたメソッドは実行時に呼び出されます。

Java 7には、動的バインディングに関していくつかの新機能がありますが、ここで話しているのはそのようには思えません。

これがうまくいくはずだと思う本の特定の部分を引用できる場合は、そうしてください。

于 2011-11-12T08:07:46.217 に答える