0

私は以下のように2つのクラスを持っています

public class statictest {

public void print()
{
    System.out.println("first one");    
}
  }

public class newer extends statictest
 {

public void print()
{

    System.out.println("second one");

}   
  }

そして、私が行う主な機能で

statictest temp = new newer();
newer temp2 = new newer();

temp.print();
temp2.print();  

出力は次のとおりです。

second one
second one

しかし、これら2つのメソッドを静的にすると、出力は

firstone
secondone

この場合、遅延バインディングはどうなりましたか?? 誰でも説明できますか

4

5 に答える 5

1

これは、動的メソッド呼び出しと呼ばれます。このJLSで見ることができます。それは述べています、

メソッド検索の戦略は、呼び出しモードによって異なります。

呼び出しモードが静的である場合、ターゲット参照は必要なく、オーバーライドは許可されません。クラス T のメソッド m が呼び出されます。

それ以外の場合は、インスタンス メソッドが呼び出され、ターゲット参照があります。ターゲット参照が null の場合、この時点で NullPointerException がスローされます。それ以外の場合、ターゲット参照はターゲット オブジェクトを参照すると言われ、呼び出されたメソッドでキーワード this の値として使用されます。次に、呼び出しモードの他の 4 つの可能性が考慮されます。

于 2013-04-03T04:59:15.643 に答える
1

これは、静的メソッドがポリモーフィックではないためです。静的メソッドはオーバーライドされません 。

于 2013-04-03T04:59:23.653 に答える
0

静的メソッドはオーバーライドできません。statictest クラス参照変数 temp2 を使用して新しいクラスのオブジェクトを作成しました。スーパー クラス参照変数を使用してそのオブジェクトを保持します。コンパイル時に、コンパイラは statictest クラスでメソッドが使用可能かどうかをチェックするだけです。使用可能な場合は正常に準拠します。そうでない場合はエラーが発生します。静的印刷メソッドを宣言したコードで、statictest クラスのコンパイルで使用可能になります。ただし、メソッドは静的であるため、オーバーライドできません。今度は main メソッド u が statictest temp = new newer();を宣言しました。 現在、temp オブジェクトは statictest クラスの機能のみで作成されます。新しいクラス メソッドまたは変数オブジェクトは含まれません。参照されたクラス プロパティのみに基づいて作成されます。スーパー クラス (statictest) にサブ クラス (新しいクラス) と同じ非静的値が含まれている場合、サブクラス プロパティ (新しいクラス) は含まれません。スーパークラスのプロパティをオーバーライドするだけです。なぜオーバーライドするのですか?クラスでは、同じ変数または同じメソッドを宣言することは許可されないためです

于 2013-04-03T05:53:37.623 に答える
0

で検索してくださいDynamic method dispatch

静的メソッドはオーバーライドできません。そのため、静的にすると、このような出力が得られます。

于 2013-04-03T05:05:59.440 に答える