2016-06-27 3 views
-1

ここでは、クラスプロパティを継承する簡単な例を示します。Parents変数にアクセスする親参照の子クラスオブジェクト

class Xyz 
{ 
    int a = 10; 
} 

public class Demo extends Xyz 
{ 
    int a = 5; 

    public static void main(String[] args) 
    { 

     Xyz z = new Demo(); 
     System.out.println(z.a); 
    } 

} 

オブジェクトがクラスDemoであるので5を印刷するが、出力は10あるべきされます。その背後にある理由は何ですか?

答えて

2

javaの変数の場合、変数はオブジェクトに関する参照変数を使用してのみアクセスできます。

Xyz z // z is the reference variable of Xyz so it will print 10 instead of 5. 



Xyz z = new Demo(); // override concept only works for Method not for Variables 

別の混乱が優先される可能性があります。ただし、変数はメソッドではなく変数のコンテキストでのみオーバーライドが行われることを理解する必要があります。

出力が正しいことをご確認ください。それはあなたがオブジェクトのメンバ変数をaccesingしている場合は、常にオブジェクトを使用して宣言された型の変数にアクセスし、あなたに

0

ありがとう10の代わりに、

5.でなければなりません。

Xyzint a = 10;をコメントアウトしてください。あなたがしたい、あるいは、あなたのような振る舞いに依存しているのであれば

class Xyz 
{ 
    int m() 
    { 
     return 10; 
    } 
} 

public class Main extends Xyz 
{ 
    int m() 
    { 
     return 5; 
    } 

    public static void main(String[] args) 
    { 
     Xyz z = new Main(); 
     System.out.println(z.m()); 
    } 
} 

:あなたのコードは

これは(しない限り、民間)はデフォルトで仮想的な方法、のために異なっている...これ以上コンパイルされません元々期待されているように、あなたのメンバー変数をプライベートにして、getterと–を提供する必要がある場合は、–セッター(もちろん、サブクラスでこれらをオーバーライドする必要があります)。

0

実際には、Xyzオブジェクトを作成して、整数aへの参照がXyzに従うようにしています。

あなたは親クラスの値を変更したい場合は、この

class Xyz 
{ 
    int a = 10; 
} 

public class Demo extends Xyz 
{ 

    public Demo(){ 
     super.a = 5; 
    } 

    public static void main(String[] args) 
    { 

     Xyz z = new Demo(); 
     System.out.println(z.a); // 5 is printed 
    } 

} 
よう

何かスーパーのアクセスや変更、親の値を呼び出す必要があります

関連する問題