誰でも私を明確にすることはできますか?ここでは、インスタンスメソッドはオーバーライドされていますが、変数はそうではありません。 出力は次のようになります。B 10
Javaで変数を使用した継承
class A{
int i=10;
public void name(){
System.out.println("A");
}
}
class B extends A{
int i=20;
public void name(){
System.out.println("B");
}
}
public class HelloWorld {
public static void main(String[] args){
A a = new B();
a.name();
System.out.println(a.i);
}
}
メソッド呼び出しは_dynamically_(実行時に解決されることを意味します)、インスタンス変数へのアクセスは_statically_(コンパイル時に解決される)にバインドされます。また、コンパイラーは常に_declared_型の変数を使用してインスタンス変数を解決します。 – Seelenvirtuose
そのシンプルで素敵な説明のために@Seelenvirtuose +1 – procrastinator
はい、あなたは正しいです。クラスの変数にアクセスする、またはインスタンスがgetstaticまたはgetfieldを使用する場合、バイトコードはスーパークラスを見つけるのではなく、そのスーパークラスメソッドをオーバーライドするメソッドはinvokevirtualを実行し、バイトコードはスーパークラスメソッドを検出します。 – dabaicai