Java和Android中,代码块、static静态代码块的执行顺序

来源:互联网 发布:win8系统修复软件 编辑:程序博客网 时间:2024/05/17 02:55

    <p>Java和Android中,代码块、static静态代码块的执行顺序有没有什么区别呢。</p>

Java

先来个简单的例子

Main.java:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class Main {
static int a = 1;
static {
System.out.println(a);
}
static {
a = 2;
}
public static void main(String[] args) {
System.out.println("Hello World!");
System.out.println(a);
}
}

输出为

1
Hello World!
2

尝试交换static变量声明和static代码块后,编译报错”非法前向引用”。
交互两个代码块位置后输出

2
Hello World!
2

可见static修饰的,是从上向下,依次执行的。static变量和代码块优先执行

我们再来做一个更复杂的实验

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
public class Main {
static int a = 1;
static {
System.out.println(a);
}
static {
a = 2;
}
public static void main(String[] args) {
System.out.println("Hello World!");
Yo.test();
Yo yooo = new Yo();
yooo.test();
}
}
public class Yo {
static String name = "mark";
static {
System.out.println(name);
}
public Yo() {
super();
System.out.println("constructor");
}
static public void test() {
System.out.println("hello " + name);
}
}

输出

1
Hello World!
mark
hello mark
constructor
hello mark

Yo的执行符合上面的结论,执行了static代码块和静态方法test,构造Yo实例后,没有重复执行static代码块。

Android

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
public class TestApplication extends BaseApplication {
static {
Log.d("test", "Application 1123");
}
static int a = 1;
static {
Log.d("test", "Application " + a);
HomeActivity.test();
}
static {
a = 2;
}
@Override
protected void attachBaseContext(Context base) {
Log.d("test", "Application hello " + a);
}
}
public class SplashActivity extends BaseActivity {
static {
Log.d("test", "SplashActivity static code block");
}
static int a = 1;
static {
Log.d("test", "SplashActivity " + a);
}
static {
a = 2;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
Log.d("test", "SplashActivity onCreate " + a);
// 省略,会去start HomeActivity
}
}
public class HomeActivity extends BaseActivity {
public static final String TAG = "HomeActivity";
static {
Log.d("test", "HomeActivity 1123");
}
public static void test() {
Log.d("test", "HomeActivity");
}
}

输出结果为

D/test﹕ Application 1123
D/test﹕ Application 1
D/test﹕ HomeActivity 1123
D/test﹕ HomeActivity
D/test﹕ Application hello 2
D/test﹕ SplashActivity static code block
D/test﹕ SplashActivity 1
D/test﹕ SplashActivity onCreate 2

从结果上看java并没有什么区别

同样是先执行依次static,入口外其他类的static初始化在类被JVM加载(从结果来看,是在类被使用的时候才会加载)的时候执行。

转自:http://blog.zhaiyifan.cn/2015/08/28/Java%E5%92%8CAndroid%E4%B8%AD%EF%BC%8C%E4%BB%A3%E7%A0%81%E5%9D%97%E3%80%81static%E9%9D%99%E6%80%81%E4%BB%A3%E7%A0%81%E5%9D%97%E7%9A%84%E6%89%A7%E8%A1%8C%E9%A1%BA%E5%BA%8F/

阅读全文
'); })();
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 嘴周边过敏怎么办 眼圈发红过敏怎么办 眼皮皮肤过敏怎么办 换季皮肤干燥怎么办 染发过敏该怎么办 染发过敏怎么办 头上长湿疹结痂怎么办 小孩头上有湿疹怎么办 小孩轻微鼻炎怎么办 疤痕疙瘩特别痒怎么办 旧伤疤痒怎么办 疤痕很痒怎么办 伤口增生痒怎么办 吃牛肉皮肤过敏怎么办 人工荨麻疹该怎么办 荨麻疹发热怎么办呢 荨麻疹痒怎么办 荨麻疹后发烧怎么办 压迫性荨麻疹怎么办 荨麻疹病怎么办 急性荨麻疹发烧怎么办 荨麻疹一直发烧怎么办 皮肤过敏怎么办治疗 口腔溃疡久治不愈怎么办 皮肤缺水怎么办? 你脸上缺水怎么办 黑眼圈非常严重怎么办 孕妇得了皮肤病怎么办 怀孕得了皮肤病怎么办 孕妇皮肤病怎么办 脸上激素过敏怎么办 角质层破裂怎么办 人丑怎么办 皮肤有坑怎么办 感冒20天没好怎么办 姨妈提前量少怎么办 病毒感冒怎么办 毛孔大还长痘痘怎么办 感冒两个月没好怎么办 孕早期卵巢囊肿怎么办 吃黄体酮头晕怎么办