Java クラス変数オーバーライドの難問
次の Java コード スニペットを考えてみましょう:
<br>classお父さん{</p> <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">protected static String me = "dad"; public void printMe() { System.out.println(me); }
}
クラス 息子がお父さんを拡張 {
protected static String me = "son";
}
public void doIt() {
new Son().printMe();
}
このコードは、「Dad」クラスと「Son」クラスの両方で「me」という名前のクラス変数を定義しているようです。 「doIt()」を呼び出すと、「Son」は「Dad」のサブクラスであるため、コードが「son」を出力することを期待するかもしれません。しかし、これは起こりません。
なぜ "doIt()" は "dad" を出力するのですか?
Java では、クラス変数をオーバーライドできません。代わりに、それらは隠されます。具体的には、サブクラス内で既存の名前を持つクラス変数を宣言すると、サブクラスは継承されたクラス変数を非表示にし、同じ名前で親クラスとは異なる新しいクラス変数を事実上作成します。
オーバーライドvs. 非表示
オーバーライドには、スーパークラスのメソッドをオーバーライドするサブクラスのメソッドに別の実装を提供することが含まれます。対照的に、非表示では、サブクラスで同じ変数名を使用しますが、スーパークラスから継承した変数を非表示にし、サブクラスに対してローカルな新しい変数を作成します。
「son」を出力する方法?
「son」を出力するという望ましい動作を実現するには、クラス変数をオーバーライドすることはできません。代わりに、次のような他の継承手法を使用できます。
コンストラクター引数を使用した例:
<br>public class person {</p> <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">private String name; public Person(String name) { this.name = name; } public void printName() { System.out.println(name); }
}
この例では、クラス「person」に名前を設定するコンストラクターがあります。これにより、「人」のサブクラスを作成し、名前に特定の値を渡すことができます。
以上がJava の静的変数の継承により予期しない結果が生じるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。