静态代码块并不是优先执行,急!!!!

worker_sky 2016-11-04 10:29:31
刚学java不久,这段代码想了半天都没明白,求大神解答,谢谢!
package tes;

public class Otyd {
private static int k=0;
private static Otyd t3;
private static Otyd t1 = new Otyd("t1");
private static Otyd t2 = new Otyd("t2");
private static int n = 99;
private static int i = print("i");
{
print("构造块");
}
static{
print("静态块");
}
public Otyd(String s){
System.out.println(++k+":"+s+" i:"+i+" n:"+n);
}
private static int print(String s){
System.out.println(++k+":"+s+" i:"+i+" n:"+n);
n++;
return i;
}
public static void main(String[] args) {
Otyd n = new Otyd("init");
}

}
运行结果:
1:构造块 i:0 n:0
2:t1 i:0 n:1
3:构造块 i:0 n:1
4:t2 i:0 n:2
5:i i:0 n:99
6:静态块 i:0 n:100
7:构造块 i:0 n:101
8:init i:0 n:102
...全文
416 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_33065723 2016-11-05
  • 打赏
  • 举报
回复
1楼说的挺对,二楼的有点高端,是加载类的时候是先给构造静态变量,然后才会执行静态块的
  • 打赏
  • 举报
回复
编译器会把静态代码块和静态变量的赋值语句放到一个方法中,字节码如下: static {}; flags: ACC_STATIC Code: stack=3, locals=0, args_size=0 0: iconst_0 1: putstatic #16 // Field k:I 4: new #1 // class Otyd 7: dup 8: ldc #18 // String t1 10: invokespecial #19 // Method "<init>":(Ljava/lang/Str ing;)V 13: putstatic #23 // Field t1:LOtyd; 16: new #1 // class Otyd 19: dup 20: ldc #25 // String t2 22: invokespecial #19 // Method "<init>":(Ljava/lang/Str ing;)V 25: putstatic #26 // Field t2:LOtyd; 28: bipush 99 30: putstatic #28 // Field n:I 33: ldc #30 // String i 35: invokestatic #31 // Method print:(Ljava/lang/String ;)I 38: putstatic #35 // Field i:I 41: ldc #37 // String 静态块 43: invokestatic #31 // Method print:(Ljava/lang/String ;)I 46: pop 47: return 上面的自己码看不懂的话,java语句是: 1.private static int k = 0; 2.private static Otyd t1 = new Otyd("t1"); 3.private static Otyd t2 = new Otyd("t2"); 4.private static int n = 99; 5.private static int i = print("i"); 6.print("静态块"); 上面拼凑出来的方法只有在类初始化的时候才会调用,一个类的初始化过程只有一次. 初始化过程中执行到第二句代码:2.private static Otyd t1 = new Otyd("t1");会调用类的构造方法 构造方法的字节码就不贴了java代码是这样的: 1.print("构造块"); 2.System.out.println(++k + ":" + s + " i:" + i + " n:" + n); 每次new一个对象时构造方法都会调用一次 在执行方法的过程中没有执行到的赋值语句为初值
爱睡觉的阿狸 2016-11-04
  • 打赏
  • 举报
回复
首先类加载的时候,要初始化静态变量,而你的静态变量t1、t2 new了类的对象,赋给了t1和t2,而这一步又在你的静态代码块前面,当然先执行啦。 再者你new对象的时候会调用构造器,所以打印你静态代码块的内容时会先打印其他内容。

62,612

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧