当前位置:编程学习 > JAVA >>

提问:构造代码块和构造函数哪个先执行?

构造代码块和构造函数哪个先执行? --------------------编程问答-------------------- 写个demo自己看吧 --------------------编程问答-------------------- 执行时间(快到慢):static{}(静态代码块)--》{}(构造代码块)-》构造函数 --------------------编程问答-------------------- 构造代码块中的代码也是在构造方法中执行的。在编译时的编译器看来会默认将构造代码块中的代码移动到构造方法中,并且移动到构造方法内容的前面。

public class TestCode {

public TestCode() {
System.out.println("构造方法");
}

{
System.out.println("代码块");
}

public static void main(String[] args) {
new TestCode();
}
}

相当于

public class TestCode {

public TestCode() {
System.out.println("代码块");
System.out.println("构造方法");
}

public static void main(String[] args) {
new TestCode();
}
}

你记住了这一点,以后在做很多关于用构造方法或代码块赋值的问题就明白了。 --------------------编程问答--------------------
引用 2 楼 nongzhenqin 的回复:
执行时间(快到慢):static{}(静态代码块)--》{}(构造代码块)-》构造函数

自己写个测试的程序试试就知道了 --------------------编程问答-------------------- 介绍你两个反编译软件,XJad,DJ Java Decompiler,发现构造代码块被移到构造方法中了,还有很多字符串操作,常量,等等,编译优化过的东西,通过反编译看代码,可以帮你理解过程,代码基本一样,不会反编译就和原来代码差很多,还可以看每行代码的指令,如果你了解java代码的指令集,你甚至可以不用写class,自己生产byte数组,在根据byte数组加载完全你自己设计的class类,百度搜一下,asm,cglib等 --------------------编程问答-------------------- 写个demo一看就明白
--------------------编程问答-------------------- 构造代码块会跟构造方法整合在一起,先执行构造代码块 --------------------编程问答-------------------- 我觉得当你问这样一个问题的时候、你果断应该是打开eclipse,然后敲上10几行代码,然后运行,答案就出来了。 --------------------编程问答-------------------- 顺序为:

父类的静态成员赋值和静态块 (静态块和静态成员的顺序为,谁在前面谁先执行(在不出错的情况下)
子类的静态成员和静态块 
父类的构造方法 
父类的成员赋值和初始化块 
父类的构造方法中的其它语句 
子类的成员赋值和初始化块 
子类的构造方法中的其它语句  --------------------编程问答-------------------- 写个demo  +1 --------------------编程问答-------------------- 构造代码块优先执行,然后执行构造方法。 --------------------编程问答-------------------- 就知道人们会说让你写个demo做实验,嗯,这也是我要说的…… --------------------编程问答-------------------- 附上一段 java编程思想的例子
java编程思想(第四版)130页 5.7.4非静态实例初始化。

package initialization;

//: initialization/Mugs.java
// Java "Instance Initialization."
import static net.mindview.util.Print.*;

class Mug {
Mug(int marker) {
print("Mug(" + marker + ")");
}

void f(int marker) {
print("f(" + marker + ")");
}
}

public class Mugs {
Mug mug1;
Mug mug2;
{
mug1 = new Mug(1);
mug2 = new Mug(2);
print("mug1 & mug2 initialized");
}

Mugs() {
print("Mugs()");
}

Mugs(int i) {
print("Mugs(int)");
}

public static void main(String[] args) {
print("Inside main()");
new Mugs();
// print("new Mugs() completed");
// new Mugs(1);
// print("new Mugs(1) completed");
}


--------------------编程问答-------------------- 我……


自己写下测测,分分钟的事,怎么还要来这里问 --------------------编程问答--------------------
引用 3 楼 ifvlr 的回复:
构造代码块中的代码也是在构造方法中执行的。在编译时的编译器看来会默认将构造代码块中的代码移动到构造方法中,并且移动到构造方法内容的前面。

public class TestCode {

public TestCode() {
System.out.println("构造方法");
}

{
System.out.println("代码块");
}

public static void main(String[] args) {
new TestCode();
}
}

相当于

public class TestCode {

public TestCode() {
System.out.println("代码块");
System.out.println("构造方法");
}

public static void main(String[] args) {
new TestCode();
}
}

你记住了这一点,以后在做很多关于用构造方法或代码块赋值的问题就明白了。

这是错误的,构造块是在构造方法之前执行的,程序运行是看起来和实际上是不同的 --------------------编程问答-------------------- 好多分歧啊... --------------------编程问答-------------------- 楼主意思应该是类初始化,先代码块,再构造函数
补充:Java ,  Java SE
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,