public class Person {
public Person(int id) {
System.out.println("person(" + id + ")");
}
public static void main(String[] args) {
Build b = new Build();
}
}
class Build {
Person p1 = new Person(1);
public Build() {
System.out.println("this is build's block!");
Person p2 = new Person(2);
}
Person p3 = new Person(3);
} 为什么输出的是这个?
person(1)
person(3)
this is build's block!
person(2)main方法 第一句是 Build b = new Build();
应该先执行 Build的无参构造方法啊
public Person(int id) {
System.out.println("person(" + id + ")");
}
public static void main(String[] args) {
Build b = new Build();
}
}
class Build {
Person p1 = new Person(1);
public Build() {
System.out.println("this is build's block!");
Person p2 = new Person(2);
}
Person p3 = new Person(3);
} 为什么输出的是这个?
person(1)
person(3)
this is build's block!
person(2)main方法 第一句是 Build b = new Build();
应该先执行 Build的无参构造方法啊
解决方案 »
- 关于txt的
- 弱弱的问一个问题,conn,rs,stmt释放资源的问题
- Which methods guarantee that a thread will leave the running state
- JSP的中文问题
- 日期字符串"2007-2-1 11:23:04" 转换成 "Thu, 1 Feb 2007 11:23:04 +0800"
- 请各位帮一下忙!!!
- 如何读取UNIX下的文本文件
- 我是初学者,一个很奇怪的问题,请教大家~~
- 请问:在Jbuilder8中学习Applet的问题,谢谢!
- JAVA 连接Oracle数据库报错,连不上,求指点
- java中传一个list到jsp,用js循环list
- 新手请教关于线程的一个简单问题
这个不是成员变量啊, 是new出来的对象啊,
第一段是讲类变量的。
第二段将成员变量的。
看了上面这篇文章后,你就大致明白了。
你的代码在编译后会被JVM调整一下顺序。大致会优化成这个样子。 public class Person {
public Person(int id) {
System.out.println("person(" + id + ")");
}
public static void main(String[] args) {
Build b = new Build();
}
}
class Build {
Person p1 = null;
Person p3 = null; public Build() {
p1 = new Person(1);
p3 = new Person(3);
System.out.println("this is build's block!");
Person p2 = new Person(2);
}
}对于类中对成员变量的初始化和代码块中的代码全部都挪到了构造函数中,并且是按照java源文件的初始化顺序依次对成员变量进行初始化的,而原构造函数中的代码则移到了构造函数的最后执行。
所以就出来你这样的结果
的的确确 先执行main方法 第一句是 Build b = new Build();
但是 在new Build()会加载类Build的时候 会先执行 静态代码块和代码块,在执行相关方法。
父类--静态变量
父类--静态初始化块
子类--静态变量
子类--静态初始化块
父类--变量
父类--初始化块
父类--构造器
子类--变量
子类--初始化块
子类--构造器