Final 修饰字段时,之前一个模糊的概念是它使变量不可变,然而下面的情况呢?
可以看见,被 final 修饰后,变量还是改变了,何以如此?见注释。
package javaDetail.finalKeyWord;
public class AboutFinal {
// here we use the final key word,but find that it still can be changed.
static final StringBuffer sb = new StringBuffer("hello,world");
/**
* you will find that sb's value has been changed,why,isn't it that the
* variable "sb" is final,and can not be changed.
* <p>
* "final" 's effect on reference type is :we keep the variable's reference
* unchangeable(it always point to the same place in memory),while,as for
* the object it referred to,we can't promise that it will not change.
* <p>
* so,here the thing that has been changed is the object this
* pointer(variable,I think in java,reference type variable is quite like
* pointer) point to.The variable it self,has not been changed.
* <p>
* while,if you try to change the final variable(as the line that has been
* commented try to do),you will get the error : The final field Final.sb
* cannot be assigned.
*
* @param args
*/
public static void main(String[] args) {
// sb = new StringBuffer("hello,world");
sb.append("hello,world");
System.out.println(sb);//the result is :[hello,worldhello,world] do not you feel surprised?
}
}
实际上是:
final 修饰Object时,只能确保引用不变,即至始至终指向同一片内存单元(好像指针啊),有点从一而终的意思,但要命的是,不能保证我指向的那家伙就会不变,这儿就是如此,我始终指向的是那一处不错,可是那儿的StringBuffer的值 却变了,那也是没办法的事情。
另外注意main()函数中被注释掉的第一行
//sb = new StringBuffer("hello,world");
它试图让sb指向另一处地址,这就是试图修改sb的指向了,那怎么能行?试一下,发现确实不行,会有编译错误。
分享到:
相关推荐
了解这些 `final` 关键字的知识点对于编写高效、安全的 Java 代码至关重要,特别是在设计不可变类和保证代码行为不变性时。通过正确使用 `final`,开发者可以增强代码的可维护性,减少潜在的错误,并提升程序的整体...
- 对于对象引用,`final`关键字并不保证对象内的状态不可变,仅保证引用本身不变。因此,对于复杂对象,如果需要确保对象状态不可变,还需要配合不可变对象的设计原则。 总的来说,`final`关键字是Java中的一种强...
Java中的`final`关键字、抽象类和接口是面向对象编程中的核心概念,它们共同构建了类的层次结构和多态性。以下是对这些概念的详细解释: 1. **final关键字** - `final`关键字用于确保变量的值一旦被赋值后就不能...
在Java编程语言中,`final`关键字扮演着一个至关重要的角色,它被广泛用于定义不可变对象、常量以及固定行为。本篇文章将深入探讨`final`关键字在Java中的使用和重要性,帮助开发者更好地理解和应用这一关键特性。 ...
总结来说,`final`和`static`关键字在Java中扮演着关键角色,`final`用于保证不变性和防止覆盖,而`static`用于定义类级别的成员,简化访问和管理。理解并正确使用这两个关键字对于编写高效、可维护的Java代码至关...
- 进一步了解与final关键字相关的高级主题,如不可变类和Enum枚举等内容。 - 参考Java官方文档或技术论坛,以解决任何疑问并深入理解final关键字的使用。 通过上述内容的学习和实践,读者不仅能够熟练掌握final...
Java中的`final`关键字是一个...总结来说,`final`关键字在Java中扮演着确保数据不变性和控制继承的角色,帮助开发者维护代码的稳定性和安全性。理解并恰当使用`final`关键字对于编写健壮、高效的Java代码至关重要。
在Java编程语言中,`final`关键字扮演着非常重要的角色,它有多种用途,用于创建不可改变的对象、变量和类。下面将详细讲解`final`关键字的五种主要使用方式。 1. **常量(Final Variables)** `final`关键字可以...
在Java编程中,使用`final`关键字能够帮助我们确保某些代码的行为是不可变的,从而增加代码的稳定性和安全性。 1. **final变量** - **成员变量**:当`final`修饰类的成员变量时,它必须在构造函数执行完毕前被初始...
Java中的final关键字是一个非常重要的修饰符,它用于声明变量、方法和类,确保它们在程序执行期间保持不变。final关键字在Java编程中的应用广泛,可以帮助提高代码的稳定性和可维护性。 1. **常量的声明** final...
通常,这类常量数据都是基本类型的数据,并赋予关键字final,同时在对此常量定义时需要进行赋值。 值得注意的是:对于基本类型,使用final关键字将使数值恒定不变;而对于对象引用,final则是使引用恒定不变。...
final关键字是Java语言中的一个基本概念,它用于限制类、变量、方法以及引用的修改和扩展。final关键字的主要作用是告诉编译器该元素是最终的,不可变的。对于初学者来说,掌握final关键字的使用可以帮助编写出更加...
本文将深入探讨Java中的`final`关键字以及C#中的`const`和`readonly`关键字,了解它们如何分别实现编译时常量和运行时不可变性。 ### Java中的`final`关键字 #### 1. 编译器常量 在Java中,`final`关键字可以用来...
【JavaSE之final关键字与成员变量的类型】 在Java编程语言中,`final`关键字扮演着重要的角色,它表示“最终”或“不可改变”的特性。对于初学者来说,理解`final`的关键字用法是掌握JavaSE基础的重要一步。本篇...
Java中的`final`关键字是一个非常重要的修饰符,用于在编程中实现不同的限制和特性。它可以在类、方法和变量上使用,确保代码的特定部分保持不可更改或不可重定义。 一、final修饰类 当`final`关键字用于类时,它...
Java中的`final`关键字在编程中扮演着重要的角色,它可以用于修饰变量、方法和类,确保被修饰的内容在特定条件下不可变。以下将详细阐述`final`关键字在不同场景下的应用及其特点。 **一、final修饰变量** 1. **...
### Final关键字详解 #### 一、Final的基本概念...通过上述讨论,我们可以看出`final`关键字在Java编程中的重要作用及其与其他关键字之间的区别。正确理解并使用`final`可以帮助开发者编写更加健壮和易于维护的代码。
Java中的`final`关键字是一个非常重要的概念,它用于声明不可变的类、方法或变量,以确保代码的稳定性和安全性。下面将详细讲解`final`关键字的用途和使用细节。 一、`final`关键字的基本用法 1. 修饰类 当一个类...
总结来说,`final`关键字在Java中扮演了多种角色,包括创建不可变变量、常量、对象和数组,确保方法和类的不可覆盖性,以及在多线程环境中的安全性。正确使用`final`能够提高代码的清晰度、稳定性和性能。
final 变量的变与不变是一个重要的问题。有人说 final 变量在赋值后就不可变,但这个不变到底指的是什么呢?这个不变指的是引用,是地址,而所引用的对象的内容仍然是可变的。就是说,这个 final 变量的引用是不能...