final变量所指向的对象不能被改变吗
时间: 2023-11-27 09:50:05 浏览: 30
对的,final关键字用于声明一个变量,表示该变量的值只能被赋值一次,一旦被赋值后,其值就不能再被修改。但是,如果 final变量指向的是一个对象,那么对象本身的状态可以被修改,只是这个变量不能再指向其他对象。例如:
```
final int a = 10; // a的值不能被修改
final List<String> list = new ArrayList<>(); // list不能再指向其他List对象
list.add("hello"); // 但是list指向的List对象可以被修改
```
相关问题
Java中,final关键字修饰的引用类型变量,其对象中的属性是不可以改变的吗
在Java中,final关键字修饰的引用类型变量,其引用不可变,即不能指向其他对象,但是其所指向的对象中的属性是可以改变的。这是因为final修饰的是变量而不是对象,也就是说,final修饰的是引用变量,而不是引用变量所指向的对象。
例如:
```
public class Test {
private final Person person = new Person("John", 20);
public void test() {
person.setName("Tom"); // 合法,修改了person所指向的对象中的属性
// person = new Person("Mike", 30); // 非法,final修饰的引用变量不能重新指向其他对象
}
}
```
在这个例子中,虽然person是用final修饰的,但是我们仍然可以通过person引用来修改其所指向的对象中的属性。但是,如果我们尝试将person重新指向其他对象,编译器会报错。
final修饰引用变量
在 Java 中,final 修饰的引用变量表示的是该引用变量所指向的对象不能被重新赋值。也就是说,final 修饰的引用变量仍然可以改变其所指向的对象的内部状态,但不能改变其指向的对象。
例如:
```java
final List<String> list = new ArrayList<>();
list.add("apple");
list.add("banana");
```
在上面的代码中,我们声明了一个 final 修饰的 List 引用变量 list,并将其初始化为一个 ArrayList 对象。虽然 list 引用变量不能被重新赋值,但我们仍然可以通过 list 引用变量调用其所指向的 ArrayList 对象的方法,修改其内部状态,例如添加元素。
但是,下面的代码是不合法的:
```java
final List<String> list = new ArrayList<>();
list = new LinkedList<>(); // 编译错误
```
在上面的代码中,我们试图将 final 修饰的 list 引用变量重新赋值为一个新的 LinkedList 对象,但是这是不合法的,因为 final 修饰的引用变量一旦被初始化后就不能被重新赋值。