黑马程序员技术交流社区
标题:
构造代码块,构造函数,静态代码块,静态变量,非静态变量顺序的证明
[打印本页]
作者:
coolmiao13
时间:
2015-2-16 18:02
标题:
构造代码块,构造函数,静态代码块,静态变量,非静态变量顺序的证明
这个很简单的证明,因为记性不好,老是把这些东西忘了,
看到一本书叫java入门到精通,里面的一段代码,改写一下,加入了构造代码块,并进行了简单说明
插入代码:
package ch01;
public class Test {
//静态变量
static String a = "string-a";
static String b;
//非静态变量
String c = "string-c";
String d;
//静态代码块
static {
printStatic("1");
b = "string-b";
printStatic("2");
}
public static void printStatic(String title){
System.out.println("-------"+title+"-------");
System.out.println("a=\""+a+"\"");
System.out.println("b=\""+b+"\"");
}
//构造代码块
{
print("3");
d = "string-d";
print("4");
}
//构造函数
public Test(){
print("5");
}
public void print(String title){
System.out.println("-------"+title+"-------");
System.out.println("a=\""+a+"\"");
System.out.println("b=\""+b+"\"");
System.out.println("c=\""+c+"\"");
System.out.println("d=\""+d+"\"");
}
public static void main(String[] args){
new Test();
}
}
复制代码
结果是这个:
-------1-------
a="string-a"
b="null"
-------2-------
a="string-a"
b="string-b"
-------3-------
a="string-a"
b="string-b"
c="string-c"
d="null"
-------4-------
a="string-a"
b="string-b"
c="string-c"
d="string-d"
-------5-------
a="string-a"
b="string-b"
c="string-c"
d="string-d"
小程序一枚,说明了构造代码块,构造函数,静态代码块,静态变量,非静态变量在实例化时运行的顺序。
顺序是:静态变量→静态代码块→非静态变量→构造代码块→构造函数。
以上,如果有问题希望指正。
作者:
关山明月
时间:
2015-2-16 21:33
学习,有心了
作者:
yueLife_1993
时间:
2015-2-16 22:50
学习学习。。。。
作者:
huangchunwei
时间:
2015-2-16 23:36
来学习学习。。
作者:
a410709560
时间:
2015-2-20 18:48
感谢分享
作者:
fantacyleo
时间:
2015-2-21 02:01
楼主的证明是错误的。初始化顺序确实很绕,其中的细节我一时也说不全,就提一点吧:静态变量/静态初始化块 的初始化顺序,并不是固定的,而是看在代码中出现的先后顺序。 实例变量/初始化块也是类似。因此,只要把楼主的代码顺序稍微一换,结果就不一样了:
public class Test {
//静态代码块
static {
printStatic("1");
b = "string-b";
printStatic("2");
}
//静态变量
static String a = "string-a";
static String b;
//非静态变量
String c = "string-c";
String d;
public static void printStatic(String title){
System.out.println("-------"+title+"-------");
System.out.println("a=\""+a+"\"");
System.out.println("b=\""+b+"\"");
}
//构造代码块
{
print("3");
d = "string-d";
print("4");
}
//构造函数
public Test(){
print("5");
}
public void print(String title){
System.out.println("-------"+title+"-------");
System.out.println("a=\""+a+"\"");
System.out.println("b=\""+b+"\"");
System.out.println("c=\""+c+"\"");
System.out.println("d=\""+d+"\"");
}
public static void main(String[] args){
new Test();
}
}
复制代码
输出变成:
-------1-------
a="null"
b="null"
-------2-------
a="null"
b="string-b"
这里静态初始化块在前,因此先执行静态初始化块。静态初始化块调用的printStatic函数用到了静态变量a、b,但只检查变量是否声明,而不进行初始化(代码顺序决定了此处静态变量初始化在静态初始化块之后),因此a、b都是null。接下来静态初始化块中对b进行了初始化,而a的初始化仍然没有执行,因此有了“---2---”的输出结果
PS 我无意贬低国产书,但IT方面的国产精品确实不多,初学者又难以分辨其中的错误。Java入门还是推荐Head First Java和Thinking in Java
作者:
BEIKOU
时间:
2015-2-21 07:31
学习学习
作者:
liu1098
时间:
2015-2-21 07:40
像楼主学习。
作者:
sofeel
时间:
2015-2-21 16:26
路过,加油!
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2