2017-01-08 1 views
-1

Javaフィールドの変数の継承に関する問題を調べたいと思います。ここでのコードセグメントは、次のとおりです。子は独自のフィールド変数を持つか、継承を通じて親変数を共有しますか?

//parent 
public class Parent { 
    protected int a = 0; 
} 

//son 
public class Son extends Parent{ 
    public void demo(){ 
     a = 1; 
     System.out.println(super.a); 
    } 
    public static void main(String[] args){ 
     Son son = new Son(); 
     son.demo(); 
    } 
} 

は出力:

1 

期待:私のコードで

0 

を子供がフィールド変数aを継承し、我々はsonAとフィールドと呼びました親の変数aparentAと呼ばれます。

私の質問は、sonAparentAが同じもの(例:アドレスが0x1234)かどうかです。または2つの異なる変数(例えば、1つのアドレス0x1234別の0x5678)を表すか?

+0

はい、彼らは同じ変数だが含まれていないので、あなたは、最後の行に例外を取得します。それはすべてですか? – shmosel

+0

はい、それは同じものです。基本クラスのメソッドまたは変数を暗黙的にまたは明示的に呼び出すことができます。それでおしまい。 – atiqkhaled

+0

あなたのコードには 'sonA'はありません。 「フィールド」を正しく綴るのに時間と手間をかけることは可能でしょうか?そして意味をなさない小冊子を作ってください。また、コードではないテキストのコード書式は使用しないでください。あなたが何を求めているのか不明です。 – EJP

答えて

0

これらは同じアドレスを共有しますが、デフォルト値01で上書きしていますが、正しい動作です。さんがそれを確認してみましょう:

Son son = new Son(); 
Parent parent = new Parent(); 
Field fieldAParent = parent.getClass().getDeclaredField("a"); 
Field fieldA = son.getClass().getDeclaredField("a"); 

クラス息子がフィールドa

0

Sonにはaがありませんので、同じです。あなたは1を導入した場合、あなたはParentaを隠します、その後、あなたが期待している動作が表示されます:

//parent 
public class Parent { 
    protected int a = 0; 
} 

//son 
public class Son extends Parent{ 
    int a = 0; // this hides the Parent field 

    public void demo(){ 
     a = 1; // this accesses the Son field 
     System.out.println(super.a); // this accesses the Parent field explicitly 
    } 
    public static void main(String[] args){ 
     Son son = new Son(); 
     son.demo(); 
    } 
} 

それはにつながる可能性があるとして、しかし、これは一般的に、お勧めではありません多くの混乱。

関連する問題