2017-09-28 5 views
3

誰でも私を明確にすることはできますか?ここでは、インスタンスメソッドはオーバーライドされていますが、変数はそうではありません。 出力は次のようになります。B 10Javaで変数を使用した継承

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); 
    } 
} 
+3

メソッド呼び出しは_dynamically_(実行時に解決されることを意味します)、インスタンス変数へのアクセスは_statically_(コンパイル時に解決される)にバインドされます。また、コンパイラーは常に_declared_型の変数を使用してインスタンス変数を解決します。 – Seelenvirtuose

+0

そのシンプルで素敵な説明のために@Seelenvirtuose +1 – procrastinator

+0

はい、あなたは正しいです。クラスの変数にアクセスする、またはインスタンスがgetstaticまたはgetfieldを使用する場合、バイトコードはスーパークラスを見つけるのではなく、そのスーパークラスメソッドをオーバーライドするメソッドはinvokevirtualを実行し、バイトコードはスーパークラスメソッドを検出します。 – dabaicai

答えて

1

、あなたが唯一の方法でオーバーライドすることができます:あなたの例では

public class A{ 
    private int i=10; 

    public void name(){ 
     System.out.println("A"); 
    } 

    public int getI(){ 
     return i; 
    } 
} 

public class B extends A{ 
    private int i=20; 

    public void name(){   
     System.out.println("B"); 
    } 

    @Override 
    public int getI(){ 
     return i; 
    } 
} 

public class HelloWorld { 

    public static void main(String[] args){ 
     A a = new B(); 
     a.name(); 
     System.out.println(a.getI()); 
    } 

} 

を、あなたはとてもBi値は無視されるタイプAとして変数aを定義します。

+0

仲間ありがとう。これはどこに説明されていますか? –

+0

あなたの属性をプライベートにしてゲッターで公開するのは、それが一般的ではないことを知って[ここ](https://stackoverflow.com/a/4716335/4906586)から始めることができます。その後、サブクラスで必要な方法でゲッターをオーバーライドできます – Al1

4

あなたは絶対的に正しいです。パラメータのリストと関数の名前が同一で、戻り値の型がの共変量の場合、メソッドはJavaでオーバーライドされます。基本クラスで

i単にが隠されている:参照aタイプそれはBインスタンスを指していても、Aあるのでa.iは、基底クラスにiメンバーを指します。あなたが属性をオーバーライドすることはできません

+0

@SiddappaWalake:はい、それもSuperクラスと呼ぶことができます。私はBaseクラスという言葉が好きです。 – Bathsheba

+0

しかし、なぜこれが奇妙なのですか?変数もインスタンスメンバーですか? –

+0

@SiddappaWalake:確かにそうですが、この点ではクラスフィールドとクラスメソッドの動作が異なります。 – Bathsheba

1

Javaインスタンス変数では、メソッドをオーバーライドすることはできません。スーパークラスで宣言されたものと同じ名前のフィールドを宣言すると、この新しいフィールドは既存のフィールドを隠します。このJavaのドキュメントHiding Fieldsを参照してください。

関連する問題