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

简介: 使用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");
  }
}
复制代码


上述代码的运行结果出现报错:


a6c36a98fb4a4ae78f5d22e389311663~tplv-k3u1fbpfcp-zoom-in-crop-mark_1304_0_0_0.webp.jpg


接着看这样的代码:


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);
  }
}
复制代码


运行结果如下图所示:


bb7088fc70374cb18fa8786e9f1aef20~tplv-k3u1fbpfcp-zoom-in-crop-mark_1304_0_0_0.webp.jpg


其实这个还是跟final关键字的使用有关。final关键字除了可以修饰类和方法以外,final关键字还可以用来修饰变量,其中包括基本数据类型的值变量和引用变量。


final修饰的变量其实就相当于定义了一个常量,无法被修改的变量。


如果final修饰的是一个基本数据类型的值变量,那么这个变量的值就定了,不能变了,比如final int i=10;那么就是在栈内存中对i变量赋值为10,这个值是不能改变的了;


而如果final关键字修饰的是一个引用变量,那么该变量在栈内存中存的是一个内存地址,该地址就不能变了,但是该内存地址所指向的那个对象还是可以变的。


如果拿去买房为例的话,对于基本数据类型的变量,房格就好比是被final修饰的基本数据类型的变量,一旦定死了就不能修改了(虽然现实中可以修改的);而对于引用变量,这个地皮(栈内存地址)一旦规划作为住宅用地了,那么便不可以再做其他用途(引用不能指向其他的对象),但是在这个地址上盖什么样的房子,多少房子是可以改变的(引用对象的内容可以改变)

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

目录
相关文章
|
8月前
|
存储 Java 编译器
【Java变量】 局部变量、成员变量(类变量,实例变量)、方法参数传递机制
【Java变量】 局部变量、成员变量(类变量,实例变量)、方法参数传递机制
104 0
|
8月前
|
设计模式 算法 安全
【C/C++ 关键字 函数说明符 】C++ final关键字(修饰成员函数无法被子类重写覆盖)
【C/C++ 关键字 函数说明符 】C++ final关键字(修饰成员函数无法被子类重写覆盖)
166 1
|
6月前
|
存储 Java
成员变量与实例变量的区别与用途详解
成员变量与实例变量的区别与用途详解
|
8月前
|
编译器 C++
C++ 解引用与函数基础:内存地址、调用方法及声明
C++ 中的解引用允许通过指针访问变量值。使用 `*` 运算符可解引用指针并修改原始变量。注意确保指针有效且不为空,以防止程序崩溃。函数是封装代码的单元,用于执行特定任务。理解函数的声明、定义、参数和返回值是关键。函数重载允许同一名称但不同参数列表的函数存在。关注公众号 `Let us Coding` 获取更多内容。
202 1
|
8月前
引用构造器练习
引用构造器练习
59 0
|
Java 编译器 C语言
【C++】类与对象 (四)初始化列表 static成员 友元 内部类 匿名对象 拷贝对象时的一些编译器优化(2)
【C++】类与对象 (四)初始化列表 static成员 友元 内部类 匿名对象 拷贝对象时的一些编译器优化(1)
【C++】类与对象 (四)初始化列表 static成员 友元 内部类 匿名对象 拷贝对象时的一些编译器优化(1)
【C++】类与对象 (四)初始化列表 static成员 友元 内部类 匿名对象 拷贝对象时的一些编译器优化
方法引用符、引用类方法、引用对象的实例方法、引用类的实例方法及引用构造器
方法引用符、引用类方法、引用对象的实例方法、引用类的实例方法及引用构造器
100 0
|
存储
局部变量和成员变量的4个区别
定义位置不同、内存中的位置不同、周期不同、初始化不同。
128 0