定义类 A 和类 B 如下:
class A {
int a = 1;
double d = 2.0;
void show() {
System.out.println("Class A: a=" + a + "\td=" + d);
}
}
class B extends A {
float a = 3.0f;
String d = "Java program.";
void show() {
super.show();
System.out.println("Class B: a=" + a + "\td=" + d);
}
}
(1) 若在应用程序的main方法中有以下语句:
A a=new A();
a.show();
则输出的结果如何?
(2) 若在应用程序的main方法中定义类B的对象b:
A b=new B();
b.show();
则输出的结果如何?
参考解答
输出结果为;
(1)
Class A: a=1 d=2.0
(2)
Class A: a=1 d=2.0
Class B: a=3.0 d=Java program.
解析:
下面的例子列出了更一般的的执行顺序:
public class Main{
public static void main(String[] args) {
A b=new B(); // 1. 开始执行对象的创建
b.show(); // 12. 开始调用对象的方法,根据多态特性调用B类中的show()的方法
} // 20. 结束
}
class A { // 4. 根据A的定义给新对象分配空间
static int x=1; // 2. 加载类对象A,初始化A的静态变量
int a = 1; // 5. 初始化成员变量
double d = 2.0; // 6. 初始化成员变量
public A() {} // 7. 调用父类A的构造
void show() { // 15. 执行该方法
System.out.println("Class A: a=" + a + "\td=" + d); // 16. 打印
} // 17. 返回
}
class B extends A { // 8. 根据B的定义继续给新对象分配空间
static int y=2; // 3. 加载类对象B,初始化B的静态变量
float a = 3.0f; // 9. 初始化成员变量
String d = "Java program."; // 10. 初始化成员变量
public B() {} // 11. 调用子类B的构造
void show() { // 13. 执行该方法
super.show();// 14. 执行父类的show()方法
System.out.println("Class B: a=" + a + "\td=" + d); // 18. 打印
} // 19. 返回
}