首页 / JAVA / Java的初始化块及执行过程详解
Java的初始化块及执行过程详解
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Java的初始化块及执行过程详解,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3633字,纯文字阅读大概需要6分钟。
内容图文
![Java的初始化块及执行过程详解](/upload/InfoBanner/zyjiaocheng/715/1c9e474083f34ebb90f6e720e80073d4.jpg)
问题:Java对象初始化方式主要有哪几种?分别是什么?
针对上面的问题,想必大家脑海中首先浮现出的答案是构造器,没错,构造器是Java中常用的对象初始化方式。
还有一种与构造器作用非常相似的是初始化块,它可以对Java对象进行初始化操作。下面主要阐述Java的初始化块及执行过程。
Java初始化块其实是Java类的成员之一,其语法格式如下:
[修饰符]{
//初始化块的可执行代码
...
}
初始化块的修饰符只能是static,使用static修饰符的初始化块称为静态初始化块,后面会介绍到。
下面通过一段程序代码看看创建对象Dog时发生了什么。
public class Dog { //定义一个初始化块 { System.out.println("第一个初始化块"); } //定义第二个初始化块 { System.out.println("第二个初始化块"); } //定义无参的构造器 public Dog() { System.out.println("Dog的无参构造器"); } public static void main(String[] args) { new Dog(); } }
运行结果为:
第一个初始化块 第二个初始化块 Dog的无参构造器
从运行结果可以看出:当创建一个Dog对象时,程序先执行初始化块后执行构造器,而且两个初始化的执行顺序是按照前后顺序执行的。
由于初始化块只在创建Java对象时隐士的执行(所有的初始化块全部执行),为了让程序更加的简洁和可读性更强,一般一个类里最多只有一个初始化块。
既然初始化块和构造器都是创建对象的时候执行,那么它们有什么区别呢?
从某种程度上来看,初始化块是构造器的补充,与构造器不同的是,初始化块是一段固定执行的代码,不能接收任何的参数,而构造器是可以接收参数的。如果程序中有两个构造器,并且它们有公共的无需接收参数的代码,则可以把这些相同的公共代码放到初始化块中,提高代码的可维护性。
当普通初始化块被static修饰时,则这个初始化块就是静态初始化块,也被称为类初始化块。
普通初始化块负责对对象进行初始化,而静态初始化块负责对类进行初始化,所以静态初始化块总是比普通初始化块先执行。
静态初始化块通常用于对类变量执行初始化处理,不能对实例变量进行初始化处理。
静态初始化块也是类的静态成员,仍然需要遵循静态成员不能访问非静态成员的规则,包括不能访问实例变量和实例方法。
初始化块执行的时候会一直上溯到java.lang.Object类,先执行Object的初始化块,再执行其父类的初始化块...最后才执行该类自己的初始化块。
下面看下这段代码的执行顺序结果:
class Biology{ static { System.out.println("Biology的静态初始化块"); } { System.out.println("Biology的普通初始化块"); } public Biology(){ System.out.println("Biology的无参构造器"); } } class Animal extends Biology{ static { System.out.println("Animal的静态初始化块"); } { System.out.println("Animal的普通初始化块"); } public Animal(){ System.out.println("Animal的无参构造器"); } public Animal(String name){ this();//调用同类中的重载构造器 System.out.println("Animal的带参构造器,name="+name); } } class Cat extends Animal{ static { System.out.println("Cat的静态初始化块"); } { System.out.println("Cat的普通初始化块"); } public Cat(){ //调用父类中带参数的构造器 super("Java典籍"); System.out.println("Cat的无参构造器"); } } public class Test { public static void main(String[] args) { new Cat(); System.out.println("========="); new Cat(); } }
执行结果如下:
Biology的静态初始化块 Animal的静态初始化块 Cat的静态初始化块 Biology的普通初始化块 Biology的无参构造器 Animal的普通初始化块 Animal的无参构造器 Animal的带参构造器,name=Java典籍 Cat的普通初始化块 Cat的无参构造器 ========= Biology的普通初始化块 Biology的无参构造器 Animal的普通初始化块 Animal的无参构造器 Animal的带参构造器,name=Java典籍 Cat的普通初始化块 Cat的无参构造器
从上面的执行结果来看,第一次创建Cat对象时,由于系统还未有Cat对象,因此需要先加载并初始化Cat类,初始化Cat类会先执行其顶层父类的静态初始化块,再执行其直接父类的静态初始化块,最后才执行其本身的静态初始化块。
一旦Cat类初始化成功后,其在虚拟机中一直存在,当第二次再创建Cat对象时 无需再对Cat类进行初始化。
综上,一个类初始化的执行顺序为:父类静态初始化块,该类静态初始化块,父类普通初始化块,父类构造器,该类普通初始化块,该类构造器。
欢迎关注微信公众号【Java典籍】,收看更多Java技术干货!关注即送java全套资料一份
▼微信扫一扫下图↓↓↓二维码关注
内容总结
以上是互联网集市为您收集整理的Java的初始化块及执行过程详解全部内容,希望文章能够帮你解决Java的初始化块及执行过程详解所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。