0

与えられた:

public class Base {
    public static final String FOO = "foo";
    public static void main(String[] args) {
        Base b = new Base();
        Sub s = new Sub();
        System.out.print(Base.FOO);       // <- foo
        System.out.print(Sub.FOO);        // <- bar
        System.out.print(b.FOO);          // <- foo
        System.out.print(s.FOO);          // <- bar
        System.out.print(((Base)s).FOO);  // <- foo
    } 
}

class Sub extends Base {
    public static final String FOO="bar";
  }

私の疑問は、8行目と9行目で参照変数を使用してクラスの静的メンバーにアクセスしていることです...それは可能ですか? 静的メンバーはクラス名のみでアクセスされるため...間違っているところを修正してください。

4

5 に答える 5

5

オプションDに行きます。

静的メンバーは、実際の型ではなく、宣言された型を使用してコンパイル時に解決されます。

オブジェクトが. ((Base)s).FOO)_Base.FOOSub

これは、次の例でも発生します。

Base b = new Sub(); // valid
System.out.print(b.FOO); // foo

Hereは、インスタンスが であるにもかかわらず、宣言された型のために をb.FOO参照します。Base.FOOSub

于 2013-09-18T14:56:09.150 に答える
3

出来ますか?

はい、可能ですが、良い習慣ではありません。基本的に、フィールドの静的メンバーへのアクセスは、コンパイル時にフィールドの宣言された型へのアクセスとして解決されます。

たとえば、次の場合でも問題なく動作します。

class Test {
    public static String hello = "Hello";
}

Test test = null;
System.out.println(test.hello);

NPE最初に見たときに予想されるように、print ステートメントは をスローしません。アクセスは事実上次のように解決されるためです。

Test.hello

の宣言型はtestであるTestため、アクセスはこのように解決されます。


静的フィールドへのアクセスはコンパイル時に宣言された型を使用して解決されるため、静的メソッドの多態的な動作は見られません。静的メソッドをオーバーライドすることはできません。

于 2013-09-18T14:56:44.113 に答える
1

参照を介して静的変数にアクセスできます。しかし、通常、コンパイラから警告が表示されるはずです....

于 2013-09-18T14:59:45.470 に答える
1

静的メンバーは、インスタンスからもアクセスできます。

IMOは、誤解を招く/コミュニケーションが取れないため、悪い習慣です。

実際、null参照を使用できます。

Base base = null;
System.out.println(base.FOO);
于 2013-09-18T14:56:53.963 に答える