13

我对此代码有两个问题

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) 函数 f 如何在 Override po 的引用上可见;

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

4

3 回答 3

24
  1. main方法在类内部Override,所以当然可以看到类的私有成员Override

  2. 不是f在类中覆盖方法Derived,没有多态性。变量的类型poOverride,所以它会f从类中获取方法Override

请注意, class 中的方法f在 classOverride中根本不可见Derivedf类中的方法Derived是另一种方法,与超类中的方法没有任何关系f

于 2009-08-28T10:40:35.430 回答
2
Override po = new Derived();
po.f();

即使对象是派生的,您也正在访问 Override 自己的方法,因为根据范围规则,首先考虑类的私有成员,并且由于它写在 Override 的范围内,它引用了私有 f,并且由于它的私有它没有被覆盖派生类,它们只会在方法签名相同的情况下覆盖。

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

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

于 2009-08-28T10:49:45.537 回答
0

方法的覆盖有三个条件,子类必须和父类同名、同参数、同返回值。但是如果参数和返回值都不同,那么覆盖是不存在的!即使这两个方法是不同的方法!好的!像这样:

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.As 类中的方法 addV 不同!

于 2009-08-28T12:54:27.560 回答