8.8 构造代码块

最后更新于:2022-04-01 14:11:41

这一节我们再看一个特殊的代码块,那就是构造代码块。 这里我们简单的通过例子来说明一下: ~~~ class Person { private String name; { System.out.println("Person类的第一个代码块被执行"); } Person() { System.out.println("无参数构造函数被执行"); this.name = "小宝宝"; } Person(String name) { System.out.println("有name参数构造函数被执行"); this.name = name; } public void speak() { System.out.println("名字:"+name); } } class ConBlockTest { public static void main(String[] args) { Person p1 = new Person(); p1.speak(); Person p2 = new Person("小科比"); p2.speak(); } } ~~~ 我们在这个例子中看到了Person类中有一个代码块,它没有被static关键字修饰,这就是我们这一节所说的构造代码块,为什么这么说呢,我们看运行结果: ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-05-18_573c422a9c286.jpg) 我们很显然就看到了在我们创建两个对象时,该代码块都被执行了,而构造函数只是当创建对应对象时被调用。 所以构造代码块的作用就是:**给所有对象进行相同部分的初始化。** 而我们的构造方法是对对应的对象进行有针对性的独特的初始化。 那么构造代码块的构造函数哪个先执行呢?我们看代码: ~~~ class Person { private String name; {//第一个构造代码块 System.out.println("Person类的第1个代码块被执行"); } Person() { System.out.println("无参数构造函数被执行"); this.name = "小宝宝"; } Person(String name) { System.out.println("有name参数构造函数被执行"); this.name = name; } public void speak() { System.out.println("名字:"+name); } {//第二个构造代码块 System.out.println("Person类的第2个代码块被执行"); } } ~~~ 我们看结果: ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-05-18_573c422aae4e6.jpg) 我们看到两个不同位置的构造代码块都在构造函数被执行之前就已经执行了,所以说**构造代码块优先于构造函数执行。** ** ** 所以,当我们需要把所有对象都有相同的初始化时,我们可以使用构造代码块来实现,比如上面的例子中,人一出生都会哭,那么我们就可以用构造代码块来初始哭这个功能: ~~~ class Person { private String name; { cry(); } Person() { this.name = "小宝宝"; } Person(String name) { this.name = name; } public void cry() { System.out.println("哇哇"); } public void speak() { System.out.println("名字:"+name); } } ~~~ 这样我们就把所有对象哭的功能封装到了一个构造代码块中,在创新对象是会优先执行,很好的实现了我们想要的功能。 ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-05-18_573c422abf8e0.jpg)
';