看到的一个小例子,如程序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");}
}

解决方案 »

  1.   

    此回复为自动发出,仅用于显示而已,并无任何其他特殊作用
    楼主【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
      

  2.   

    Boolean和boolean到底有什么不同首先你要明确java中是区分大小写的,其次大写的Boolean是小写的boolean的包装类,
    Boolean是类,boolean是基本数据类型。八种基本的数据类型都有其各自的包装类。
      

  3.   

    至于一开始的问题,期待ing..
      

  4.   

    public static final Elvis ELVIS = new Elvis(); (1)
    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。最后会在代码中出现空指针异常。
    交换一下第二句和第一句的顺序问题就解决了。
      

  5.   


    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");    }

      

  6.   

    谢谢楼上的答复阿,我也基本明白这个了。还一个小问题,就是,为什么把Boolean变成boolean后,即使不用换顺序,也能正确显示呢?public class Elvis{ public static final Elvis ELVIS = new Elvis(); private Elvis(){}; 
    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"); } 

      

  7.   

    static final boolean ...
    是一个基本类型,在编译的时候已经放到常量区里去了
      

  8.   

    ELVIS.lives()   是什么意思   lives()又不是静态方法