快速业务通道

深入理解Java初始化的含义 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-22
va" public class debug.Test extends java.lang.Object{   static int x;   static java.lang.String s;   public debug.Test();   Code:    0: aload_0    1: invokespecial #1; //Method java/lang/Object."":()V    4: return    public static void main(java.lang.String[]);    Code:    0: new #2; //class debug/Test    3: dup    4: invokespecial #3; //Method "":()V    7: pop    8: return    static {};    Code:    0: iconst_0    1: putstatic #4; //Field x:I    4: ldc #5; //String 123    6: putstatic #6; //Field s:Ljava/lang/String;    9: ldc #7; //String 456    11: astore_0    12: new #8; //class java/lang/RuntimeException    15: dup    16: invokespecial #9; //Method java/lang/RuntimeException."":()V    19: athrow   }

我们可以看到,类初始化正是按照源文件中定义的原文顺序进行。先是声明

static int x; static java.lang.String s;

然后对int x和String s进行赋值:

0: iconst_0 1: putstatic #4; //Field x:I 4: ldc #5; //String 123 6: putstatic #6; //Field s:Ljava/lang/String;

执行初始化块的String s1 = "456";生成一个RuntimeException抛

9: ldc #7; //String 456 11: astore_0 12: new #8; //class java/lang/RuntimeException 15: dup 16: invokespecial #9; //Method java/lang/RuntimeException."":()V 19: athrow

要明白的是,""方法不仅是类初始化方法,而且也是接口初始化方法。并不是所以接口的属性都是内联的,只有直接赋常量值的接口常量才会内联。而

[public static final] double d = Math.random()*100;

这样的表达式是需要计算的,在接口中就要由""方法来初始化。

深入理解Java初始化的含义(3)

时间:2010-12-31

下面我们再来看看实例初始化方法""

""用于对象创建时对对象进行初始化,当在HEAP中创建对象时,一旦在HEAP分配了空间。最先就会调用""方法。这个方法包括实例变量的赋值(声明不在其中)和初始化块,以及构造方法调用。如果有多个重载的构造方法,每个构造方法都会有一个对应的""方法。构造方法隐式或显示调用父类的构造方法前,总是先执行实例变量初始化和初始化块.同样,实例变量和初始化块的顺序也是按源文件的原文顺序执行,构造方法中的代码在最后执行:

package debug; public class Test {   int x = 0;   String s = "123";   {    String s1 = "456";    //if(1==1)    //throw new RuntimeException();   }   public Test(){    String ss = "789";   }   public static void main(String[] args) {    new Test();   } } javap -c debug.Test的结果:   Compiled from "Test.java"   public class debug.Test extends java.lang.Object{    int x;    java.lang.String s;    public debug.Test();    Code:    0: aload_0    1: invokespecial #1; //Method java/lang/Object."":()V    4: aload_0    5: iconst_0    6: putfield #2; //Field x:I    9: aload_0    10: ldc #3; //String 123    12: putfield #4; //Field s:Ljava/lang/String;    15: ldc #5; //String 456    17: astore_1    18: ldc #6; //String 789    20: astore_1    21: return    public static void main(java.lang.String[]);    Code:   

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号