今天我们来分析一下静态代码块,构造代码块以及构造方法的执行顺序。静态代码块是随着类的加载而加载,构造代码块是在调用构造方法时,在构造方法之前调用。如果一个类中同时有这三个成员。则执行顺序一目了然。就是先执行静态代码块,然后是构造代码块,最后是构造方法。
运行结果就是我们分析的
如果在测试类中同时创建两个Student对象,就要注意了。因为我们的静态代码块是随着类的加载而加载。所以静态代码块只执行一次。所以在实际应用中,我们会在静态代码块中初始化驱动。
运行结果就是
接下来,我们分析一点复杂的,给测试类Demo也添加静态代码块和构造代码块
这里要注意我们main方法是静态的,所以根本不会走Demo测试类的构造代码块和构造方法。因为Demo测试类中的main方法是程序的入口,所以会先加载Demo类。所以会先执行Demo的静态代码块,然后就是main方法。在main方法中我们创建Student对象,所以要把Student类加载到内存。所以接下来会执行到Student的静态代码块,构造代码块和构造方法。
执行结果是:
[AppleScript]
纯文本查看
复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
package com.itheima;
public
class
Demo
{
public static void
main
(
String[] args
)
{
Student s
=
new
Student
(
)
;
}
}
class
Student
{
private String
name
;
private int age;
static
{
System.out.println
(
"我是静态代码块"
)
;
}
{
System.out.println
(
"我是构造代码块"
)
;
}
public Student
(
)
{
System.out.println
(
"我是无参构造"
)
;
}
public Student
(
String
name
,
int age
)
{
System.out.println
(
"我是有参构造"
)
;
this.
name
=
name
;
this.age
=
age;
}
}
|
运行结果就是我们分析的
[AppleScript]
纯文本查看
复制代码
1
2
3
|
我是静态代码块
我是构造代码块
我是无参构造
|
如果在测试类中同时创建两个Student对象,就要注意了。因为我们的静态代码块是随着类的加载而加载。所以静态代码块只执行一次。所以在实际应用中,我们会在静态代码块中初始化驱动。
[AppleScript]
纯文本查看
复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
package com.itheima;
public
class
Demo
{
public static void
main
(
String[] args
)
{
Student s
=
new
Student
(
)
;
Student s
1
=
new
Student
(
)
;
}
}
class
Student
{
private String
name
;
private int age;
static
{
System.out.println
(
"我是静态代码块"
)
;
}
{
System.out.println
(
"我是构造代码块"
)
;
}
public Student
(
)
{
System.out.println
(
"我是无参构造"
)
;
}
public Student
(
String
name
,
int age
)
{
System.out.println
(
"我是有参构造"
)
;
this.
name
=
name
;
this.age
=
age;
}
}
|
运行结果就是
[AppleScript]
纯文本查看
复制代码
1
2
3
4
5
|
我是静态代码块
我是构造代码块
我是无参构造
我是构造代码块
我是无参构造
|
接下来,我们分析一点复杂的,给测试类Demo也添加静态代码块和构造代码块
[AppleScript]
纯文本查看
复制代码
01
02
03
04
05
06
07
08
09
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
|
package com.itheima;
public
class
Demo
{
static
{
System.out.println
(
"我是Demo静态代码块"
)
;
}
{
System.out.println
(
"我是Demo构造代码块"
)
;
}
public Demo
(
)
{
System.out.println
(
"我是Demo无参构造方法"
)
;
}
public static void
main
(
String[] args
)
{
System.out.println
(
"Demo中的main方法"
)
;
Student s
=
new
Student
(
)
;
Student s
1
=
new
Student
(
)
;
}
}
class
Student
{
private String
name
;
private int age;
static
{
System.out.println
(
"我是Student静态代码块"
)
;
}
{
System.out.println
(
"我是Student构造代码块"
)
;
}
public Student
(
)
{
System.out.println
(
"我是Student无参构造"
)
;
}
public Student
(
String
name
,
int age
)
{
System.out.println
(
"我是Student有参构造"
)
;
this.
name
=
name
;
this.age
=
age;
}
}
|
这里要注意我们main方法是静态的,所以根本不会走Demo测试类的构造代码块和构造方法。因为Demo测试类中的main方法是程序的入口,所以会先加载Demo类。所以会先执行Demo的静态代码块,然后就是main方法。在main方法中我们创建Student对象,所以要把Student类加载到内存。所以接下来会执行到Student的静态代码块,构造代码块和构造方法。
执行结果是:
[AppleScript]
纯文本查看
复制代码
1
2
3
4
5
6
7
|
我是Demo静态代码块
Demo中的
main
方法
我是Student静态代码块
我是Student构造代码块
我是Student无参构造
我是Student构造代码块
我是Student无参构造
|