final 关键字

NetMatrix 2010-07-31 12:27:41
被final修饰的变量不是相当于常量吗?
下面这段代码中
public class Coffee {
private static final long counter = 0;
private final long id = counter++;

public String toString(){
return getClass().getSimpleName()+" "+id;
}
}
既然id被final修饰,为什么可以把counter++赋值给id?
...全文
145 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
prince_java 2010-07-31
  • 打赏
  • 举报
回复
被final修饰的变量只能被赋值一次,Id虽然被final修饰,但是还是可以赋值的
xuehaozhuangye2012 2010-07-31
  • 打赏
  • 举报
回复
这是我借用别人的文字: 看了你应该比较清楚·~~ final是你原来理解错了···

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

  引用本身的不变:

final StringBuffer a=new StringBuffer("immutable");
final StringBuffer b=new StringBuffer("not immutable");
a=b;//编译期错误

  引用指向的对象不变:

final StringBuffer a=new StringBuffer("immutable");
a.append(" broken!"); //编译通过

  可见,final只对引用的“值”(也即它所指向的那个对象的内存地址)有效,它迫使引用只能指向初始指向的那个对象,改变它的指向会导致编译期错误。至于它所指向的对象的变化,final是不负责的。这很类似==操作符:==操作符只负责引用的“值”相等,至于这个地址所指向的对象内容是否相等,==操作符是不管的。

  理解final问题有很重要的含义。许多程序漏洞都基于此----final只能保证引用永远指向固定对象,不能保证那个对象的状态不变。在多线程的操作中,一个对象会被多个线程共享或修改,一个线程对对象无意识的修改可能会导致另一个使用此对象的线程崩溃。一个错误的解决方法就是在此对象新建的时候把它声明为final,意图使得它“永远不变”。其实那是徒劳的。
czmchen 2010-07-31
  • 打赏
  • 举报
回复
The final field Coffee.counter cannot be assigned
duannianping 2010-07-31
  • 打赏
  • 举报
回复
哈哈,这是真确的啊,counter++就相当于0++啊,counter++并没有改变counter
Kwok 2010-07-31
  • 打赏
  • 举报
回复
static final 是在内存加载期间就已经初始化的,仅一次,所以,你的第二个初始化时,counter就不能在自加了!!!
pywepe 2010-07-31
  • 打赏
  • 举报
回复
等价于
id = counter;
counter = counter + 1;
avalon 2010-07-31
  • 打赏
  • 举报
回复

public class Coffee {
private static final long counter = 0;
private final long id = counter++;

public String toString(){
return getClass().getSimpleName()+" "+id;
}
}

counter是long类型,普通数据类型;id也是long类型,普通数据类型。final修饰的变量只能被赋值一次,其值(引用也算是值的一种)不能被改变。
在"private final long id = counter++;"中:id=counter++这语句首先是把counter的值赋值给id,此时id=0,但是counter++会改变counter的值,前面已经给counter赋值了,因此这个程序过不了编译!情况如下:

E:\Demo\Test>javac Coffee.java
Coffee.java:3: 无法为最终变量 counter 指定值
private final long id = counter++; ^
1 错误
czmchen 2010-07-31
  • 打赏
  • 举报
回复
[Quote=引用楼主 chana1101 的回复:]
被final修饰的变量不是相当于常量吗?
下面这段代码中
public class Coffee {
private static final long counter = 0;
private final long id = counter++;

public String toString(){
return getClass().getSimpleName()+" "+id;……
[/Quote]


counter++会改变counter的值,可是你声明为static final的变量,这个变量的值是不能改变的!按规则来说是不能正常编译通过的

lz的程序没报错吗?
wzju64676266 2010-07-31
  • 打赏
  • 举报
回复
final 修饰的变量counter引用不能变,counter++并没有改变couter的引用,在counter=anotherValue的情况下会报错

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧