所谓空白final 是指声明为final但未给定初始值的域
空白final可在定义处或构造器中或创建对象时赋值
如果一个类有多个空白final不可建多个构造器进行赋值 只能再一个构造器中赋值否则会显示另一个空白final未定义
代码如下:
public class ewq {
final private String i;
final private String i2;
final private Integer a;
public ewq(String ii, Integer x) {
i2 = "构造器中赋值";
i = ii;
a = x;
}
// 只能用一个构造器 用两个构造器会显示另一个空白final未定义
/*
* public ewq(String ii){ i=ii; }
*/
// 重写 toString方法,运用 + 将integer 类型转换为 string
public String toString() {
return "i2=" + i2 + "\ni=" + i + "\na=" + a;
}
public static void main(String[] args) {
System.out.println(new ewq("创建对象时赋值", 2).toString());
}
}
结果:
i2=构造器中赋值
i=创建对象时赋值
a=2
运用空白final在创建两个不同的对象时 a有什么变化?
public class ewq2 {
final private int a;
public ewq2(int x) {
a = x;
// a++; 错误 a并不能改变
}
public int toInteger() {
return a;
}
public static void main(String[] args) {
ewq2 w = new ewq2(3);
System.out.println("number-->" + w.toInteger());
System.out.println("\n---------");
ewq2 w2 = new ewq2(10);
System.out.println("number-->" + w2.toInteger());
}
}
结果:
number-->3
---------
number-->10
为什么number会变成10?不是说final修饰的是不可以改变的吗!
通过debug可知 a的变化
ewq2 w = new ewq2(3); a: 0-->3
<pre name="code" class="java">ewq2 w2 = new ewq2(10); a: 0-->10
a是成员变量默认值为0
a的值并不是从3--->10的,因为创建对象时会分配新的内存块,而a实际是两个地址不同名称相同的变量 所以并不是a的值改变了