1

java で変数をオーバーライドできない理由、それは変数を非表示にします

class A {
    int a = 4;
    public void test(){
        System.out.println("Test method of A" );
    }
} 

class B extends A {
    int a = 5;
    public void test(){
        System.out.println("Test method of B" );
    }
    public static void main(String s[]){
        A a= new B();
        System.out.println("Value of a : " a.a );
        System.out.println("Method result " a.test() );
    }
} 

出力::

Value of a : 4
Mthod result :Test method of B

B のクラス テスト メソッドが呼び出されたが、変数がスーパー クラス参照からアクセスされたため

4

3 に答える 3

4

これがJavaの仕組みです。コードにBがあり、「Aがあることを知っている」だけの場合、Bのメソッドは呼び出されますが、Aの変数にアクセスします(変数に「同等のメソッドをオーバーライドするメソッド」がないため)。変数を公開するのではなく、ゲッターとセッターでラップすることをお勧めします。これにより、ゲッターとセッターをオーバーライドすることで、サブクラスでの変数の動作を制御できます。

于 2013-02-06T05:55:32.483 に答える
0

親クラスの変数にアクセスする場合は、
System.out.println( ((A)a).a );
Type を使用してオブジェクトをその親にキャストしてからアクセスします

于 2013-02-06T06:00:55.213 に答える
0

タイプ A のパラメーターを受け入れるメソッドがあるとします。

void f(A a) {
     // do something with a.a
}

メソッドの作成者は、fクラス A で定義された動作を想定してこのメ​​ソッドを作成しました。この動作を変更したいとします。メソッドをオーバーライドすると、動作が変更される場合と変更されない場合があり、変更すべきではありません。他の機能を追加することはできますが、期待される動作を変更することはできません。変数をオーバーライドできれば、動作は確実に変更されます。オブジェクト指向設計のオープン/クローズおよびリスコフ置換 原則を確認する

于 2013-02-06T06:14:04.427 に答える