首页 文章

Access-specifier涉及覆盖子类?

提问于
浏览
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();
  }
}

在这里,超类中的方法 private final void flipper() 是一个最终方法,我们知道它们不能被它们的子类覆盖,因为它是最终的 .

Clidlet 类中有一个同名的方法方法 public final void flipper() 区别在于这一个是公共的 . 所以我的问题是这个访问说明符如何涉及覆盖在这里?因为这个超类方法是私有的,我们可以在具有相同名称,相同参数,相同返回类型但不能覆盖的子类上使用它吗?

2 回答

  • 0

    它没有超越方法 . 私有方法不是继承的,并且不能由子类访问或对子类可见 . 在方法上同时使用 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();
      }
    
    }
    

    这是他们放入那本书的一个非常糟糕的例子,除非它特别是没有访问基本私有方法的子类的例子 .

  • 1

    这不是一个实际的覆盖,子类只是声明一个碰巧具有相同名称的新方法;你只能这样做,因为父项中的方法是私有的,这意味着子类无法看到它,因此编译器不会混淆 .

    我找到了更详细的答案here .

相关问题