私の質問はあまり明確ではないかもしれません。この例を見ると、さらに説明できます。この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 インスタンス) のものです。上記の例でこの動作が見られないのはなぜですか? または、私の推論が間違っている場合は、親切に訂正してください。
ありがとう