java代码初始化的作用 java代码初始化的作用是什么( 二 )


来控制的 。
类初始化方法:
我没有从任何地方了解到的cl是不是class的简写 , 但这个方法确实是用来对“类”进行初
始化的 。换句话说它是用来初始化static上下文的 。
在类装载(load)时,JVM会调用内置的方法对类成员和静态初始化块进行初始化调用 。它们
的顺序按照源文件的原文顺序 。
我们稍微增加两行static语句:
packagedebug;
publicclassTest{
staticintx=0;
staticStrings="123";
static{
Strings1="456";
if(1==1)
thrownewRuntimeException();
}
publicstaticvoidmain(String[]args){
newTest();
}
}
然后进行反编译:
javap-cdebug.Test
Compiledfrom"Test.java"
publicclassdebug.Testextendsjava.lang.Object{
staticintx;
staticjava.lang.Strings;
publicdebug.Test();
Code:
0:aload_0
1:invokespecial#1;//Methodjava/lang/Object."":()V
4:return
publicstaticvoidmain(java.lang.String[]);
Code:
0:new#2;//classdebug/Test
3:dup
4:invokespecial#3;//Method"":()V
7:pop
8:return
static{};
Code:
0:iconst_0
1:putstatic#4;//Fieldx:I
4:ldc#5;//String123
6:putstatic#6;//Fields:Ljava/lang/String;
9:ldc#7;//String456
11:astore_0
12:new#8;//classjava/lang/RuntimeException
15:dup
16:invokespecial#9;//Methodjava/lang/RuntimeException."":()V
19:athrow
}
这里 , 我们不得不说,JDK在javap功能上的实现有一个BUG 。static段的16标号 , 那里标识了异常
的位置发生在""方法中,而实际上这段程序运行时的输出却是:
java.lang.ExceptionInInitializerError
Causedby:java.lang.RuntimeException
atdebug.Test.(Test.java:8)
Exceptioninthread"main"
但我们总可以明白,类初始化正是按照源文件中定义的原文顺序进行 。先是声明
staticintx;
staticjava.lang.Strings;
然后对intx和Strings进行赋值:
0:iconst_0
1:putstatic#4;//Fieldx:I
4:ldc#5;//String123
【java代码初始化的作用 java代码初始化的作用是什么】6:putstatic#6;//Fields:Ljava/lang/String;
执行初始化块的Strings1="456";生成一个RuntimeException抛
9:ldc#7;//String456
11:astore_0
12:new#8;//classjava/lang/RuntimeException
15:dup
16:invokespecial#9;//Methodjava/lang/RuntimeException."":()V
19:athrow
要明白的是,""方法不仅是类初始化方法,而且也是接口初始化方法 。并不是所以接口
的属性都是内联的,只有直接赋常量值的接口常量才会内联 。而
[publicstaticfinal]doubled=Math.random()*100;
这样的表达式是需要计算的 , 在接口中就要由""方法来初始化 。
下面我们再来看看实例初始化方法""
""用于对象创建时对对象进行初始化,当在HEAP中创建对象时,一旦在HEAP分配了空间 。最
先就会调用""方法 。这个方法包括实例变量的赋值(声明不在其中)和初始化块 , 以及构造
方法调用 。如果有多个重载的构造方法,每个构造方法都会有一个对应的""方法 。
同样,实例变量和初始化块的顺序也是按源文件的原文顺序执行,构造方法中的代码在最后执行:
packagedebug;
publicclassTest{
intx=0;
Strings="123";
{
Strings1="456";
//if(1==1)
//thrownewRuntimeException();
}
publicTest(){
Stringss="789";
}
publicstaticvoidmain(String[]args){
newTest();
}
}
javap-cdebug.Test的结果:
Compiledfrom"Test.java"
publicclassdebug.Testextendsjava.lang.Object{
intx;

推荐阅读