A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

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();
    }
}

1 个回复

倒序浏览
答案(++++是我自己加的,为了看清两个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,实例初始化也是一样的.但是构造代码块会默认先于构造方法执行.



回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马