当前位置: 技术问答>java相关
有关初始化的问题!
来源: 互联网 发布时间:2015-02-15
本文导语: 有下列程序: class A { int a = f(); int f() { return 1; } } class B extends A { int b = 37; int f() { ...
有下列程序:
class A {
int a = f();
int f() {
return 1;
}
}
class B extends A {
int b = 37;
int f() {
return b;
}
}
public class CtorDemo4 {
public static void main(String args[]) {
B bobj = new B();
System.out.println(bobj.a);
System.out.println(bobj.f());
}
}
程序的输出是:
0
37
请问System.out.println(bobj.a)为何是0 ??
class A {
int a = f();
int f() {
return 1;
}
}
class B extends A {
int b = 37;
int f() {
return b;
}
}
public class CtorDemo4 {
public static void main(String args[]) {
B bobj = new B();
System.out.println(bobj.a);
System.out.println(bobj.f());
}
}
程序的输出是:
0
37
请问System.out.println(bobj.a)为何是0 ??
|
B bobj = new B();的执行过程是:
最先执行b=0;
接着a=f();
f()执行的是B的f(),返回b,此时b=0;
所以a=0;
再执行b=37;
初始化结束!
注意看看文章中的这个地方:
当一个对象被创建时,初始化是以下面的顺序完成的:
1. 设置成员的值为缺省的初始值 (0, false, null)
2. 调用对象的构造方法 (但是还没有执行构造方法体)
3. 调用父类的构造方法
4. 使用初始化程序和初始块初始化成员
5. 执行构造方法体
最先执行b=0;
接着a=f();
f()执行的是B的f(),返回b,此时b=0;
所以a=0;
再执行b=37;
初始化结束!
注意看看文章中的这个地方:
当一个对象被创建时,初始化是以下面的顺序完成的:
1. 设置成员的值为缺省的初始值 (0, false, null)
2. 调用对象的构造方法 (但是还没有执行构造方法体)
3. 调用父类的构造方法
4. 使用初始化程序和初始块初始化成员
5. 执行构造方法体
|
new B的时候先初试化a属性,f()被重载返回b,这时b还没有赋值,
所以默认为0,那么a得到0
所以默认为0,那么a得到0