快速业务通道

Java的初始化类、变量、程序块加载探讨 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-18
n("Creating new Cupboard() in main");// Ⅴ     new Cupboard();// Ⅵ     t2.f2(1);// Ⅶ     t3.f3(1);// Ⅷ    }    static Table t2 = new Table();// Ⅰ    static Cupboard t3 = new Cupboard();// Ⅱ }

结果:

Bowl(1) Bowl(2) Table() f(1) Bowl(4) Bowl(5) Bowl(3) Cupboard f(2) Creating new Cupboard() in main Bowl(3) Cupboard f(2) Creating new Cupboard() in main Bowl(3) Cupboard f(2) f2(1) f3(1)

由输出可见,静态初始化只有在必要时刻才会进行。如果不创建Table 对象,也不引用Table.b1或Table.b2,那么静态的Bowl b1 和b2 永远都不会被创建。只有在第一个Table 对象被创建(或者第一次访问静态数据)的时候,它们才会被初始化。此后,静态对象不会再次被初始化。

初始化的顺序是先“静态”,(如果它们尚未因前面的对象创建过程而被初始化),后“非静态”。从输出结果中可以观察到这一点。

Java的初始化类、变量、程序块加载探讨(3)

时间:2011-03-20 zhangjunhd

4.静态块的初始化

Java 允许你将多个静态初始化动作组织成一个特殊的“静态子句”(有时也叫作“静态块”)。与其他静态初始化动作一样,这段代码仅执行一次:当你首次生成这个类的一个对象时,或者首次访问属于那个类的一个静态成员时(即便从未生成过那个类的对象)。看下面的代码:

class Cup {    Cup(int marker) {     System.out.println("Cup(" + marker + ")");    }    void f(int marker) {     System.out.println("f(" + marker + ")");    } } class Cups {    static Cup c1;    static Cup c2;    static {     c1 = new Cup(1);     c2 = new Cup(2);    }    Cups() {     System.out.println("Cups()");    } } public class ExpilicitStatic {    public static void main(String[] args) {     System.out.println("Inside main()");     Cups.c1.f(99);// (1)    }    // static Cups x=new Cups();//(2)    // static Cups y=new Cups();//(2) }

结果:

Inside main() Cup(1) Cup(2) f(99)

无论是通过标为(1)的那行程序访问静态的 c1对象,还是把(1)注释掉,让它去运行标为(2) 的那行,Cups 的静态初始化动作都会得到执行。如果把(1)和(2)同时注释掉,Cups 的静态初始化动作就不会进行。此外,激活一行还是两行(2)代码都无关紧要,静态初始化动作只进行一次。

5.非静态实例初始化

看下面的代码:

class Mug {    Mug(int marker) {     System.out.println("Mug(" + marker + ")");    }    void f(int marker) {     System.out.println("f(" + marker + ")");    } } public class Mugs {    Mug c1;    Mug c2;    {     c1 = new Mug(1);     c2 = new Mug(2);     System.out.println("c1&c2 initialized");    }    Mugs() {     System.out.println("Mugs()");    }    public static void main(String[] args) {     System.out.println("Inside main()");     new Mugs();     System.out.println("===new Mugs again===");     new Mugs();    } }

结果:

Inside main() Mug(1) Mug(2) c1&c2 initialized Mugs() ===new Mugs again=== Mug(1) Mug(2) c1&c2 initialized Mugs()

从结果可以看到,非静态的代码块被执行了2次。所以只要实例化一个

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号