Java中构造代码块的使用
例子1
public class Client {
{
System.out.println("执行构造代码块1");
}
{
System.out.println("执行构造代码块2");
}
public Client(){
System.out.println("执行无参构造");
}
public Client(int i){
System.out.println("执行有参构造1");
}
public static void main(String[] args) {
new Client();
new Client(5);
}
}
执行构造代码块1
执行构造代码块2
执行无参构造
执行构造代码块1
执行构造代码块2
执行有参构造1
结论:在通过new关键字生成一个实例时会先执行构造代码块(相当于把构造块的代码插入到构造函数的最前端),然后再执行其他代码,也就是说:构造代码块会在每个构造函数内首先执行(需要注意的是:构造代码块不是在构造函数之前运行的,它依托于构造函数的执行),同时构造代码块的执行顺序为语句编写顺序。
例子2
public class Client {
{
System.out.println("执行构造代码块1");
}
{
System.out.println("执行构造代码块2");
}
public Client(){
System.out.println("执行无参构造");
}
public Client(int i){
System.out.println("执行有参构造1");
}
public Client(String str){
this();
System.out.println("执行有参构造2");
}
public static void main(String[] args) {
new Client();
new Client(5);
new Client("hello");
}
}
执行无参构造
执行构造代码块1
执行构造代码块2
执行有参构造1
执行构造代码块1
执行构造代码块2
执行无参构造
执行有参构造2
结论:特殊情况-如果遇到this关键字(也就是构造函数调用自身其他的构造函数时)则不插入构造代码块,对于我们的例子来说,编译器在编译时发现String形参的构造函数调用了无参构造,于是放弃插入构造代码块,所以只执行了一次构造代码块.。
延伸:在构造代码块的处理上,super方法没有任何特殊的地方,编译器只是把构造代码块插入到super方法之后执行而已