本文主要是介绍使用 final 修饰一个变量时,是引用不能变还是引用的对象不能变?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
在 Java 中,使用 final
关键字修饰一个变量时,表示这个变量的引用不能改变,即一旦初始化之后,不能再指向其他对象。但是,这并不意味着引用所指向的对象本身是不可变的。该对象的内容仍然可以被修改。
详细解释
引用不可变 vs 对象不可变
-
引用不可变:
-
当一个变量被
final
修饰时,这个变量的引用一旦被初始化之后,就不能再被赋值为其他引用。这意味着你不能让这个引用指向另一个对象。 -
示例:
-
public class FinalReferenceExample {public static void main(String[] args) {final StringBuffer buffer = new StringBuffer("immutable");// 不能改变引用// buffer = new StringBuffer("new buffer"); // 编译错误// 可以修改引用对象的内容buffer.append(" broken!");System.out.println(buffer); // 输出 "immutable broken!"}
}
-
对象不可变:
-
final
修饰的引用变量指向的对象的内容是否可变,取决于该对象本身是否提供修改其内容的方法。如果对象是可变的(如StringBuffer
),则对象的内容仍然可以修改。 -
示例:
-
public class ImmutableReferenceExample {public static void main(String[] args) {final StringBuffer buffer = new StringBuffer("immutable");// 可以修改引用对象的内容buffer.append(" broken!");System.out.println(buffer); // 输出 "immutable broken!"}
}
方法参数中的 final
当你将方法参数声明为 final
,表示在方法内部不能改变这个参数引用的对象,但对象的内容仍然可以被修改。
-
不能改变引用:
public class FinalParameterExample {public void method(final StringBuffer param) {// 不能改变引用// param = new StringBuffer("new buffer"); // 编译错误}
}
-
可以改变对象的内容:
public class FinalParameterExample {public void method(final StringBuffer param) {// 可以改变引用对象的内容param.append(" modified!");}public static void main(String[] args) {FinalParameterExample example = new FinalParameterExample();StringBuffer buffer = new StringBuffer("original");example.method(buffer);System.out.println(buffer); // 输出 "original modified!"}
}
总结
- 使用
final
修饰变量时,表示该变量引用一旦被初始化,就不能再指向其他对象。 final
修饰的引用指向的对象的内容仍然可以被修改(如果该对象是可变的)。- 将方法参数声明为
final
,表示在方法内部不能改变该参数引用的对象,但该对象的内容仍然可以被修改。
这篇关于使用 final 修饰一个变量时,是引用不能变还是引用的对象不能变?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!