final变量,初始化与代码块(转载)
原文:https://blog.csdn.net/a405578928/article/details/56678384
在java中,成员变量在没有明确指定值的时候都会被编译器赋予一个默认值,就像下面表格所示:
数据类型 初始值
byte | 0 |
---|---|
short | 0 |
int | 0 |
long | 0L |
float | 0.0F |
double | 0.0D |
char | \u0000 |
boolean | false |
类 | null |
然而当成员变量被final修饰后,情况就十分不同了,若是在声明变量时没有直接赋值,编译器不会自动赋予变量初始值,而是会当作延迟对变量赋值。在类中必须有对其赋值的动作。比如像下面这段示例代码:
public class Car {
private final String color;
}
结果不能通过编译
若是含有多个构造函数,就要确保final 变量被初始化,
public class Car {
private final String color;
public Car() {
this.color = "red";
}
public Car(String color) {
}
}
当然也可以通过代码块对其进行初始化
public class Car {
private final String color;
{
color = "red";
}
}
而且,在代码块会先于构造函数执行,如下所示:
public class Car {
private final String color;
public Car() {
this.color = "red";
}
public Car(String color) {
}
{
color = "red";
}
}