ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
### [陷阱:“重写”私有方法](https://lingcoder.gitee.io/onjava8/#/book/09-Polymorphism?id=%e9%99%b7%e9%98%b1%ef%bc%9a%e9%87%8d%e5%86%99%e7%a7%81%e6%9c%89%e6%96%b9%e6%b3%95) 你可能天真地试图像下面这样做: ~~~ // polymorphism/PrivateOverride.java // Trying to override a private method // {java polymorphism.PrivateOverride} package polymorphism; public class PrivateOverride { private void f() { System.out.println("private f()"); } public static void main(String[] args) { PrivateOverride po = new Derived(); po.f(); } } class Derived extends PrivateOverride { public void f() { System.out.println("public f()"); } } ~~~ 输出: ~~~ private f() ~~~ 你可能期望输出是**public f()\*\*,然而 \*\*private**方法可以当作是**final**的,对于派生类来说是隐蔽的。因此,这里**Derived**的`f()`是一个全新的方法;因为基类版本的`f()`屏蔽了**Derived**,因此它都不算是重写方法。 结论是只有非**private**方法才能被重写,但是得小心重写**private**方法的现象,编译器不报错,但不会按我们所预期的执行。为了清晰起见,派生类中的方法名采用与基类中**private**方法名不同的命名。 如果使用了`@Override`注解,就能检测出问题: ~~~ // polymorphism/PrivateOverride2.java // Detecting a mistaken override using @Override // {WillNotCompile} package polymorphism; public class PrivateOverride2 { private void f() { System.out.println("private f()"); } public static void main(String[] args) { PrivateOverride2 po = new Derived2(); po.f(); } } class Derived2 extends PrivateOverride2 { @Override public void f() { System.out.println("public f()"); } } ~~~ 编译器报错信息是: ~~~ error: method does not override or implement a method from a supertype ~~~