黑马程序员技术交流社区
标题:
下面代码的执行顺序如何?
[打印本页]
作者:
a461408739
时间:
2016-1-4 01:19
标题:
下面代码的执行顺序如何?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60 class A {
private static String staticStr = getStaticStr();
private String str = getStr();
static {
System.out.println("A的静态块");
}
{
System.out.println("A的实例块");
}
public A() {
System.out.println("A的构造方法");
}
private static String getStaticStr() {
System.out.println("A的静态属性初始化");
return null;
}
private String getStr() {
System.out.println("A的实例属性初始化");
return null;
}
}
class B extends A {
private static String staticStr = getStaticStr();
private String str = getStr();
static {
System.out.println("B的静态块");
}
{
System.out.println("B的实例块");
}
public B() {
System.out.println("B的构造方法");
}
private static String getStaticStr() {
System.out.println("B的静态属性初始化");
return null;
}
private String getStr() {
System.out.println("B的实例属性初始化");
return null;
}
public static void main(String[] args) {
new B();
new B();
}
}
作者:
z.qi
时间:
2016-1-4 04:07
答案(++++是我自己加的,为了看清两个new的不同):
A的静态属性初始化
A的静态块
B的静态属性初始化
B的静态块
A的实例属性初始化
A的实例块
A的构造方法
B的实例属性初始化
B的实例块
B的构造方法
+++++++++
A的实例属性初始化
A的实例块
A的构造方法
B的实例属性初始化
B的实例块
B的构造方法
解释:
1,问题涉及静态初始化,实例初始化,构造方法初始化顺序.原则是静态>实例>构造.
bty,如果静态中又new了个对象,则先要执行完此对象的3个初始化,在回来继续静态实例构造的顺序.
2.静态初始化只只执行一次(第一次加载).
与之对比,每次创建实例的时候,都会执行构造代码块 +与之对应的构造方法.(此题中没有构造代码块).
3静态代码块和静态成员的顺序同级,取程序中的先后顺序. 此题静态成员变量先于静态代码块的位置,所以显示静态属性初始化高于静态代码块.如果注释掉A和B的第一行,则会显示静态代码块优先.
bty,实例初始化也是一样的.但是构造代码块会默认先于构造方法执行.
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2