日期:2014-05-20  浏览次数:20721 次

一个程序和一个问题
public class Polymorphism2 {

public static void main(String[] args) {
A ref1 = new C();
B ref2 =(B) ref1;
System.out.println(ref2.g());
}
}
class A {
private int f() {return 0;}
public int g() {return 3;}
}
class B extends A {
private int f() {return 1;}
public int g() {return f();}
}
class C extends B {
public int f() {return 2;}
}
结果是1,为什么我觉得是2?
还有就是静态方法的隐藏和普通方法的覆盖有什么区别?

------解决方案--------------------
B ref2 =(B) ref1; ref2是个B的对象,所以首先查看B类有没有g(),有的话就调用B的g(),所以输出是1,没有的话就
查看父类有没有,有的话调用父类的,但不能调用其没有的但子类有的方法!
------解决方案--------------------
A ref1 = new C();的效果是A类创建了一个C类的对象,
B ref2 =(B) ref1;的效果是将ref1这个对象强转成B类
B中的方法g()可以覆盖A类中的方法g()
但B中的方法f()不可以,因为父类f()中的方法是私有的,所以调用B类中的方法返回1.
至于你的第二个问题中静态方法的隐藏,不好意思不知道你指的什么意思