java类与对象的初始化

java类与对象的初始化

ID:10196914

大小:40.45 KB

页数:4页

时间:2018-06-12

java类与对象的初始化_第1页
java类与对象的初始化_第2页
java类与对象的初始化_第3页
java类与对象的初始化_第4页
资源描述:

《java类与对象的初始化》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、Java类与对象的初始化面试的时候,经常会遇到这样的笔试题:给你两个类的代码,它们之间是继承的关系,每个类里只有构造器方法和静态块,它们只包含一些简单的输出字符串到控制台的代码,然后让我们写出正确的输出结果。这实际上是在考察我们对于类的初始化知识的了解。首先,我们先看看下面的代码,这就是很经典的考察方式。1.publicclassInitField{2.publicstaticvoidmain(String[]args){3.SuperInitFieldp=newSuperInitField();4.SuperInitFieldc=newSubInitFiel

2、d();5.}6.}7.8.classSuperInitField{9.publicSuperInitField(){10.System.out.println("parent");11.}12.static{13.System.out.println("staticparent");14.}15.16.}17.18.classSubInitFieldextendsSuperInitField{19.publicSubInitField(){20.System.out.println("child");21.}22.static{23.System.out.p

3、rintln("staticchild");24.}25.}不管你是否能很快速的写出正确的答案,我们先把这个程序放一边,了解一下Java虚拟机初始化的原理。JVM通过加装、连接和初始化一个Java类型,使该类型可以被正在运行的Java程序所使用。类型的生命周期如下图所示:装载和连接必须在初始化之前就要完成。类初始化阶段,主要是为类变量赋予正确的初始值。这里的“正确”初始值指的是程序员希望这个类变量所具备的起始值。一个正确的初始值是通过类变量初始化语句或者静态初始化语句给出的。初始化一个类包含两个步骤:1)如果类存在直接超类的话,且直接超类还没有被初始化,就先初

4、始化直接超类。2)如果类存在一个类初始化方法,就执行此方法。那什么时候类会进行初始化呢?Java虚拟机规范为类的初始化时机做了严格定义:在首次主动使用时初始化。那哪些情形才符合首次主动使用的标准呢?Java虚拟机规范对此作出了说明,他们分别是:1)创建类的新实例;2)调用类的静态方法;3)操作类或接口的静态字段(final字段除外);4)调用Java的特定的反射方法;5)初始化一个类的子类;6)指定一个类作为Java虚拟机启动时的初始化类。除了以上六种情形以外,所有其它的方式都是被动使用的,不会导致类的初始化。一旦一个类被装载、连接和初始化,它就随时可以使用了

5、。现在我们来关注对象的实例化,对象实例化和初始化是就是对象生命的起始阶段的活动。Java编译器为它编译的每个类都至少生成一个实例初始化方法,即()方法。源代码中的每一个类的构造方法都有一个相对应的()方法。如果类没有明确地声明任何构造方法,编译器则为该类生成一个默认的无参构造方法,这个默认的构造器仅仅调用父类的无参构造器。一个()方法内包括的代码内容可能有三种:调用另一个()方法;对实例变量初始化;构造方法体的代码。如果构造方法是明确地从调用同一个类中的另一个构造方法开始,那它对应的()方法体内包括的

6、内容为:1.一个对本类的()方法的调用;2.实现了对应构造方法的方法体的字节码。如果构造方法不是通过调用自身类的其它构造方法开始,并且该对象不是Object对象,那()法内则包括的内容为:1.一个父类的()方法的调用;2.任意实例变量初始化方法的字节码;3.实现了对应构造方法的方法体的字节码。通过上面的讲解是不是对你理解Java类型的初始化有一定的帮助呢?好,那我们再来分析一下开始的那段代码:1.SuperInitFieldp=newSuperInitField();2.//SuperInitField的超类是Object1

7、.//创建SuperInitField对象,属于首次主动使用,因此要先初始化Object类,然后再调用SuperInitField类变量初始化语句或者静态初始化语句,所以要输出staticparent2.//类被装载、连接和初始化之后,创建一个对象,因此需要首先调用了Object的默认构造方法,然后再调用自己的构造方法,所以要输出parent3.4.SuperInitFieldc=newSubInitField();5.//SubInitField继承自SuperInitField6.//创建SubInitField对象,属于首次主动使用,父类SuperIni

8、tField已被初始化,因此只要调用S

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。