0

以下に示すように、クラスAで2つのメソッドを作成し、クラスBでオーバーライドしました。動的ポリモーフィズムとオーバーライドに関連するいくつかの質問があります。

これがクラスBがクラスAを拡張する私のコードです。

public class A {


    public void methoda()
    {
        System.out.println("a");
    }
    public void methodb()
    {
        System.out.println("aaa");
    }
    public static void main(String[] args) {
    B a =new B();
    A b=a;
    b.methoda();


    }

}

public class B extends A{
@overrides
public void methoda()
{
    System.out.println("A");
}
@overrides
public void methodb()
{
    System.out.println("g");
}
}

ここでは、2つのメソッドをオーバーライドしています。スーパークラス参照が使用される場合、呼び出されるメソッドは、実行時に決定されたオブジェクトのタイプに依存し、動的ポリモーフィズムの例です。

しかし、サブクラスオブジェクトにサブクラス参照を使用してメソッドをオーバーライドすると、オーバーライドは実行時に解決され、動的ポリモーフィズムの場合、またはオブジェクトタイプと参照が同じタイプであり、動的多型の場合?

オーバーライドと動的ポリモーフィズムは常に同時に発生しますか?

4

5 に答える 5

3

質問を理解しているかどうかはわかりませんが、ポリモーフィック メソッドは常に実行時に解決されます。実行されるメソッドは、オブジェクトの具体的なランタイム タイプの 1 つです。それを参照する変数の宣言された型は問題ではありません。

ライオンはライオンであり、アニマルとして参照すると、常に吠えます。

于 2013-02-16T13:41:33.513 に答える
1

まず、(サブタイプ)ポリモーフィズムは常に動的(つまり実行時)であるため、アドホック多相またはパラメトリックポリモーフィズムと区別するために使用されない限り、「動的」修飾子は冗長です。

次に、@ Override(@overridesではない)アノテーションは必須ではありません(実際にはJava 5.0でのみ導入されています)が、より読みやすく(オーバーライドされたメソッドを明示的に示します)、より堅牢な(コンパイラーはスペルミスのメソッドをチェックします)コードに推奨されます。

つまり、メソッドのオーバーライドはOOP言語の重要な機能であり、アノテーション@Overrideはコンパイル時にチェックされ、ポリモーフィックな動作は実行時に解決されます。

于 2013-02-16T13:45:41.540 に答える
0
class Bike {  
   void run() {
      System.out.println("running");
   }  
}  

class Splender extends Bike {  
   void run() {
      System.out.println("Bike is running");
   }  

   public static void main(String args[]) {

      Bike a = new Bike();
      a.run(); //output: running

      Bike b = new Splender();  
      b.run(); //output: Bike is running 
   }  
} 

ここで、スーパークラス (バイク) 参照はサブクラス オブジェクトを指します。オブジェクトは、コンパイル時ではなく実行時に作成されます。かどうかは関係ありません。

1) 参照変数とオブジェクトの型が同じか、

2) 参照変数はスーパークラス型で、オブジェクトはサブクラス型です。

上記の例では、Splender のインスタンスが Bike のインスタンスでもあるため、コンパイラはオブジェクト タイプを決定できません。このメソッドは、作成されるオブジェクトのタイプに基づいて、JVM によって実行時に呼び出されます。どちらの場合も動的ポリモーフィズムであり、コンパイル時のポリモーフィズムではありません。

于 2016-01-27T07:30:25.337 に答える
0

サブクラスで参照するかどうかは関係ありません。重要なのは、作成されるインスタンスです。インスタンスが B から作成された場合、B の結果が得られます。

于 2013-02-16T13:40:30.063 に答える