混淆“覆盖私有方法”
我对这段代码有两个问题
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()”
-
main
方法是在类Override
,所以当然它可以看到类Override
的私有成员。 -
你没有在类
Derived
重写方法f
,没有多态。 变量po
的类型是Override
,因此它将从类Override
获取方法f
。
请注意,类Override
中的方法f
在Derived
类中根本不可见。 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不同。作为您的实例!