简介

        本文介绍Java的final不可变的含义。

        final修饰的引用变量不能再指向别的地方,但是它指向的地方的数据是可以变的。

实例1:final不可变的含义

final修饰的引用变量不能再指向别的地方

Java--final不可变的含义_数据

它指向的地方的数据是可以变的

Java--final不可变的含义_开发语言_02

运行结果:

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]