2016-04-05 5 views
0

私の理解では、我々はメンバ変数をオーバーライドすることはできませんが、私は以下のプログラムを実行していたとき、私は取得していますO/PIで予期しないO/Pオーバーライドは、

class Parent { 
    String message = "parent"; 
    void say() { 
     System.out.println(message); 
    } 
    } 

    class Child extends Parent { 
     String message = "child"; 
} 

public class Test { 
    public static void main(String[] args) { 
     new Child().say(); 
    } 
} 

を取得していますということです"parent"私たちはchildオブジェクトを使ってsayメソッドを呼び出していますが、親参照はありません。

誰でも私の理解を助けることができます。

ありがとう

答えて

1

「say」メソッドは、子クラスではなく、親クラスにあります。だからそれは "メッセージ"メンバーを呼び出すとき、それは子供のものではなく、自分自身を見る。その呼び出しが子クラスを通してmakeであるという事実は、その中で何もしません。 実際、メンバー変数はここでは上書きされません。これは予想される動作です。

EDIT:

Java Language Specificationは、そのフィールドの宣言がスーパークラスで同じ名前のフィールドのいずれかと、アクセス可能なすべての宣言を隠すために言われて、クラスは特定の名前を持つフィールドを宣言した場合」と言い、そのクラスのスーパーインターフェース "と呼びます。

"継承"は "コピー"を意味しません。子インスタンスに対して "say"メソッドを呼び出すときは、呼び出されるメソッドの "コードコピー"ではなく、親クラスのメソッドであり、親クラスで定義されています。また、親クラスは子変数メンバーについて何も知らない。

+0

"say"メソッドは親クラスにありますが、子クラスにも継承されていることに同意します。子クラスのメンバー変数を出力しないでください。 – Manish

0

あなたの子クラスは拡張親クラスの機能です! childクラスからsayメソッドを呼び出すと、親クラスがメソッドを呼び出すため、子クラスはデフォルトでsayメソッドを持っています。これはvalue(親)です。代わりに "子"を印刷したい場合は、子クラスのsayメソッドをオーバーライドして、親クラスからそのデフォルトフィーチャーを変更する必要があります。

関連する問題