4

一般的にオーバーライドは、サブクラスのメンバーの意味を再定義するという概念です.Javaでオーバーライドしている間、変数がメソッドのように動作しないのはなぜですか?
例えば:

class Base {

    int a = 10;

    void display() {
        System.out.println("Inside Base :");
    }
}

class Derived extends Base {

    int a = 99;

    @Override
    // method overriding
    void display() {
        System.out.println("Inside Derived :");
    }
}

public class NewClass {

    public static void main(String... a) {
        Derived d = new Derived();
        Base b = d;
        b.display(); // Dynamic method dispatch
        System.out.println("a=" + b.a);
    }
}

データメンバはパッケージアクセス指定なので、クラスaでも利用可能です。Derivedしかし、通常、基本クラスの参照を使用してオーバーライドされたメソッドを呼び出している間、派生クラスで再定義されたメソッドが呼び出されます (動的メソッド ディスパッチ)..しかし、変数については同じではありません..なぜ.?

期待される出力

内部派生:
a=99

得られた出力:

内部派生:
a=10

出力 10 - 変数が派生クラスのメソッドと同様に動作しないのはなぜですか?
サブクラスで変数をオーバーライドできないのはなぜですか?

4

10 に答える 10

1

この場合、getter メソッドを作成することをお勧めします。

public int getA(){
  return 99;
}

派生クラスでオーバーライドできるようになりました。

于 2013-06-19T21:08:21.503 に答える
0
  1. クラス変数をオーバーライドしません。メソッドのみ。
  2. 変数値が更新または置換されたことを確認したい場合は、「int」ではなく「static int」として宣言する必要があります。このように、全員が同じ変数を共有しているので機能し、新しい値がそこに置かれます。
  3. 変数値が別の方法で割り当てられ、使用されていることを確認したい場合は、コンストラクターでパラメーターを渡すように設計するか、同様のものを設計して、必要に応じて機能させることができます。

さらに、変数がオーバーライドされた場合、それ自体の親クラスに何が残るか、Java が親クラスの変数の値を変更するアクセス権を与える場合、クラス セキュリティに違反します。

于 2013-07-21T03:32:10.700 に答える
0

OOP (オブジェクト指向プログラミング) では、オブジェクト内のデータを非表示にし、オブジェクトが呼び出し元のメソッドとのみ通信できるようにするという考え方があります。そのため、変数をオーバーロードできません。実際、変数は特定のクラスに「スコープ」/「アタッチ」されています。

また、派生クラスは a を再度定義するべきではありません。基本クラスで既に定義されているため、オブジェクトに a を目的の値に設定するだけです。たとえば、次のようになります。

class Base {
    private int a = 10;
    public int getA() { return a; }
    public void setA(inta) { this.a = a; }
}

class Derived extends Base {
    // adding new variables, override methods, ...
}

// then later:

Derived d = new Derived();
d.setA(99); // override the default value 10
于 2013-06-19T22:52:20.197 に答える