3

xスーパークラスのインスタンス変数にアクセスしたい。その構文が見つかりません。これは可能ですか?

public class SuperBoss {
    int x = 10;
}

public class Boss extends SuperBoss {
    int x = 2;

public static void main ( String[] args ) {
    Boss b = new Boss();
    System.out.println(b.x); //prints out 2, I want it to print out 10 
}

「スーパー」というキーワードを使用しようとしましたが、成功しませんでした。

4

6 に答える 6

4

in の宣言が inの宣言を隠し2いるため、出力されますint x = 2BossxSuperBoss

通常、superキーワードを使用してスーパークラスのフィールドに明示的にアクセスしますが、これはメイン メソッドのコンテキストpublicからは機能しません。staticスーパークラスの値を取得する小さなヘルパー関数を定義できますx

public class Boss extends SuperBoss {
    int x = 2;

    public int getSuperX() {
        return super.x;
    }

    public static void main ( String[] args ) {
       Boss b = new Boss();
       System.out.println(b.getSuperX()); //prints out 2, I want it to print out 10 
    }
}
于 2013-04-28T23:32:21.813 に答える
2

私が知る限り (詳細についてはおそらく JLS を調べる必要があります)、シャドウ化された非プライベート フィールドに を使用してアクセスすることは合法ですがsuper、インスタンス メソッド内からのみ可能です。だからあなたはこれを行うことができます:

public class Boss extends SuperBoss {

    int x = 2;

    int getSuperX() {
        return super.x;
    }

    public static void main (String[] args) {
        Boss b = new Boss();
        System.out.println(b.getSuperX());
    }

}
于 2013-04-28T23:39:10.997 に答える
1

クラスにgetSuperX()メソッドを追加します。Boss

public class Boss extends SuperBoss {

    int x = 2;

    public int getSuperX() {
        return super.x;
    }

    public static void main(String[] args) {
        Boss b = new Boss();
        System.out.println(b.getSuperX());
    }
}
于 2013-04-28T23:39:30.023 に答える
0

必要なことを行うには、スーパークラスで宣言する必要がありxprotectedサブクラスでオーバーライドしようとしないでください。

public class SuperBoss {
    protected int x = 10;
}

public class Boss extends SuperBoss {
    // int x = 2;

    public static void main ( String[] args ) {
        Boss b = new Boss();
        System.out.println(b.x);
    }
}

protectedただし、実際には、データの必要性はほとんどありません。これは、データとほぼ同じ数の問題を引き起こす可能性がありpublicます。より良いのは:

public class SuperBoss {
    private int x = 10;

    protected int getX() {
        return x;
    }
}

public class Boss extends SuperBoss {
    // int x = 2;

    public static void main ( String[] args ) {
        Boss b = new Boss();
        System.out.println(b.getX());
    }
}
于 2013-04-28T23:46:23.933 に答える
0

はい、方法はあります。フィールドにはコンパイル時のバインディングがあります。必要なのは、SuperBoss へのキャストです。

public class SuperBoss {
    int x = 10;
}

public class Boss extends SuperBoss {
    int x = 2;

    public static void main ( String[] args ) {
        Boss b = new Boss();
        System.out.println(((SuperBoss)b).x);
    }
}
于 2013-04-28T23:47:11.647 に答える
0

何が起こっているかというと、Bossのインスタンス変数が の同じ名前のインスタンス変数を隠しているということですSuperBoss。インスタンスを一時的にスーパータイプ クラスにキャストできます。

public static void main ( String[] args ) {
    Boss boss = new Boss();
    SuperBoss superBoss = boss;
    System.out.println(boss.x); //prints 2
    System.out.println(superBoss.x); //prints 10 
}

これはお勧めできません。カプセル化の理由から、インスタンス変数は表示されないようにする必要があります。非公開/保護する必要があります。そして、おそらく親クラスの変数と同じ名前を持つべきではありません。

于 2013-04-28T23:39:31.620 に答える