使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变

548 阅读3分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动

作者的其他平台:

| CSDN:blog.csdn.net/qq_4115394…

| 掘金:juejin.cn/user/651387…

| 知乎:www.zhihu.com/people/1024…

| GitHub:github.com/JiangXia-10…

| 公众号:1024笔记

本文大概1489字读完共需8分钟

使用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关键字修饰一个变量时,是指引用变量不能变,但是引用变量所指向的对象中的内容还是可以改变的。你,学废了吗?

相关推荐: