目录
一、知识基础
1.静态块:
-
static{
-
System.out.
println(
"This is a 静态块");
-
}
- 执行时间:类加载时只执行一次,时间上优先于主函数 ;
- 存储区域:静态代码块中声明的变量或对象以及静态变量和对象的句柄存在于方法区中;
2.普通块:
-
{
-
System.out.
println(
"This is a 普通块");
-
}
- 执行时间:每次new对象时运行,会先执行普通块, 再执行构造方法;
- 执行目的:普通块用于统一初始化所有该类对象,构造函数用于初始化当前对象;
3. 变量和赋值是拆分执行的:即先执行句柄信息声明变量,再执行赋值语句;看这个例子输出啥?
-
public
class
StudentLink {
-
-
{
-
System.
out.println(
this.n);
-
n=
100;
-
System.
out.println(
this.n);
-
}
-
-
private
int n =
99;
-
-
public static void main(String[] args) {
-
StudentLink test =
new StudentLink();
-
System.
out.println(test.n);
-
}
-
}
输出:
0 100 99
二、魔鬼实战
然后基于上面的规律,看懂这个例子:
-
package com.myr.test;
-
-
public
class
InitializeDemo {
-
-
private
static
int k =
1;
-
private
static InitializeDemo t1 =
new InitializeDemo(
"t1");
-
private
static InitializeDemo t2 =
new InitializeDemo(
"t2");
-
private
static
int i = print(
"i");
-
-
static{
-
print(
"静态块");
-
n=
100;
-
}
-
-
private
static
int n =
99;
-
{
-
print(
"枸造块");
-
j=
100;
-
}
-
-
private
int j = print(
"j");
-
-
public static int print(String str) {
//静态方法只有调用的时候才执行
-
System.
out. println((k++) +
":"+ str +
" i="+i+
" n="+ n);
-
++n;
-
return ++i;
-
}
-
-
public InitializeDemo(String str) {
-
System.
out.println((k++) +
":"+ str+
" i="+i+
" n="+ n);
-
++i;
-
++n;
-
}
-
-
public static void main(String[] args) {
-
InitializeDemo n =
new InitializeDemo(
"初始化");
-
}
-
}
输出:
-
1
:枸造块 i=
0 n=
0
-
2
:j i=
1 n=
1
-
3
:t1 i=
2 n=
2
-
4
:枸造块 i=
3 n=
3
-
5
:j i=
4 n=
4
-
6
:t2 i=
5 n=
5
-
7
:i i=
6 n=
6
-
8
:静态块 i=
7 n=
7
-
9
:枸造块 i=
8 n=
99
-
10
:j i=
9 n=
100
-
11
:初始化 i=
10 n=
101