1

私の質問はあまり明確ではないかもしれません。この例を見ると、さらに説明できます。このStatic vs Dynamic Binding Logicに投稿された回答を読んでいると、この質問がありました。

2 つのバージョンのコードがありますが、どちらもまったく同じですが、パラメーターの型が変更されています。Class B p (double i)

version 1:

    import java.lang.*;

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

            c.p(10);   
            c.p("AAA");
            ((A)c).p(10);
        } 
    } 
        class B { 
            public void p(String s) 
            { 
                System.out.println("B: my string is " + s); 
            } 

           public void p(int i) 
            { 
                System.out.println("B: twice my double is: " + i*2); 
            } 
        }

        class A  extends B{ 
            public void p(int i) 
            { 
                System.out.println("A: my number is " + i); 
            } 
        } 

    Here the output is :
    A:my number is 10
    B: my string is AAA
    A: my number is 10

version 2:

    import java.lang.*;
    public class X
    {
        public static void main(String [] args) 
        { 
            B c = new A(); 
        c.p(10);  
        c.p("AAA");
        ((A)c).p(10);
    } 
} 
    class B { 
        public void p(String s) 
        { 
            System.out.println("B: my string is " + s); 
        } 

       public void p(double i) 
        { 
            System.out.println("B: twice my double is: " + i*2); 
        } 
    }

    class A  extends B{ 
        public void p(int i) 
        { 
            System.out.println("A: my number is " + i); 
        } 
    } 

    Here the output is :
        B:twice my double is 20.0
        B: my string is AAA
        A: my number is 10

私の質問は次のとおりです。p(int)クラス A からが最初のバージョンで呼び出され、p(double)クラス B からが 2 番目のバージョンで呼び出されるのはなぜですか。

version 1:
methods of A
A -----> p(string), p(int)- this is overridden from Class B
method of B
B ------> p(string), p(int)

version 2:
methods of A
A -----> p(string), p(double), p(int) No more overriding
method of B
B ------> p(string), p(double)

を宣言するB c;と、型の参照変数を初期化しますB

次に、c を新しいオブジェクトに代入します。c = new A();

したがって、この宣言B c = new A();はクラス A のインスタンスを作成し、型 B の変数に代入します。メソッド呼び出しが c で実行されるときはいつでも、コンパイラは最初にメソッドが B に存在するかどうかをチェックします (それは B 型であるため)。呼び出されるメソッドは、オブジェクト (A インスタンス) のものです。上記の例でこの動作が見られないのはなぜですか? または、私の推論が間違っている場合は、親切に訂正してください。

ありがとう

4

1 に答える 1