2017-07-27 6 views
1

このトピックに関する関連記事のいくつかを学びました。サブクラスで同じ名前の変数を作成すると、それが隠蔽と呼ばれることがわかりました。与えられたデータ型の効果の仕方メンバー変数のオーバーライド

 

    class A { 
     int i = 10; 

     public void printValue() { 
      System.out.print("Value-A"); 
      System.out.println(i); 
     } 
    } 

    class B extends A { 
     int i = 12; 

     public void printValue() { 
      System.out.print("Value-B"); 
      System.out.println(i); 
     } 
    } 

    public class Test { 
     public static void main(String args[]) { 
      A a = new B(); 
      a.printValue(); 
      System.out.print(a.i); 
     } 
    } 

Iは、タイプAと印刷部材データ A =新しいB()とクラスBのインスタンスを、 System.out.println(a.i) 出力は10です(親クラスメンバーデータの値)。

しかし、クラスBをB型としてインスタンス化すると、 B a = new B(); System.out.println(a.i)は12です。(親クラスメンバーデータの値)

どのように違うのか知りたいです。

+0

非常に近い質問https://stackoverflow.com/questions/15513467/polymorphism-with-instance-variables – agurylev

答えて

1

多型はメソッドにのみ適用されます。変数は引き続きその型にバインドされます。変数をオーバーレイすることはできません。これは、タイプを変更したときに異なる出力が表示される理由です。あなただけを覚えておくことが

A a=new B(); 

を書くとき、単純な言葉で

、変数は左側とメソッドにバインド右側から実行して取得します。

2

変数は、作成されたオブジェクトではなく参照にバインドされます。あなたの例では、A a = new B();ここでaは、Aという種類の変数バインドへの参照です。そして、作成されたオブジェクトは、メソッドがバインドされるタイプBです。そのため、参照変数の値を選択しているのです。これはデータ隠蔽と呼ばれます。サブクラスに同じ変数を作成すると、サブクラスの変数の値がクラス変数superの下に隠されるためです。それが役に立てば幸い。

+0

はい、あなたは正しいです、それは働いた。 –

関連する問題