0

私はJavaポリモーフィズムに混乱しています。動的メソッドバインディングでは、jvmは実行時にどのクラスメソッドを呼び出す必要があるかを決定します。A、B、Cの3つのクラスがあるとします。

class A{
    int get(){
        return 10;
    }

    int getParent(){
        return 10;
    }
}

class B extends A
{
    int get(){
        return 20;
    }
}

public class C
{
    public static void main(String args[])
    {
        A a = new A();
        A a1 = new B();
        System.out.println(a.get());/////////////////////////LINE1    
        System.out.println(a1.get  ());////////////////////////LINE2    
        System.out.println(a.getParent());////////////////////////LINE3
    }
}

コンパイル時とランタイムバインディングで1行目と3行目で混乱が生じています。3行目ではa.getParent()であり、このメソッドは親クラスにのみ存在するため、実行時に何を決定する必要があります。

1行目では、参照とオブジェクトの両方が同じクラスからのものであるため、ここでも何を決定する必要があります。

ランタイムとコンパイル時のバインディングがどのように機能するかについての適切なリンクを送ってください。

4

4 に答える 4

3
    class A
    {
      public doIt( )
      {
        //this does something
      }
    }

    class B extends A
    {
      public doIt( )
      {
        //this does something
      }
    }

    class C extends B
    {
      public doIt( )
      {
        //this does something
      }

    }        

    public static void main(String[] args) {
          A x = new B( );

          x.doIt( );

    }

多くの混乱を引き起こすステートメントは、「A x = newB();」です。声明。変数xはタイプAのオブジェクトですが、「= new B();」のため、クラスBのオブジェクトとしてインスタンス化されます。ステートメントの一部。Javaランタイムは基本的にこのステートメントを見て、「xはタイプAとして明確に宣言されていますが、クラスBのオブジェクトとしてインスタンス化されるため、クラスBで定義されているバージョンのdoIt()メソッドを実行します。 。」

オブジェクトxによって実行されるdoIt()メソッドのバージョンは、Javaで動的バインディングと呼ばれるものがあるため、クラスBのバージョンです。上記のコードは動的バインディングの例と見なすことができます。動的バインディングとは、基本的に、実際に呼び出されるメソッドの実装が、コンパイル時ではなく実行時に決定されることを意味します。これが動的バインディングと呼ばれる理由です。実行されるメソッドは実行時に選択されるためです。動的バインディングは、遅延バインディングとも呼ばれます。

アーリーバインディングでは、データとメソッドはコンプライアンス時にバインドされますが、レイトバインディングでは、データとメソッドは実行時にバインドされます。

于 2012-12-12T11:04:21.567 に答える
0

クラスAは、aA.getとA.getParentを含む仮想メソッドテーブルをObjectインスタンスに提供します。

クラスBは、オブジェクトインスタンスa1に仮想メソッドテーブルを提供します。最初にクラスAから取得され、拡張されます(ここでは拡張するものはありません)。メソッドはgetB.getで上書きされます。

a1.getは、Aであっても、B.getを呼び出します。

于 2012-12-12T11:02:55.483 に答える
0

ここでのポリモーフィズムは、line2 の場合にのみ適用されます。line1 と line3 に適用されるポリモーフィズムの概念はありません。

于 2012-12-12T11:09:28.470 に答える
0

クラス Bは get() メソッドをオーバーライドします。したがって、タイプBのオブジェクトで get() を呼び出すと、オーバーライドされたメソッドが使用されます。

B は getparent() をオーバーライドしないため、クラス B で呼び出したときに親の getParent() が呼び出されます。

于 2012-12-12T10:58:43.143 に答える