《java从入门到精通》第五版,197页例11.4在项目中创建FinalData类,在该类中创建Test内部类,并定义各种类型的final变量
import static java.lang.System.*;
import java.util.*;
class Test {
int i = 0;
}
public class FinalData {
static Random rand = new Random();
private final int VALUE_1 = 9; // 声明一个final常量
private static final int VALUE_2 = 10; // 声明一个final、static常量
private final Test test = new Test(); // 声明一个final引用
private Test test2 = new Test(); // 声明一个不是final的引用
private final int[] a = { 1, 2, 3, 4, 5, 6 }; // 声明一个定义为final的数组
private final int i4 = rand.nextInt(20);
private static final int i5 = rand.nextInt(20);
public String toString() { //问题1
return i4 + " " + i5 + " ";
}
public static void main(String[] args) {
FinalData data = new FinalData();
// data.test=new Test();
//可以对指定为final的引用中的成员变量赋值
//但不能将定义为final的引用指向其他引用
//data.VALUE_2=3; 不能改变定义为final的常量值
data.test2 = new Test(); // 可以将没有定义为final的引用指向其他引用
for (int i = 0; i < data.a.length; i++) {
a[i]=9; //不能对定义为final的数组赋值 问题2
}
out.println(data);
out.println("data2");
out.println(new FinalData());
out.println(data.a[3]);
// out.println(data);
}
}
这里碰到两个问题
第一个问题是toString方法的重写,这个方法的返回类型是String型,但方法体中return后面返回的是i4 + " " + i5 + " ";这里面既有整型数,又有字符串。与方法声明中定义的String型不符,这样合规吗,还是我的理解有误。
第二个问题是给定义为final类型的数组重新赋值的字段 a[i]=9;编译的时候提示不能对非静态字段a进行静态引用,改成data.a[i]=9;后错误提示消失,在主方法里加一条输出语句out.println(data.a[3]);然后执行程序,运行正常,显示数组a[i]中的值已经被重新赋值都变成了9。这跟课本里说的不能对定义为final型的数组进行重新赋值不符,这又是怎么回事。
望解惑,谢谢。