有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Accessspecifier涉及重写子类中的?

这是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()是final方法,我们知道它们不能被它们的子类覆盖,因为它是final的

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


共 (2) 个答案

  1. # 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();
      }
    
    }
    

    对于他们来说,这是一个很糟糕的例子,除非它是一个子类无法访问基本私有方法的例子

  2. # 2 楼答案

    这不是一个实际的重写,子类只是声明一个新方法,该方法恰好具有相同的名称;您只能这样做,因为父类中的方法是私有的,这意味着子类无法看到它,因此编译器不会感到混淆

    我找到了更详细的答案