static
できることとできないことを確認するために、継承をいじっていました。以前に読んだことがありますが、静的メソッドは上書きできず、単に非表示にすることができます。そのため、静的メンバーに適用されるものを確認しようとしました。簡単なテスト コードを次に示します。
public class ParentClass {
public static String x;
{ x = "In ParentClass"; }
}
public class ChildClass extends ParentClass {
{ x = "In ChildClass"; }
}
オブジェクトから呼び出された x を印刷すると、すべてが期待どおりに進みました。
ParentClass parentClassReference = new ParentClass();
System.out.println(parentClassReference.x); // prints: "In ParentClass"
parentClassReference = new ChildClass();
System.out.println(parentClassReference.x); // prints: "In ChildClass"
子クラス オブジェクトから x への些細な呼び出しでさえ:
ChildClass childClassReference = new ChildClass();
System.out.println(childClassReference.x); // prints: "In ChildClass"
今、私が静的メンバーを呼び出すと、それが行われることになっているように、それは奇妙になります:
System.out.println(ChildClass.x); // prints: "In ChildClass" (Ok, so far.)
System.out.println(ParentClass.x); // prints: "In ChildClass" (This is unexpected.)
この動作については説明がありません。オーバーライドと非表示 (Code Ranch)のコンテキストでは、オブジェクトを介した呼び出しは期待どおりに機能しない可能性が高いように思われましたが、クラス名を介した呼び出しは機能するはずです。
私は混乱しています。誰が助けることができますか?