1

これは SCJP 6 本のコードです:

    private final void flipper() {
    System.out.println("Clidder");
  }
}

public class Clidlet extends Clidder {

  public final void flipper() {
    System.out.println("Clidlet");
  }

  public static void main(String[] args) {
    new Clidlet().flipper();
  }
}

ここで、スーパークラスのプライベートファイナルボイドフリッパー()メソッドはファイナルメソッドであり、ファイナルであるため、サブクラスによってオーバーライドできないことがわかっています。

Clidletクラスには、同じ名前のメソッド method がありますpublic final void Flipper()違いは、これが public であることです。だから私の質問は、このアクセス指定子がここでオーバーライドをどのように含むのですか? このスーパークラスメソッドはプライベートであるため、同じ名前、同じ引数、同じ戻り値の型を持つサブクラスで使用できますが、オーバーライドとしては使用できませんか??

4

2 に答える 2

1

メソッドをオーバーライドしていません。プライベート メソッドは継承されず、サブクラスからアクセスしたり、サブクラスから参照したりできません。メソッドに と の両方を持つprivatefinalは、かなりばかげています。

あなたのClidletクラスは からそのメソッドを実際にオーバーライドするのではなく、のメソッドとは関係のないClidder名前の新しいメソッドを定義するだけです。flipper()Clidder

これがまさに@Overrideキーワードが存在する理由です。これを使用すると、このような微妙なエラーを防ぐことができます。たとえば、次のコードはflipper()実際には何もオーバーライドしていないため、コンパイルに失敗します。

public class Clidlet extends Clidder {

  @Override public final void flipper() {
    System.out.println("Clidlet");
  }

  public static void main(String[] args) {
    new Clidlet().flipper();
  }

}

サブクラスがベースのプライベート メソッドにアクセスできないという具体的な例でない限り、これは彼らがその本に載せた非常に貧弱な例です。

于 2013-11-04T06:59:03.377 に答える
0

これは実際のオーバーライドではありません。子クラスは、たまたま同じ名前を持つ新しいメソッドを宣言しているだけです。親のメソッドがプライベートであるため、これを行うことができます。つまり、子クラスはそれを見ることができないため、コンパイラが混乱することはありません。

ここでより詳細な回答を見つけました。

于 2013-11-04T07:01:19.317 に答える