使用final关键字修饰一个变量时,是指引用变量不能变,但是引用变量所指向的对象中的内容还是可以改变的。
public class Demo2 { //声明一个final关键字修饰的字符串 public static final StringBuffer sb = new StringBuffer("abc"); public static void main(String[] args) { // TODO Auto-generated method stub //sb指向新的引用对象 sb = new StringBuffer("def"); } } 复制代码
上述代码的运行结果出现报错:
接着看这样的代码:
public class Demo2 { //声明一个final关键字修饰的字符串 public static final StringBuffer sb = new StringBuffer("abc"); public static void main(String[] args) { // TODO Auto-generated method stub //sb指向新的引用对象 //sb = new StringBuffer("def"); System.out.println(sb); //修改sb引用对象的值 sb.append("def"); System.out.println(sb); } } 复制代码
运行结果如下图所示:
其实这个还是跟final关键字的使用有关。final关键字除了可以修饰类和方法以外,final关键字还可以用来修饰变量,其中包括基本数据类型的值变量和引用变量。
final修饰的变量其实就相当于定义了一个常量,无法被修改的变量。
如果final修饰的是一个基本数据类型的值变量,那么这个变量的值就定了,不能变了,比如final int i=10;那么就是在栈内存中对i变量赋值为10,这个值是不能改变的了;
而如果final关键字修饰的是一个引用变量,那么该变量在栈内存中存的是一个内存地址,该地址就不能变了,但是该内存地址所指向的那个对象还是可以变的。
如果拿去买房为例的话,对于基本数据类型的变量,房格就好比是被final修饰的基本数据类型的变量,一旦定死了就不能修改了(虽然现实中可以修改的);而对于引用变量,这个地皮(栈内存地址)一旦规划作为住宅用地了,那么便不可以再做其他用途(引用不能指向其他的对象),但是在这个地址上盖什么样的房子,多少房子是可以改变的(引用对象的内容可以改变)
所以使用final关键字修饰一个变量时,是指引用变量不能变,但是引用变量所指向的对象中的内容还是可以改变的。你,学废了吗?