4


メソッドのオーバーライドはフィールドのオーバーライドとは異なる動作をすることに気づきました。次のスニペットを検討します。

public class Bar {
  int v =1;

  public void printAll(){
    System.out.println(v);
    printV();
  }

  public void printV(){
    System.out.println("v is " + v);
  }
}

public class Foo extends Bar {
  int v = 4;

  public static void main(String[] args) {
    Foo foo = new Foo();
    foo.printAll();
 }

 public void printV() {
   System.out.println("The value v is  " + v);
 }
}

結果は次のようになります
。1
値vは4です。

したがって、バーのメソッドprintVはfoo.printVによってオーバーライドされますが、フィールドvはバーで上書きされないようです。誰かがこの違いの理由を知っていますか?

ありがとう。

4

2 に答える 2

9

メソッドのオーバーライドはフィールドのオーバーライドとは異なる動作をすることに気づきました。

「フィールドのオーバーライド」などはありません。フィールドをシャドウすることはできますが、オーバーライドすることはできません。フィールドはポリモーフィックではありません。詳細については、Java言語仕様のセクション6.4.1を参照してください。

一般に、フィールドはとにかくほとんどの場合プライベートである必要があることに注意してくださいつまり、そもそもこれに気付かないでしょう。

于 2012-08-15T14:21:51.170 に答える
0

foo.printAll();を呼び出す場合 値1を出力している基本クラスの関数を呼び出しています。次にprintVを呼び出しています。今回は、継承されたクラスが同じ名前の関数を持っているため、オーバーライドされ、FooのprintVが呼び出されます。

vの値は、値を出力するクラスによって異なります。

于 2012-08-15T14:26:08.927 に答える