3

サブクラスの非静的メソッドを、静的なオーバーライドまたは非表示と同じもので再定義していますか?

http://docs.oracle.com/javase/tutorial/java/IandI/subclasses.htmlは非表示と言っています。しかし、スーパークラスメソッドをfinalとして宣言すると、オーバーライドエラーが発生します。

スーパークラス宣言は

final static void display() { ... }

サブクラス:

void display() { ... }

オーバーライドエラーが発生します。

4

5 に答える 5

7

サブクラスで非静的メソッドを再定義するのは、静的なオーバーライドまたは非表示と同じですが、すべて同じですか?

そうすることでコンパイルエラーが発生し、プログラムが無効になるため、どちらでもありません。

class A {
    void x();
}
class B extends A {
    // ERROR!!!
    static void x();
}

ペアの両方のメソッドが静的メソッドである場合、非表示が発生します。ペアの両方のメソッドがインスタンスメソッドである場合、オーバーライドが発生します。2つのうちの1つが静的メソッドで、もう1つがインスタンスメソッドである場合、Javaはそれをエラーと見なします。インスタンスメソッドがfinalであるかどうかは関係ありません。また、静的メソッドが基本クラスにあるか派生クラスにあるかは関係ありません。Javaはどちらの方法でもエラーと呼びます。

ただし、「オーバーライドできません」というコンパイラメッセージは誤解を招く可能性があります。「オーバーライド」は、2つのインスタンスメソッドがある状況で予約されているため、「名前の衝突」の方がこのような条件の名前として適していると思います。

于 2012-11-19T05:20:12.977 に答える
3

説明するメソッドはインスタンスメソッドであり、静的メソッドではありません。インスタンスメソッドを非表示にすることはできず、静的メソッドのみを非表示にすることができます。宣言されたインスタンスメソッドはfinalサブクラスでオーバーライドできません。これがあなたがやろうとしていることです。

于 2012-11-19T04:57:08.240 に答える
1

final static void display() { ... }

上記のメソッドには非アクセス修飾子 finalがあり、作成されたメソッドはfinal オーバーライドできません。

于 2012-11-19T05:35:00.520 に答える
0

最終的なメソッドをオーバーライドするにはどうすればよいですか。

最終メソッドは、サブクラスでオーバーライドすることはできません。

それがコンパイルエラーです。

于 2012-11-19T05:24:30.037 に答える
0

最終的なメソッドをオーバーライドすることはできません...

元:

class Super
{
  final void display()
  {
    //do something
  }

  void show()
  {
    //Do Something
  }
}


class Sub extends Super
{
  //Not Valid hence Compile Error
  void display()
  {
    //do something
  }

  //Valid
  void show()
  {
    //Do Something
  }
}
于 2012-11-19T05:24:34.387 に答える