Java类与对象的初始化.docx_第1页
Java类与对象的初始化.docx_第2页
Java类与对象的初始化.docx_第3页
Java类与对象的初始化.docx_第4页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Java类与对象的初始化面试的时候,经常会遇到这样的笔试题:给你两个类的代码,它们之间是继承的关系,每个类里只有构造器方法和静态块,它们只包含一些简单的输出字符串到控制台的代码,然后让我们写出正确的输出结果。这实际上是在考察我们对于类的初始化知识的了解。首先,我们先看看下面的代码,这就是很经典的考察方式。1. public class InitField 2. public static void main(String args) 3. SuperInitField p = new SuperInitField(); 4. SuperInitField c = new SubInitField(); 5. 6. 7. 8. class SuperInitField 9. public SuperInitField() 10. System.out.println(parent); 11. 12. static 13. System.out.println(static parent); 14. 15. 16. 17. 18. class SubInitField extends SuperInitField 19. public SubInitField() 20. System.out.println(child); 21. 22. static 23. System.out.println(static child); 24. 25. 不管你是否能很快速的写出正确的答案,我们先把这个程序放一边,了解一下Java虚拟机初始化的原理。JVM通过加装、连接和初始化一个Java类型,使该类型可以被正在运行的Java程序所使用。类型的生命周期如下图所示:装载和连接必须在初始化之前就要完成。类初始化阶段,主要是为类变量赋予正确的初始值。这里的“正确”初始值指的是程序员希望这个类变量所具备的起始值。一个正确的初始值是通过类变量初始化语句或者静态初始化语句给出的。初始化一个类包含两个步骤:1) 如果类存在直接超类的话,且直接超类还没有被初始化,就先初始化直接超类。2) 如果类存在一个类初始化方法,就执行此方法。那什么时候类会进行初始化呢?Java 虚拟机规范为类的初始化时机做了严格定义:在首次主动使用时初始化。那哪些情形才符合首次主动使用的标准呢?Java虚拟机规范对此作出了说明,他们分别是:1) 创建类的新实例;2) 调用类的静态方法;3) 操作类或接口的静态字段(final字段除外);4) 调用Java的特定的反射方法;5) 初始化一个类的子类;6) 指定一个类作为Java虚拟机启动时的初始化类。除了以上六种情形以外,所有其它的方式都是被动使用的,不会导致类的初始化。一旦一个类被装载、连接和初始化,它就随时可以使用了。现在我们来关注对象的实例化,对象实例化和初始化是就是对象生命的起始阶段的活动。Java编译器为它编译的每个类都至少生成一个实例初始化方法,即()方法。源代码中的每一个类的构造方法都有一个相对应的()方法。如果类没有明确地声明任何构造方法,编译器则为该类生成一个默认的无参构造方法,这个默认的构造器仅仅调用父类的无参构造器。一个()方法内包括的代码内容可能有三种:调用另一个() 方法;对实例变量初始化;构造方法体的代码。如果构造方法是明确地从调用同一个类中的另一个构造方法开始,那它对应的 () 方法体内包括的内容为:1. 一个对本类的()方法的调用; 2. 实现了对应构造方法的方法体的字节码。 如果构造方法不是通过调用自身类的其它构造方法开始,并且该对象不是 Object 对象,那 () 法内则包括的内容为:1. 一个父类的()方法的调用; 2. 任意实例变量初始化方法的字节码; 3. 实现了对应构造方法的方法体的字节码。 通过上面的讲解是不是对你理解Java类型的初始化有一定的帮助呢?好,那我们再来分析一下开始的那段代码:1. SuperInitField p = new SuperInitField(); 2. /SuperInitField的超类是Object 3. /创建SuperInitField对象,属于首次主动使用,因此要先初始化Object类,然后再调用SuperInitField类变量初始化语句或者静态初始化语句,所以要输出static parent 4. /类被装载、连接和初始化之后,创建一个对象,因此需要首先调用了Object的默认构造方法,然后再调用自己的构造方法,所以要输出parent 5. 6. SuperInitField c = new SubInitField(); 7. /SubInitField继承自SuperInitField 8. /创建SubInitField对象,属于首次主动使用,父类SuperInitField已被初始化,因此只要调用SubInitField类变量初始化语句或者静态初始化语句,所以要输出static child 9. /类被装载、连接和初始化之后,创建一个对象,因此需要首先调用了SuperInitField的构造方法,然后再调用自己的构造方法,所以要输出parent,然后再输出child 到现在你应该大体了解了Java类初始化的原理了吧,那我就留一到练习题吧,写出下列代码的运行结果。1. public class Test 2. public Test() 3. System.out.println(parent); 4. 5. static 6. System.out.println(static parent); 7. 8. public static void main(String args) 9. System.ou

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论