• 欢迎访问天天编码网站,Java技术、技术书单、开发工具,欢迎加入天天编码
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏天天编码吧
  • 我们的淘宝店铺已经开张了哦,传送门:https://shop145764801.taobao.com/

Java中对象的初始化顺序

Java基础 tiantian 3920次浏览 0个评论 扫描二维码

Java中的对象,具有多达四种初始化方式,它们分别是:变量初始化、对象初始化、静态初始化、构造初始化。那么,它们分别具有什么特点和作用呢?更重要的是它们的区别和顺序。在本文中,我们将使用一个代码示例来详细解析这四种对象初始化的细节和区别。

Java中对象的初始化顺序

实验代码

老规矩,我们还是先来一段代码,读者猜测一下运行结果。

public class Cat {
// 变量初始化
String strA = "www.tiantianbianma.com";

// 构造初始化
public Cat() {
System.out.println("构造初始化");
}

// 静态初始化
static {
System.out.println("静态初始化")
}

// 对象初始化
{
System.out.println("对象初始化");
}

public static void main(String[] args) {
new Cat();
new Cat();
}
}

建议读者先仔细思考程序的输出结果,在实际上机验证,最终的结果是:

静态初始化
对象初始化
构造初始化
对象初始化
构造初始化

程序分析

从上面的演示代码和结果中,我们可以得出四种初始化方式的顺序:

  1. 静态初始化
  2. 对象初始化
  3. 构造初始化。

需要强调的一点是:无论该类创建多少对象,该类的静态初始化块只会被调用一次。

细心的读者可能发现:还有一种变量初始化方式没有讲解。其实变量初始化与对象初始化的优先顺序是相等的,它们之间被调用的先后顺序完全取决于它们在类的定义语句的先后顺序。我们还是以简单的示例代码来阐述。
代码片段一:

System.out.println("www.tiantianbianma.com");
{
System.out.println("天天编码");
}

这个代码片段的运行结果是:

www.tiantianbianma.com
天天编码

代码片段二:

{
System.out.println("天天编码");
}
System.out.println("www.tiantianbianma.com");

这个代码片段的运行结果是:

天天编码
www.tiantianbianma.com

总结

四种初始化对象的方式,根据各自的运行顺序和特点,对应着不同的使用场景和用途。静态初始化方式主要用来完成类中静态变量的个性初始化;构造初始化方式就是为了初始化新生成的对象到一个指定的状态;变量初始化可以定制化对象的默认值;对象初始化的使用场景较少,但它是变量初始化方式的有力补充方式。

通常而言,我们在以下两个情况下,考虑使用对象初始化方式:
1. 初始化代码必须要负责处理异常(exception)。
2. 执行变量初始化方式不能或不方便处理的复杂初始化逻辑。

当然,在这两种情况下,可以考虑使用构造初始化方式。但是,如果该类具有的多个重载的构造函数,构造初始化方式就会出现重复代码,而重复代码是一种非常不好的编程风格。通过前面的实验代码获知:对象初始化是运行在构造初始化之前的。所以,无论使用哪个构造函数新建对象,对象初始化都会在前面被执行。

对象初始化的另一个重要使用场景是在 匿名内部类,因为匿名内部类不能定义任何的构造函数,但是却可以有对象初始化代码块。同时,设计模式中的策略模式经常需要使用实现了接口的内部类作为策略对象,如果有执行任何初始化代码的需求,对象初始化方式也是唯一的选择。


天天编码 , 版权所有丨本文标题:Java中对象的初始化顺序
转载请保留页面地址:http://www.tiantianbianma.com/java-initial-order.html/
喜欢 (3)
支付宝[多谢打赏]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址