被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?
下面这段代码中
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?
解决方案 »
- 关于java的classpath和包的问题
- 随机获得数组String s[] = {"gequ1","gequ2","gequ3","gequ4"};中的字符串,要不重复的,分别赋值给单选按钮的4个选项
- 我用JAVA 连SQL 2000 总是报错误,麻烦大家帮忙看下,高手指点指点。
- 写一个接口,给人家用httpclient请求,然后以xml形式返回给给人家
- [咨询]如何开发象eclipse界面一样的Java程序
- 初学java网络编程,请教基本问题
- 重大发现,java中的paint机制相当于C中的callback回调函数.
- 怎么得到系统昨天的时间?
- 创建子类对象的同时到底有没有创建父类对象啊?
- swing组件问题
- Java EXCeption和compilation fails区别
- GUI基础
final StringBuffer b=new StringBuffer("not immutable");
a=b;//编译期错误 引用指向的对象不变:final StringBuffer a=new StringBuffer("immutable");
a.append(" broken!"); //编译通过 可见,final只对引用的“值”(也即它所指向的那个对象的内存地址)有效,它迫使引用只能指向初始指向的那个对象,改变它的指向会导致编译期错误。至于它所指向的对象的变化,final是不负责的。这很类似==操作符:==操作符只负责引用的“值”相等,至于这个地址所指向的对象内容是否相等,==操作符是不管的。 理解final问题有很重要的含义。许多程序漏洞都基于此----final只能保证引用永远指向固定对象,不能保证那个对象的状态不变。在多线程的操作中,一个对象会被多个线程共享或修改,一个线程对对象无意识的修改可能会导致另一个使用此对象的线程崩溃。一个错误的解决方法就是在此对象新建的时候把它声明为final,意图使得它“永远不变”。其实那是徒劳的。
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 错误
id = counter;
counter = counter + 1;