我对此代码有两个问题
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;
的引用上看到函数f2)为什么输出“private f()”
答案 0 :(得分:24)
main
方法位于类Override
内,因此可以看到类Override
的私有成员。
您在课程f
中不重写方法Derived
,没有多态性。变量po
的类型为Override
,因此它将从类f
中获取方法Override
。
请注意,类f
中的方法Override
在类Derived
中根本不可见。类f
中的方法Derived
是一种不同的方法,与超类中的方法f
没有任何关系。
答案 1 :(得分:2)
Override po = new Derived();
po.f();
您正在访问Override自己的方法,即使该对象是派生的,因为根据范围规则,类的私有成员被认为是第一个,并且因为它在Override范围内写入它引用私有f,并且因为它的私有根本没有在Derived类中重写,只有在方法签名相同时才会覆盖它们。
Derived po = new Derived();
po.f();
Thsi是正确的代码,它将调用Derived的f
答案 2 :(得分:0)
方法的重写有三个条件.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不同。作为您的实例!