简介
本文介绍Java的final不可变的含义。
final修饰的引用变量不能再指向别的地方,但是它指向的地方的数据是可以变的。
实例1:final不可变的含义
final修饰的引用变量不能再指向别的地方
它指向的地方的数据是可以变的
运行结果:
abcdefg
实例2:反射无法改对象的引用
package org.example.a;
import java.lang.reflect.Field;
class Test{
private final String str = "abc";
public String getStr() {
return str;
}
}
public class Demo {
public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
Test test = new Test();
System.out.println("改变前:str=" + test.getStr());
Field str = test.getClass().getDeclaredField("str");
str.setAccessible(true);
str.set(test, "def");
System.out.println("改变后:str=" + test.getStr());
}
}
执行结果
改变前:str=abc
改变后:str=abc
实例3:反射可以改数组引用
package org.example.a;
import java.lang.reflect.Field;
import java.util.Arrays;
class Test{
private final int[] arr = {1,2,3};
public int[] getArr() {
return arr;
}
}
public class Demo {
public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
Test test = new Test();
System.out.println("改变前:arr=" + Arrays.toString(test.getArr()));
Field arr = test.getClass().getDeclaredField("arr");
arr.setAccessible(true);
arr.set(test, new int[]{4,5,6});
System.out.println("改变后:arr=" + Arrays.toString(test.getArr()));
}
}
执行结果
改变前:arr=[1, 2, 3]
改变后:arr=[4, 5, 6]