サブクラスオブジェクトを作成すると、親コンストラクション関数で布団クラスの書き換えを呼び出すメソッドは、なぜサブクラスのメソッドを呼び出し、布団クラスの再ロードメソッドは呼び出されませんか?
public class Basic{
public void add(int i)
{
System.out.println("Basic add");
}
public Basic()
{
add('a');
}
}
public class A extends Basic{
public void add(int i)
{
System.out.println("A add");
}
}
public class B extends Basic{
public void add(char i)
{
System.out.println("B add");
}
}
public class Main{
public static void main(String[] args)
{
A a = new A();
B b = new B();
}
}
質問:Aオブジェクトを作成するときに親が子メソッドを呼び出すのはなぜですか?ただし、Bオブジェクトの親を作成すると親を呼び出す方法は?
答え:サブクラスがメモリメソッド領域にロードされると、親はメモリにロードされ続けます.子クラス
が親クラスのメソッドを参照している場合、子クラスのメソッド参照は子クラスのメソッドを参照し、そうでない場合、子クラスのメソッド参照は親クラスのメソッド参照を参照します.サブクラス
が親メソッドを持っている場合、サブクラスリロードメソッドはまた、サブクラスメソッドを参照する.子メソッドが書き換えられず、親メソッドが再ロードされていない場合、メソッドリファレンスは親メソッドを指します.サブクラスオブジェクトが作成されると、親のコンストラクションメソッド(コンストラクションメソッドもメソッド)が先に呼び出され、仮想機会はサブクラスメソッド領域でメソッドを探して実行します.ただし、java言語は静的多分割であるため、動的単分割である.その結果,コンパイル時に親構築メソッドが呼び出すメソッドのパラメータが親メソッドに適合するパラメータに強制的に変換される.上のコードはコンパイル前に次のように変換されました.
public class Basic{
public void add(int i)
{
System.out.println("Basic add");
}
public Basic()
{
add((int)'a');
}
}
public class A extends Basic{
public void add(int i)
{
System.out.println("A add");
}
}
public class B extends Basic{
public void add(char i)
{
System.out.println("B add");
}
}
public class Main{
public static void main(String[] args)
{
A a = new A();
B b = new B();
}
}
上のコードを見て、はっと悟ったのではないでしょうか.
詳細:http://blog.gavinzh.com