覆盖私有方法

时间:2013-03-24 18:52:17

标签: java override final

我正在阅读“用Java思考”并且有疑问。在“重用类”一节的“最终和私有”一节中,它说私有方法不能被覆盖。但是,我在机器上试了一下。它实际上可以被覆盖。

这是代码

class Amphibian {
     private void print() { System.out.println("in Amphibian"); }
}

public class Frog extends Amphibian {
     public void print( System.out.println("in Frog"); }

     public static void main(String[] args) {
          Frog f = new Frog();
          f.print();
     }
}

3 个答案:

答案 0 :(得分:12)

您没有覆盖它,您只是使用具有相同名称的新方法隐藏它。

如果您没有创建新的print()方法,那么您的Frog课程就没有。

答案 1 :(得分:4)

为了说明覆盖和隐​​藏之间的区别,请考虑以下事项:

class Amphibian {
    private void print() { System.out.println("in Amphibian"); }
    public void callPrint() {
        /* 
         * This will DIRECTLY call Amphibian.print(), regardless of whether the
         * current object is an instance of Amphibian or Frog, and whether the
         * latter hides the method or not.
         */
        print(); // this call is bound early
    }
}

class Frog extends Amphibian {
    public void print() { System.out.println("in Frog"); }
    public static void main(String[] args) {
        Frog f = new Frog();
        f.callPrint(); // => in Amphibian

        // this call is bound late
        f.print(); // => in Frog
    }
}

不会调用“覆盖”(即隐藏)方法,父类中的方法会调用。这意味着它不是真正的覆盖。

答案 2 :(得分:0)

您只需在private中编写subclass方法,但不会被覆盖。但它仍然遵循用于覆盖的访问修饰符规则

如果access modifier方法是私有的,superclass方法中的subclass's(默认,受保护,公共)更宽,则编译器会显示错误。它遵循覆盖规则,但实际上不会覆盖。