62,614
社区成员
发帖
与我相关
我的任务
分享
package com.sotaof.testfinal;
public class Value {
int i;
public Value(int i){
this.i = i;
}
}
package com.sotaof.testfinal;
import java.util.Random;
public class FinalData {
private static Random rand = new Random(47);
private String id;
public FinalData(String id) {
this.id = id;
}
private final int valueOne = 9;
private static final int VALUE_TWO = 99;
public static final int VALUE_THREE = 39;
private final int i4 = rand.nextInt(20);
static final int INT_5 = rand.nextInt(20);
private Value v1 = new Value(11);
private final Value v2 = new Value(22);
private static final Value VAL_3 = new Value(33);
private final int[] a = {1,2,3,4,5,6};
public String toString() {
return id + ": " + "i4 = " + i4 + ", INT_5 = " + INT_5;
}
public static void main(String[] args) {
FinalData fd1 = new FinalData("fd1");
//fd1.valueOne++; 这句代码会报错,因为final修饰的基本类型数值是不可以变化的
fd1.v2.i++; //这句代码不会报错,因为final修饰的v2对象自身是可以变化的
fd1.v1 = new Value(9); //这个代码是不会报错的,就是创建一个对象,v1没有用final修饰
for(int i = 0; i < fd1.a.length; i++) {
fd1.a[i]++; //这句代码也是不会报错的,因为数组也是对象,而final修饰的对象自身可以变化
}
//fd1.v2 = new Value(0); 这句代码会报错 ,因为v2是用final修饰的,final修饰的对象自身是可以变化的,
//但是final修饰的对象的引用是不可以变化的,所以再用v2创建对象,就说明v2的引用变化了,所以报错
//fd1.VAL_3 = new Value(1);和上边一样的道理
//fd1.a = new int[3];和上边一样的道理
//刚才那三段代码都是一个意思,就是说final修饰的对象,这个对象的引用是不可以变化的
System.out.println(fd1);
System.out.println("Creating new FinalData");
FinalData fd2 = new FinalData("fd2");
System.out.println(fd1);
System.out.println(fd2);
}
}
class InitalizedClass {
static {
System.out.println("You have initalized InitalizedClass!");
}
public static int inititalize_varible = 1;
}
public class TestInitializeClass {
public static void main(String[] args) {
System.out.println(InitalizedClass.inititalize_varible);
}
}
class InitalizedClass {
static {
System.out.println("You have initalized InitalizedClass!");
}
//和上面的例子唯一的差异就是此处的变量INITIALIZED_VARIBLE被声明为final
public final static int INITIALIZED_VARIBLE = 1;
}
public class TestInitializeClass {
public static void main(String[] args) {
System.out.println(InitalizedClass.INITIALIZED_VARIBLE);
}
}