看到的一个小例子,如程序1会报NullPointerException。
听过一些讲解,说是变量初始化顺序的问题。改为程序2,就不再报错了。
但我还不是很清楚,到底为什么,执行时,到底是什么顺序。还有一个问题就是,如果我在程序1中,将private static final Boolean LIVING = true;这一行的Boolean改为小boolean,程序1也不再报错了。
我就很困惑,Boolean和boolean到底有什么不同,同样定义了一个静态变量,改成小boolean,不需要像程序2那样改变定义顺序,就可以不报错了呢?程序1:
public class Elvis{ public static final Elvis ELVIS = new Elvis();private Elvis(){};
private static final Boolean LIVING = true;
private final Boolean alive = LIVING;public final Boolean lives(){
return alive;
}public static void main(String[] args) {
System.out
.println(ELVIS.lives() ? "Hound dog" : "Heartbreak hotel");}
}程序2:
public class Elvis2{ private Elvis2(){};
private static final Boolean LIVING = true;
private final Boolean alive = LIVING;public static final Elvis2 ELVIS = new Elvis2();public final Boolean lives(){
return alive;
}public static void main(String[] args) {
System.out
.println(ELVIS.lives() ? "Hound dog" : "Heartbreak hotel");}
}
听过一些讲解,说是变量初始化顺序的问题。改为程序2,就不再报错了。
但我还不是很清楚,到底为什么,执行时,到底是什么顺序。还有一个问题就是,如果我在程序1中,将private static final Boolean LIVING = true;这一行的Boolean改为小boolean,程序1也不再报错了。
我就很困惑,Boolean和boolean到底有什么不同,同样定义了一个静态变量,改成小boolean,不需要像程序2那样改变定义顺序,就可以不报错了呢?程序1:
public class Elvis{ public static final Elvis ELVIS = new Elvis();private Elvis(){};
private static final Boolean LIVING = true;
private final Boolean alive = LIVING;public final Boolean lives(){
return alive;
}public static void main(String[] args) {
System.out
.println(ELVIS.lives() ? "Hound dog" : "Heartbreak hotel");}
}程序2:
public class Elvis2{ private Elvis2(){};
private static final Boolean LIVING = true;
private final Boolean alive = LIVING;public static final Elvis2 ELVIS = new Elvis2();public final Boolean lives(){
return alive;
}public static void main(String[] args) {
System.out
.println(ELVIS.lives() ? "Hound dog" : "Heartbreak hotel");}
}
解决方案 »
- 关于HttpUrlconnection类的问题,我不是很了解http请求
- vector和hashMap如何结合使用?
- 请教一下poi怎么超链接单元格
- 用java还原mysql数据库。
- [入门级]final int[] p;是不是说p是个常引用(指针)?
- applet中怎样设置画线的宽度?
- 怎么在win200上配置环境??
- 那种股票系统的客户端是怎样找到服务器的数据库的?
- tomcat下,将Bean放在什么地方?
- PreparedStatement 中文怎么翻译,理解成什么?
- 关于java如何显示特殊字符♖♘♗♕♔♙的问题!
- 请教 Swing中updateUI,revalidate,repaint的区别?
楼主【s200182078】截止到2008-07-17 17:12:31的历史汇总数据(不包括此帖):
发帖的总数量:0 发帖的总分数:0 每贴平均分数:0
回帖的总数量:0 得分贴总数量:0 回帖的得分率:0%
结贴的总数量:0 结贴的总分数:0
无满意结贴数:0 无满意结贴分:0
未结的帖子数:0 未结的总分数:0
结贴的百分比:---------------------结分的百分比:---------------------
无满意结贴率:---------------------无满意结分率:---------------------
如何结贴请参考这里:http://topic.csdn.net/u/20080501/09/ef7ba1b3-6466-49f6-9d92-36fe6d471dd1.html
Boolean是类,boolean是基本数据类型。八种基本的数据类型都有其各自的包装类。
private static final Boolean LIVING = true;(2)
private final Boolean alive = LIVING;(3)
根Boolean和boolean的区别没什么关系,看上面的代码,因为前两行都是static的,所以初始化顺序是从上到下,在创建ELVIS对象的时候,会用到private final Boolean alive = LIVING;这一句,但是因为现在正在执行第一句,所以第二句还没执行到,这时候LIVING仍然是null,所以alive也是null。最后会在代码中出现空指针异常。
交换一下第二句和第一句的顺序问题就解决了。
package test;public class Elvis { private static final Boolean LIVING = true; //注意static初始化的执行顺序
public static final Elvis ELVIS = new Elvis();//创建ELVIS 对象过程中要创建实例变量alive,用到static变量LIVING,
//所以必须保证LIVING在此之前初始化,所以上面一句如果挪到后面,则初始化alive时LIVING仍然为空。 private Elvis() {
}
private final Boolean alive = LIVING; public final Boolean lives() {
return alive;
} public static void main(String[] args) {
System.out.println(ELVIS.lives() ? "Hound dog" : "Heartbreak hotel"); }
}
private static final boolean LIVING = true; //只更改这行的Boolean为boolean就可以
private final Boolean alive = LIVING; public final Boolean lives(){
return alive;
} public static void main(String[] args) {
System.out
.println(ELVIS.lives() ? "Hound dog" : "Heartbreak hotel"); }
}
是一个基本类型,在编译的时候已经放到常量区里去了