1

次のようなコードがあります。

abstract class ExampleOne {
   int dataOne = 1000;

   abstract void display();
}

class ExampleTwo extends ExampleOne {
   int dataTwo;

   ExampleTwo(int varOne) {
      dataTwo = varOne;
   }

   public void disp() {
      System.out.println("Testing");
   }

   public void display() {
      System.out.println(dataOne);
   }
}

class Example {
   public static void main(String args[]) {
      ExampleOne obj = new ExampleTwo(20);
      obj.disp();
      obj.display();
   }
}

これをコンパイルすると、エラーが発生します。

                obj.disp(); 
                     ^
  symbol:   method disp()
  location: variable obj of type ExampleOne

なぜこれが起こるのですか?

ExampleTwoのインスタンスをに割り当てていますが、Java が の代わりにインスタンスをExampleOne選択しないのはなぜですか?ExampleOneExampleTwo

dynamic polymorphism!に関しても同じ概念が機能します。

これはなぜですか?

4

5 に答える 5

9

の型がobjisであるため、コンパイラはクラス内でExampleOne呼び出すメソッドを検索し、見つからない場合はエラーをスローします。objExampleOne

Java が ExampleTwo ではなく ExampleOne インスタンスを選択しないのはなぜですか?

これは、コンパイル時のチェックが実際のオブジェクト型ではなく参照型に基づいて行われるためです。そして、実行時に呼び出される実際のメソッドは、参照されている実際のオブジェクトに基づいて決定されます。これは、メソッド呼び出しの動的ディスパッチと呼ばれるものです。

コンパイラが呼び出しに満足していることを確認するために、クラスに抽象disp()メソッドを追加できます。ExampleOne

abstract class ExampleOne{ 
    int dataOne=1000; 
    abstract void display(); 
    abstract void disp();
} 
于 2013-02-17T07:37:56.067 に答える
4

メソッドは でのみ定義されていますExampleTwoが、 では定義されていませんExampleOne。これにより、コンパイル エラーが発生します。

于 2013-02-17T07:38:02.623 に答える
1

オブジェクト タイプはExampleOneです。ExampleTwoオブジェクト型 (つまり、メソッドとメンバー)のインスタンスを作成したとしても、コンパイラが認識しているのExampleOneは disp() が宣言されていません。

ポリモーフィックな方法で使用する場合は、抽象メソッドを宣言する必要がありdisp()ますExampleOne

于 2013-02-17T07:38:56.500 に答える
1

基本クラスのオブジェクトは、それ自身のクラスにのみアクセスできますMethods。しかしdisp()、その方法ではありません。そのため、エラーが発生します。

エラーを回避するには、これを行うことができます:

ExampleTwo obj=new ExampleTwo(20); 
                  obj.disp(); 
                  obj.display();
于 2013-02-17T07:40:53.410 に答える
1

良い、

背後にある概念は、この Java コントラクトによって、ExampleOne のメソッドを ExampleTwo のバージョンで呼び出すことです。

つまり、参照変数型のメソッドのみを呼び出すことができます (あなたの場合は ExampleOne です)。ただし、呼び出されるメソッドのバージョンは、基礎となるオブジェクト タイプ (つまり、ExampleTwo) になります。そしてそれはポリモーフィズムによって促進されます。

ここで言及する価値があるのは、オブジェクトをそのタイプの任意の参照変数または階層内の任意のスーパークラスに割り当てることができるということです。

于 2013-02-17T07:43:27.500 に答える