这一节我们再看一个特殊的代码块。那就是构造代码块。
这里我们简单的通过样例来说明一下:
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类中有一个代码块,它没有被statickeyword修饰,这就是我们这一节所说的构造代码块,为什么这么说呢,我们看运行结果:
我们非常显然就看到了在我们创建两个对象时,该代码块都被运行了。而构造函数仅仅是当创建相应对象时被调用。
所以构造代码块的作用就是:给全部对象进行同样部分的初始化。
而我们的构造方法是对相应的对象进行有针对性的独特的初始化。
那么构造代码块的构造函数哪个先运行呢?我们看代码:
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个代码块被运行"); } }我们看结果:
我们看到两个不同位置的构造代码块都在构造函数被运行之前就已经运行了。所以说构造代码块优先于构造函数运行。
所以,当我们须要把全部对象都有同样的初始化时,我们能够使用构造代码块来实现。比方上面的样例中,人一出生都会哭,那么我们就能够用构造代码块来初始哭这个功能:
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); } }这样我们就把全部对象哭的功能封装到了一个构造代码块中。在创新对象是会优先运行,非常好的实现了我们想要的功能。