final修饰基本类型变量和引用变量区别

本文详细介绍了final关键字在Java中对基本数据类型及引用类型的作用,通过具体代码示例展示了final修饰符如何限制变量的重新赋值,同时允许引用类型的对象内容发生变化。

一 概念介绍

1 当使用final修饰基本数据类型时,不能对其重新赋值,不能被改变。

2 当使用final修饰引用类型变量时,它仅仅保证他的地址不变,即一直引用同一个对象,但这个对象完全可以发生改变。

 

二 final修饰引用类型变量应用

1 代码示例

import java.util.*;

class Person
{
	private int age;
	public Person(){}
	// 有参数的构造器
	public Person(int age)
	{
		this.age = age;
	}
	// 省略age的setter和getter方法
	// age的setter和getter方法
	public void setAge(int age)
	{
		this.age = age;
	}
	public int getAge()
	{
		return this.age;
	}
}
public class FinalReferenceTest
{
	public static void main(String[] args)
	{
		// final修饰数组变量,iArr是一个引用变量
		final int[] iArr = {5, 6, 12, 9};
		System.out.println(Arrays.toString(iArr));
		// 对数组元素进行排序,合法
		Arrays.sort(iArr);
		System.out.println(Arrays.toString(iArr));
		// 对数组元素赋值,合法
		iArr[2] = -8;
		System.out.println(Arrays.toString(iArr));
		// 下面语句对iArr重新赋值,非法
		// iArr = null;
		// final修饰Person变量,p是一个引用变量
		final Person p = new Person(45);
		// 改变Person对象的age实例变量,合法
		p.setAge(23);
		System.out.println(p.getAge());
		// 下面语句对p重新赋值,非法
		// p = null;
	}
}

2 运行结果

[5, 6, 12, 9]

[5, 6, 9, 12]

[5, 6, -8, 12]

23

3 结果分析

使用final修饰的引用不能被重新赋值,但可以改变引用类型所引用对象的内容。

<think>我们被要求回答问题后提出3-5个相关问题,且必须以“§§相关问题§§”开头并列出问题。 用户本次的问题是:“final修饰变量” 我们需要先解释final修饰变量的含义、用法注意事项,然后提出相关问题。 回答结构: 1. 解释final修饰变量基本概念 2. 说明final修饰局部变量、成员变量(静态非静态)的不同 3. 强调final变量的不可变性初始化要求 4. 可以给出简单的代码示例 然后,在最后输出“§§相关问题§§”并列出3-5个相关问题。 注意:问题要围绕final变量,可以扩展到相关概念,但不要离题。 </think>在Java中,`final`修饰变量表示该变量**只能被赋值一次**,其核心特性是**不可变性**。以下是详细解析: ### 一、`final`变量的特性 1. **基本类型变量** - 值不可修改(常量) ```java final int MAX_COUNT = 100; MAX_COUNT = 200; // 编译错误:无法为final变量赋值 ``` 2. **引用类型变量** - 引用地址不可修改(可修改对象内部状态) ```java final List<String> list = new ArrayList<>(); list.add("A"); // ✅ 允许修改对象内容 list = new ArrayList<>(); // ❌ 编译错误:无法修改引用地址 ``` ### 二、作用域与初始化规则 | 变量类型 | 初始化要求 | 示例 | |----------------|------------------------------|--------------------------| | **局部变量** | 使用前必须初始化 | `final int x; x=10;` ✅ | | **成员变量** | 必须在声明时或构造器中初始化 | 见下方Class示例 | | **静态变量** | 必须在声明时或静态块中初始化 | `static final int Y=20;`| ```java class Example { final int a = 1; // ✅ 声明时初始化 final int b; static final int c; Example() { b = 2; } // ✅ 构造器中初始化 static { c = 3; } // ✅ 静态块中初始化 } ``` ### 三、核心应用场景 1. **常量定义** ```java public static final double PI = 3.14159; ``` 2. **防止意外修改** 在方法参数中使用,确保传入对象不被替换: ```java void process(final List<String> data) { data = new ArrayList<>(); // ❌ 编译错误 } ``` 3. **线程安全支持** final变量初始化后对其他线程立即可见(无需同步) ### 四、特殊注意事项 1. **空白final(Blank Final)** 声明时不初始化,在构造器中初始化(允许多构造器不同初始化) ```java class BlankFinal { final int value; BlankFinal() { value = 1; } BlankFinal(int v) { value = v; } } ``` 2. **final与继承** - final变量 ≠ 常量表达式(编译时常量需满足特定条件) - 在匿名内部类中访问的局部变量必须声明为final
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值