4

我正在阅读“Thinking in 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();
     }
}

打印:

在青蛙

4

3 回答 3

12

你没有覆盖它,你只是用一个同名的新方法 隐藏它。

如果你没有创建一个新print()方法,你的Frog类就不会有一个。

于 2013-03-24T18:52:58.047 回答
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
    }
}

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

于 2013-03-24T18:57:47.820 回答
0

您可以简单地编写一个private方法,subclass但它不会被覆盖。但它仍然遵循用于覆盖的访问修饰符规则

如果您在方法为私有时使方法更宽access modifier(默认、受保护、公共),则编译器会显示错误。它遵循压倒一切的规则,但实际上并没有覆盖。superclasssubclass's

于 2013-03-24T19:32:10.340 回答