public class TestA {
TestA(){
System.out.println("P");
init();
}
void init() {
System.out.println("Q");
}
public static void main(String[] args) {
new TestB();
}
}class TestB extends TestA {
int i = 1;
TestB() {
super();
System.out.println(i + " ");
}
void init() {
i = 2;
}
}
写出执行结果
P
Q
1答案竟然是
P
1
为什么没打印Q呢!
i = 2;是赋值了,但是没有真是赋予TestB的i!
谁来解析下!
2.属性变量的初始化时序
init方法被TestB的重写了 B调用的是自己的init方法
在打印i时才初始化i=1 所以打印i 而不是2
debug跟踪了一下执行了TestB 类中的init()方法
继承陷阱真多
11.执行 TestA构造函数中的System.out.println("P")
2.执行TestB中的init()方法,执行的是重写的方法,又因为java中式值传递的,i值不变
3.执行System.out.println(i + " ");
abstract class A1 {
int i=1;
public void printI() {
System.out.println("i="+i);
}
}
public class B1 extends A1{
int i=2;
public static void main(String[] args) {
B1 b=new B1();
b.printI();
}
}打印结果...
难道在构造对象时,变量用的都是默认的初始值吗?程序员赋的值在new对象时不会付给变量(声明,这里的变量指的是类的属性,不是方法内的变量)
9楼正解1. super()注释掉不影响结果。2. i为1并不是因为init()的作用域小。而是因为init()在父类中调用。如果在super()和System.out.println之间加入一句:init(),则结果变成
P
2
不信就试一下。
在TestB中的init()中的i前加int
int i = 2;这样在super()和System.out.println之间加入一句:init(),则结果不会变成
P
2
了,还是
P
1
当看到结果的时候我也有了一个疑问,当然是我学习中的不足之处。Java会自动在导出类构造器中插入对基类构造器的掉用,
那为什么结果是p 1 呢,而不是 p p 1
abstract class A1 {
int i = 1; A1(int i) {
init(i);
printI();
} void init(int i) {
this.i = i;
} public void printI() {
System.out.println("i=" + i);
}
}public class B1 extends A1 {
int i = 2; B1() {
super(5);
} public void printI() {
System.out.println("*i=" + i);
} public static void main(String[] args) {
B1 b = new B1(); b.printI();
}
}打印结果:
*i=0
*i=2