混淆“覆盖私有方法”

时间:2009-08-28 10:38:09

标签: java override private

我对此代码有两个问题

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()”

3 个答案:

答案 0 :(得分:24)

  1. main方法位于类Override内,因此可以看到类Override的私有成员。

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

  3. 请注意,类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不同。作为您的实例!