代码块
{
System.out.println("这是代码块");
}
CodeBlock(){
System.out.println("这是一个无参构造");
}
CodeBlock(int x){
this();
System.out.println("这是一个有参构造");
}
作用:一般用来做 数据的初始化工作,它会在 调用构造方法前 执行
- 分析class文件:
- 代码块中内容会拷贝至构造方法中内容的前面
- 使用this关键字,构造方法调构造方法后,代码块中内容不会再拷贝至有调构造方法的构造方法(只要最终有了即可)
//此处是反编译后的class文件
CodeBlock(){
System.out.println("这是代码块");
System.out.println("这是一个无参构造");
}
CodeBlock(int x){
this();
System.out.println("这是一个有参构造");
}
代码块的坑-属性的声明与赋值位置
int a = 5;
{
a = 10;
System.out.println("这是代码块");
}
CodeBlock(){
System.out.println("这是一个无参构造");
}
- 属性的声明与赋值同时在最前面,编译时赋值比代码块中内容先执行
- 若声明与赋值在后面,则编译时会将声明提至最前,然后执行代码块中内容,再执行赋值,最后执行构造方法
{
a = 10;
System.out.println("这是代码块");
}
int a = 5;
CodeBlock(){
System.out.println("这是一个无参构造");
}
代码块坑-未完成赋初值不允许使用
int a = 5;
{
a = 10;
b = 2;
System.out.println("这是代码块");
System.out.println(a);// 不报错
System.out.println(b);// 错误,非法前置引用
}
int b = 1;
编译器会认为,b 有可能还没有赋初值完成。代码块中不允许使用