class A {
void fun1() {
System.out.println(fun2());
}
int fun2() {
return 123;
}
}
public class B extends A {
int fun2() {
return 456;
}
public static void main(String args[]) {
B b = new B();
b.fun1();
A a = b;
a.fun1();
}
}作者: 哪颗最亮的星星 时间: 2013-8-6 09:57
首先:类B继承了类A并覆盖了类A的fun2方法,哪么不管是建立类A的对象还是类B的对象,运行时,都是走的子类方法,
B b = new B();
b.fun1();//走的子类中的fun2方法,打印456
A a = b;//这里用到的是多态,
a.fun1();//因为子类覆盖了父类的方法,所以走的还是子类的fun2,结果当然还是456
总之一句话:当子类覆盖父类方法时,哪么运行时,走的都是子类方法作者: 龚首道 时间: 2013-8-6 10:26
这里:“public class B extends A {
int fun2() {
return 456;
}
....”
你的B继承了A,但是在B里面,你复写了fun2()方法,
当你在主函数中B b = new B(); b调用了A里的fun1(),而fun1()又输出的是fun2()的返回值,
而你已经复写了fun2(),所以fun1()就去调用你复写后的fun2(),于是这里返回第一个456.
然后,a还是调用fun1(),fun1()还是调用了复写后的fun2()方法,返回还是456.
还有一点,我调试的时候,需要把“public class B extends A”前面的public去掉才可以。不知为何作者: 逆袭的风 时间: 2013-8-6 10:29 本帖最后由 逆袭的风 于 2013-8-6 10:33 编辑