`
beefcow
  • 浏览: 44147 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
最近访客 更多访客>>
社区版块
存档分类
最新评论

Java关键字Final的变与不变

阅读更多

     

     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的指向了,那怎么能行?试一下,发现确实不行,会有编译错误。

 

 

 

 

2
3
分享到:
评论

相关推荐

    有关Java中关键字final的理解

    通常,这类常量数据都是基本类型的数据,并赋予关键字final,同时在对此常量定义时需要进行赋值。  值得注意的是:对于基本类型,使用final关键字将使数值恒定不变;而对于对象引用,final则是使引用恒定不变。...

    Java关键字总结

    总结了Java学习中的52个关键字(包括一些总结),如果觉得自己Java基础知识需要总结一下的,可以下载下来瞧瞧 1.final数据: 1&gt;对于基本类型前加以final修饰,表示被修饰的变量为常数,不可以修改。一个既是static有...

    java 编程入门思考

    15.6 Java与CGI的沟通 15.6.1 CGI数据的编码 15.6.2 程序片 15.6.3 用C++写的CGI程序 15.6.4 POST的概念 15.7 用JDBC连接数据库 15.7.1 获得学习示例 15.7.2 查找程序的GUI版本 15.7.3 JDBC API为何如何复杂 15.8 ...

    Java初学者入门教学

    15.6 Java与CGI的沟通 15.6.1 CGI数据的编码 15.6.2 程序片 15.6.3 用C++写的CGI程序 15.6.4 POST的概念 15.7 用JDBC连接数据库 15.7.1 获得学习示例 15.7.2 查找程序的GUI版本 15.7.3 JDBC API为何如何复杂 15.8 ...

    java联想(中文)

    15.6 Java与CGI的沟通 15.6.1 CGI数据的编码 15.6.2 程序片 15.6.3 用C++写的CGI程序 15.6.4 POST的概念 15.7 用JDBC连接数据库 15.7.1 获得学习示例 15.7.2 查找程序的GUI版本 15.7.3 JDBC API为何如何复杂 15.8 ...

    JAVA_Thinking in Java

    15.6 Java与CGI的沟通 15.6.1 CGI数据的编码 15.6.2 程序片 15.6.3 用C++写的CGI程序 15.6.4 POST的概念 15.7 用JDBC连接数据库 15.7.1 获得学习示例 15.7.2 查找程序的GUI版本 15.7.3 JDBC API为何如何复杂 15.8 ...

    Thinking in Java 中文第四版+习题答案

    15.6 Java与CGI的沟通 15.6.1 CGI数据的编码 15.6.2 程序片 15.6.3 用C++写的CGI程序 15.6.4 POST的概念 15.7 用JDBC连接数据库 15.7.1 获得学习示例 15.7.2 查找程序的GUI版本 15.7.3 JDBC API为何如何复杂 15.8 ...

    Thinking in Java简体中文(全)

    15.6 Java与CGI的沟通 15.6.1 CGI数据的编码 15.6.2 程序片 15.6.3 用C++写的CGI程序 15.6.4 POST的概念 15.7 用JDBC连接数据库 15.7.1 获得学习示例 15.7.2 查找程序的GUI版本 15.7.3 JDBC API为何如何复杂 15.8 ...

    Java的六大问题你都懂了吗

     final使得被修饰的变量"不变",但是由于对象型变量的本质是"引用",使得"不变"也有了两种含义:引用本身的不变,和引用指向的对象不变。  引用本身的不变:  final StringBuffer a=new StringBuffer("immutable...

    JAVA_Thinking in Java(中文版 由yyc,spirit整理).chm

    15.6 Java与CGI的沟通 15.6.1 CGI数据的编码 15.6.2 程序片 15.6.3 用C++写的CGI程序 15.6.4 POST的概念 15.7 用JDBC连接数据库 15.7.1 获得学习示例 15.7.2 查找程序的GUI版本 15.7.3 JDBC API为何如何复杂 15.8 ...

    Think in Java(中文版)chm格式

    15.6 Java与CGI的沟通 15.6.1 CGI数据的编码 15.6.2 程序片 15.6.3 用C++写的CGI程序 15.6.4 POST的概念 15.7 用JDBC连接数据库 15.7.1 获得学习示例 15.7.2 查找程序的GUI版本 15.7.3 JDBC API为何如何复杂...

    Thinking in Java(中文版 由yyc,spirit整理).chm

    15.6 Java与CGI的沟通 15.6.1 CGI数据的编码 15.6.2 程序片 15.6.3 用C++写的CGI程序 15.6.4 POST的概念 15.7 用JDBC连接数据库 15.7.1 获得学习示例 15.7.2 查找程序的GUI版本 15.7.3 JDBC API为何如何复杂 15.8 ...

    Java测试题4答案

    《Java测试题4》 &lt;br&gt;Java练习题 一、填空 1、 对象的状态和行为是对象的主要属性;前者对应类的 ,行为又称为对象的操作,对应着类的 。类的定义包括 声明和 声明。 2、 要嵌入在HTML文件中运行的程序...

    2Java SE(上).doc

    2. 字符串是不变对象:字符串对象一旦创建,内容是不可改变的,要想改变内容一定会创建新对象。 字符串若使用字面量形式创建对象,会重用以前创建过的内容相同的字符串对象。 使用new关键字创建的字符串对象...

    ThinkInJava

    15.6 Java与CGI的沟通 15.6.1 CGI数据的编码 15.6.2 程序片 15.6.3 用C++写的CGI程序 15.6.4 POST的概念 15.7 用JDBC连接数据库 15.7.1 获得学习示例 15.7.2 查找程序的GUI版本 15.7.3 JDBC API为何如何复杂 15.8 ...

    【05-面向对象(下)】

    •但对引用类型的变量而言,它仅仅保存的是一个引用,final只能保证他的地址不变,但不能保证对象,所以引用 类型完全可以改变他的对象。 可执行“宏替换”的final变量 •对一个final变量来说,不管它...

    thinkinjava

    15.6 Java与CGI的沟通 15.6.1 CGI数据的编码 15.6.2 程序片 15.6.3 用C++写的CGI程序 15.6.4 POST的概念 15.7 用JDBC连接数据库 15.7.1 获得学习示例 15.7.2 查找程序的GUI版本 15.7.3 JDBC API为何如何复杂 15.8 ...

    Scala程序设计(第2版)

    22.4 AnyVal类型与Java原生类型 433 22.5 Java代码中的Scala名称 433 22.6 本章回顾与下一章提要 434 第23章 应用程序设计 435 23.1 回顾之前的内容 435 23.2 注解 437 23.3 Trait即模块 441 ...

    javaSE代码实例

    第5章 数组——以不变应万变的哲学 59 5.1 数组的声明及创建 59 5.1.1 声明数组引用 59 5.1.2 创建数组对象 60 5.2 Java中数组的实现机制 61 5.3 数组的初始化 63 5.3.1 默认初始化 63 5.3.2 利用...

    Swift中的let和var背后的编程模式

    在Java中,通常用static和final一起来定义常量,其中static用于指明其是静态的,final用于指明其是不变的。Java中,我们有多种定义常量的方法:接口中定义,类中定义,使用枚举实现。这些方法之间

Global site tag (gtag.js) - Google Analytics