面试题系列之使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变

使用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修饰的基本数据类型的变量,一旦定死了就不能修改了(虽然现实中可以修改的);而对于引用变量,这个地皮(栈内存地址)一旦规划作为住宅用地了,那么便不可以再做其他用途(引用不能指向其他的对象),但是在这个地址上盖什么样的房子,多少房子是可以改变的(引用对象的内容可以改变)

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_41153943/article/details/106018615