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类中,有一个同名的方法方法public final void Flipper()区别在于这个是公共的。所以我的问题是这个访问说明符如何涉及这里的覆盖?由于这个超类方法是私有的,我们可以在具有相同名称、相同参数、相同返回类型但不能覆盖的子类上使用它吗?

4

2 回答 2

1

它没有覆盖该方法。私有方法不是继承的,子类不能访问或可见。private同时拥有final一个方法是相当愚蠢的。

您的Clidlet类实际上并没有覆盖该方法 from Clidder,它只是定义了一个名为的新方法,该方法与 .in 中的方法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 回答