快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-18
s);    } } public class PolyConstructors {    public static void main(String[] args) {     new RoundGlyph(5);    } }

结果:

Glyph() before draw() RoundGlyph.draw(),radius=0 Glyph() after draw() RoundGlyph.RoundGlyph(),radius=5

在Glyph中,draw()方法是抽象的,这样设计是为了覆盖该方法。我们确实在RoungGlyph中强制覆盖了draw()。但是Glyph构造器会调用这个方法,结果导致了对RoundGlyph.draw()的调用,这看起来似乎是我们的目的。但是如果看到输出结果,我们会发现当Glyph的构造器调用draw()方法时,radius不是默认初始值1,而是0。

解决这个问题的关键是初始化的实际过程:

1)在其他任何事物发生之前,将分配给对象的存储空间初始化成二进制零。

2)如前所述那样调用基类构造器。此时,调用被覆盖后的draw()方法(要在调用RoundGlyph构造器之前调用),由于步骤1的缘故,我们此时会发现radius的值为0。

3)按照声明的顺序调用成员的初始化方法。

4)调用导出类的构造器主体。

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

时间:2011-03-20 zhangjunhd

9.初始化及类的加载

看以下代码:

class Tag {    Tag(int marker) {     System.out.println("Tag(" + marker + ")");    } } class Insect {    private int i = 9;    protected int j, m;    Insect() {     System.out.println("i = " + i + ", j = " + j);     j = 39;    }    private static int x1 = print("static Insect.x1 initialized");    static int print(String s) {     System.out.println(s);     return 47;    }    Tag t1 = new Tag(1); } public class Beetle extends Insect {    private int k = print("Beetle.k initialized");    public Beetle() {     System.out.println("k = " + k);     System.out.println("j = " + j);     System.out.println("m = " + m);    }    private static int x2 = print("static Beetle.x2 initialized");    public static void main(String[] args) {     System.out.println("Beetle constructor");     Beetle b = new Beetle();    }    Tag t2 = new Tag(2); }

结果:

static Insect.x1 initialized static Beetle.x2 initialized Beetle constructor Tag(1) i = 9, j = 0 Beetle.k initialized Tag(2) k = 47 j = 39 m = 0

你在Beetle 上运行Java 时,所发生的第一件事情就是你试图访问Beetle.main( ) (一个static 方法),于是加载器开始启动并找出 Beetle 类被编译的程序代码(它被编译到了一个名为Beetle .class 的文件之中)。在对它进行加载的过程中,编译器注意到它有一个基类(这是由关键字 extends 告知的),于是它继续进行加载。不管你是否打算产生一个该基类的对象,这都要发生。

如果该基类还有其自身的基类,那么第二个基类就会被加载,如此类推。接下来,根基类中的静态初始化(在此例中为Insect)即会被执行,然后是下一个导出类,以此类推。这种方式很重要,因为导出类的静态初始化可能会依赖于基类成员能否被正确初始化的。

至此为止,必要的类都已加载完毕(静态变量和静态块),对象就可以被创建了。

首先,对象中所有的原始类型都会被设为缺省值,对象引用被设为null——这是通过将对象内存设为二进制零值而一举生成的。然后,基类的构造器会被调用。在本例中,它是被自动调用的。但你也可以用super 来指定对基类构造器的调

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