0

これは、メソッドで呼び出している現在のオブジェクトを参照していると思ったので、混乱しています。
では、継承されたメソッドを呼び出したときに、オブジェクトのインスタンス変数 x が変更されなかったのはなぜでしょうか? スーパークラス:

public class SuperBoss 
{
  int x = 50;

  public void changeX()
  {
   this.x  = 20;
  }
}

サブクラス:

public class Boss extends SuperBoss
{
 int x = 10;
 public static void main(String[] args)
 {
  Boss b = new Boss();
  b.changeX();
  System.out.println(b.x); //prints 10
 }
}

20 ではなく 10 と表示されるのはなぜですか?

4

2 に答える 2

5

簡単な答え: フィールド アクセスは Java では仮想ではないためです。


SuperBoss は x を宣言します。

Boss が x を宣言すると、x は「仮想」フィールドにはならず、スーパークラスのフィールドから隠されている新しいフィールドになります。

SuperBoss のメソッドである Boss で changeX を呼び出すと、SuperBoss は Boss.x を認識せず、x へのアクセスは仮想ではないため、SuperBoss.x にアクセスするだけです。

x へのアクセスを仮想化する必要がある場合は、getX メソッドを提供し、Boss で getX メソッドをオーバーライドする必要があります。SuperBoss のメソッドが getX を呼び出すと、Boss の getX に再ルーティングされます。

于 2013-04-16T03:59:34.753 に答える
1

サブクラスで宣言すると、サブクラスを見ているint x = 10すべての人からスーパークラス変数が隠されます。

スーパークラスが呼び出すとき、this.xそれはサブクラスを参照していないため、独自のバージョンの変数を取得できます。

変数は実行時にコード名で実際に保存されるわけではないため、このように変数を再定義しても機能しませんSuperBoss#x。シンボル テーブル内の 1 つのシンボルにBoss#x解決され、別のシンボルに解決されるため、方法を知っていれば両方とも存在します。それらを取得します。

于 2013-04-16T04:02:19.863 に答える