2016-08-31 11 views
-1
class Test { 
public static final String FOO = "foo"; 
public static void main(String[] args) { 
Test b = new Test(); 
Sub s = new Sub(); 
System.out.print(Test.FOO);   /* Prints foo */ 
System.out.print(Sub.FOO);   /* Prints bar */ 
System.out.print(b.FOO);    /* Prints foo */ 
System.out.print(s.FOO);    /* Prints bar */ 
System.out.print(((Test)s).FOO);  /* Prints foo but Why?*/ 
} } 
class Sub extends Test {public static final String FOO="bar";} 
私が継承について読んでいた

を使用するために、親クラスにサブクラスのオブジェクトをキャストし、私はあなたが親クラスにSUBクラスオブジェクトをキャストした場合にもいることが分かったとすることを使用してオーバーライドされたメソッドを呼び出そうオブジェクト(here参照)では、SUBCLASSメソッドが呼び出されます。FINALフィールドを継承し、それを

しかし、ここで私の質問では、オブジェクトの種類がClass Subの場合でも親クラスの変数値が印刷されています。

+2

使用 '最終static'変数をオーバーライドすることはできません – Jens

+0

はい、あなたは正しいです。しかし、なぜ最後のSystem.out.printはbarでない "foo"を表示しますか? – user3196835

+0

親クラスの値であるため、オーバーライドできません – Jens

答えて

4

スタティックメンバーは、<expression>.staticMemberを使用する場合は、スタティックメンバーを参照するために使用される式の種類によって解決されます。

この場合、((Test)s)はタイプTestの式です。このため、Test.FOO((Test)s).FOOで参照されています。

インスタンスを使用して静的メンバーを参照することは悪い習慣であることに注意してください。これは混乱の原因になるだけです。常に<ClassName>.staticMemberは混乱のこの種のを回避使用して、すなわち

Test.FOO 

または

Sub.FOO 
+0

それは疑いなくクリアされました。ありがとう! – user3196835

関連する問題