混淆“覆盖私有方法”

我对这段代码有两个问题

public class Override { private void f() { System.out.println("private f()"); } public static void main(String[] args) { Override po = new Derived(); po.f(); } } class Derived extends Override { public void f() { System.out.println("public f()"); } } /* * Output: private f() */// :~ 

1)如何在Override po的引用上看到函数f;

2)为什么输出“private f()”

  1. main方法是在类Override ,所以当然它可以看到类Override的私有成员。

  2. 没有在类Derived重写方法f ,没有多态。 变量po的类型是Override ,因此它将从类Override获取方法f

请注意,类Override中的方法fDerived类中根本不可见。 Derived类中的方法f是一种不同的方法,与超类中的方法f没有任何关系。

 Override po = new Derived(); po.f(); 

您正在访问Override自己的方法,即使该对象是派​​生的,因为根据范围规则,类的私有成员被认为是第一个,并且因为它在Override范围内写入它引用私有f,并且因为它的私有它不被覆盖在派生类,只有在方法签名相同时才会覆盖它们。

 Derived po = new Derived(); po.f(); 

Thsi是正确的代码,它将调用Derived的f

方法的重写有三个条件.child类必须具有相同的名称和参数,并返回值作为其超类。但是如果参数和返回值都变化,则覆盖不存在!即使两个方法都是不同的方法!好的!像这样:

 public class Parent { public int addV(int a,int b){ int s; s = a + b; return s; } } class Child extends Parent{ public void addV(){ //do...something } } 

Eclipse不会说错误! 因为类Child中的方法addV与类Parent中的方法addV不同。作为您的实例!