作者: 何小红 时间: 2012-10-2 15:39
调用子类的,因为子类的方法已将父类的覆盖了。
class A {
void fun1() {
System.out.println(fun2());
}
int fun2() {
return 123;
}
}
class B extends A {
int fun2() { //复写父类A中的fun2()方法
return 456;
}
public static void main(String argv[]) {
A a;
B b = new B();
b.fun1(); //覆盖之后调用子类中被覆盖的方法,输出456
a = b; //父类引用指向子类对象
a.fun1(); //多态 输出456
}
} 作者: 何小红 时间: 2012-10-2 15:40
这是另外一个例子,我们曾经做过的,和你的一样,贴上看下哈
输出结果为: 456作者: 申俊伟 时间: 2012-10-2 17:12
public class lok {
public static void main(String[] args) {
B a = new B();//创建对象要注意程序执行的过程,当创建对象时首先通过super()调用父类构造函数初始化,给你的a值赋值为0,然后调用输出为0,接下来调用你的B类构造函数输出20.
}
}
class A {
int a = 10;
A() {
print(); //此处是调用子类的还是父类的?
}
void print() {
System.out.println(a);
}
}
class B extends A {
int a = 20;//成员变量与超类变量同名,父类变量被隐藏,由于父类a被隐藏,所以在第一步输出0,而子类的a为20.