学习《Design Patterns in java》的immutable object时,产生了以下疑惑:
public final class EmployeeModel {
private final String firstName;
private final String lastName;
//书上是按上面方式定义的,运行正常
//我改动成下面的样子
//private static final String firstName;
//private static final String lastName;
//结果出错,显示“空白终态字段 firstName 可能尚未初始化”
//然后我又改成下面的样子
//private static String firstName;
//private static String lastName;
//结果运行正常
public EmployeeModel(String fn,String ln)
{
firstName=fn;
lastName=ln;
}
public String getFirstName(){
return firstName;
}
public String getLastName(){
return lastName;
}
}
第一种情况我无法理解为什么运行正常,因为final不是应该“在定义的时候必须初始化”吗?
既然第一种和第三种情况都运行正常,那为什么第二种情况又出错了呢?
麻烦解释一下出现这种情况的原因
public final class EmployeeModel {
private final String firstName;
private final String lastName;
//书上是按上面方式定义的,运行正常
//我改动成下面的样子
//private static final String firstName;
//private static final String lastName;
//结果出错,显示“空白终态字段 firstName 可能尚未初始化”
//然后我又改成下面的样子
//private static String firstName;
//private static String lastName;
//结果运行正常
public EmployeeModel(String fn,String ln)
{
firstName=fn;
lastName=ln;
}
public String getFirstName(){
return firstName;
}
public String getLastName(){
return lastName;
}
}
第一种情况我无法理解为什么运行正常,因为final不是应该“在定义的时候必须初始化”吗?
既然第一种和第三种情况都运行正常,那为什么第二种情况又出错了呢?
麻烦解释一下出现这种情况的原因
解决方案 »
- 关于Hibernate更新的问题
- 安装好jdk 为什么要在系统属性中设置环境变量擦了classpath?有啥用呢?
- 急求上传功能的代码(是用纯java )
- ### 动态显示上传文件的进度的简单实现 ####
- 请教:在Javascript中用escape对字符串编码,用unescape进行解码。在java中有没有等同於escape的方法?
- 菜鸟的问题。
- 为什么Applet中,函数可以直接用Graphics类,却不能在函数内声明它的对象
- 请问如何解决,小程序没有初始化的错误?急需
- vj中如何连接sqlserver???(直连接不是jdbc-odbc)
- 请帮帮忙,不用注册,在哪能下载JDK1.2?
- 扫雷游戏遇到的问题
- struts2写一个超简易论坛,求部分思路
你把它声明成static后,它不能在构造器里面初始化,转而要用静态代码块才能初始化:static{
firstName=...;
}
private static final String firstName;
private static final String lastName;
static{
firstName = "";
lastName = "";
}这样就不会报错了,因为static是独立于对象实例的,static的final变量,要么在静态代码块里面进行初始化,要么在定义的时候进行初始化。
而非static的final变量,要么在构造函数进行初始化,要么在实例代码块进行初始化。
总之,final变量在为初始化之前不能使用。
class A{
static int b;
A(int b){
this.b=b;
}
void display(){
System.out.println(b);
}
}public class Test{
public static void main(String[] args){
System.out.println(A.b);
new A(8).display();
System.out.println(A.b);
}
}结果是:
0
8
8
说明static变量可以不赋值,因为系统会自动給它赋0.然后就可以在构造函数中再改变它的值了
个人认为 和加载时间有关:
一个是在实例化的时候
一个是在类加载的时候private final String firstName;
这个要在构造器中初始化private static final String firstName;
这个要在声名的地方初始化
1,final类型变量,必须在定义的时候赋值或者在构造函数里赋值,否则报错;
2,static类型变量,应该在定义时赋值,要是不给它赋值,int型的变量系统会自动給它赋0值
3,static final类型变量,因为加了final,所以系统不会自动給它赋值,只能在定义时赋值或者在static块中給它赋值
欢迎高手指点
==============
这句话感觉有问题,JAVA默认就是给0,你加了static final也是一样
但是由于加了final就必须给他赋值,否则编译错误
又由于加了static,你可以不创建对象访问属性如A.b,所以你在构造函数中赋值相当于这个情况依然没被赋值,final就会出错
而静态赋值的时候,你使用A.b访问依然是被赋值的
java 中final定义的成员变量 并不一定必须在定义的时候初始化,final本身的含义是一旦赋值以后不可更改变量的值,final定义的变量只要在实际的类的对象在使用前得到初始化即可,例如上面例子中这两个final成员变量在构造方法中分别进行了初始化。
既然第一种和第三种情况都运行正常,那为什么第二种情况又出错了呢?
麻烦解释一下出现这种情况的原因static定义的成员变量跟具体的类对象无关,又加上final修饰符以后,必须在定义时就马上初始化,不知道lz明白了没,
你可以看下这个地址,讲的蛮清楚的
http://www.bianceng.cn/Programming/Java/200705/1523.htm这些都是java的一些基础,lz搞明白这些基础以后就不会混淆了