14

scjp の質問を調査しているときに、この動作に遭遇しましたが、これは奇妙でした。

次のように、Item と Bolt の 2 つのクラスを宣言しました。

class Item {
    int cost = 20;

    public int getCost() {
        return cost;
    }
}

class Bolt extends Item {
    int cost = 10;

    public int getCost() {
        return cost;
    }
}

cost の値に 2 回アクセスしようとしました

public class Test {
    public static void main(String[] args) {
        Item obj = new Bolt();
        System.out.println(obj.cost);
        System.out.println(obj.getCost());
    }
}

得られる出力は 20 10 です。これがどのように起こるのか理解できません。

4

2 に答える 2

19

objは型の参照であるため、フィールドの値が20でItemあるため、最初の 20です。costItem10objBoltgetCost()getCostBoltBoltItem

つまり、ランタイム ポリモーフィズムはインスタンス メンバー (メソッドのオーバーライド) にのみ適用され、インスタンス フィールドには適用されません。

于 2011-08-02T07:05:38.030 に答える
7

クラス フィールドはポリモーフィズム ゲームに参加しません。メソッドはそうです。

したがって、フィールドにアクセスすると、オブジェクトのタイプが であるため、基本クラスで定義されているフィールドに移動しますItem。メソッドを呼び出すと、ポリモーフィズムを使用してメソッドを呼び出すため、実際の値が取得されます。

結論:

フィールドは常に非公開です。フィールド書き込みメソッドにアクセスしたい場合。

于 2011-08-02T07:08:27.140 に答える