所有基本类型数据、对象都会在调用构造函数之前经由系统自动初始化,但是偏偏被final声明的却不行,一定是在调用构造函数之后被调用,谁知道这是因为基于什么原因呢?
class Test{
int a;  // a=0
char b; // b=''
float c; //c=0.0
double d; //d=0.0
short e; //e=0
Test1 f; //f=null
//final int g; //erro 因为没初始化
void print(){
System.out.println(a + "");
System.out.println(b + "");
System.out.println(c + "");
System.out.println(d + "");
System.out.println(e + "");
System.out.println(f + "");
}
public static void main(String[] args){
Test test = new Test();
test.print();
}
}

解决方案 »

  1.   

    此回复为自动发出,仅用于显示而已,并无任何其他特殊作用
    楼主【llm0528】截止到2008-07-16 11:37:43的历史汇总数据(不包括此帖):
    发帖的总数量:55                       发帖的总分数:1100                     每贴平均分数:20                       
    回帖的总数量:47                       得分贴总数量:0                        回帖的得分率:0%                       
    结贴的总数量:55                       结贴的总分数:1100                     
    无满意结贴数:0                        无满意结贴分:0                        
    未结的帖子数:0                        未结的总分数:0                        
    结贴的百分比:100.00%               结分的百分比:100.00%                  
    无满意结贴率:0.00  %               无满意结分率:0.00  %                  
    敬礼!
      

  2.   

    final 关键的含义就是声明一个变量当作一个常量比如final int pi=3.14;以后就可以用pi表示3.14了所以对于final 修饰的变量必须初始化同时对于那些声明的变量也需要初始化,不然会出现nullpointexception你的程序里面其实已经初始化了变量::::            a + ""
      

  3.   

    可以在构造函数中初始化。因为你的变量不是static,不是类变量。你在生成一个对象的时候,可以有属于该对象的不变的数据。拿你的程序说,可能Test类的几个实例test1,test2他们的常量g的值是不一样的。(若一样,你完成可以申明为static。)为了确保g的不变性,只在构造函数中初始化一次,是比较合理的选择。
      

  4.   

    什么是final 为什用final
    因为它只能初始化一次。 而你的程序里并没有对他初始化就使用了。如果类自动初始化为0,那么你认为如下的代码会怎样呢?class Test{
      final int id;
      Test(){
        id = 1;
      }
    }如果按照你的理解,那么这个类将报错,因为那个final已经被系统自动初始化了。也就是说,任何你声名为final的,都只能是系统默认的,而不可能被我们的程序控制了。
    这个应该不是 final的初衷吧!OVER
      

  5.   

    final 就是初始化一次后  就不让再改变了   所以一般用static final 声明的东西我们都叫他常量常量啥意思知道吧   变量啥意思知道吧
      

  6.   

    1. 首先,拿 final 修饰实例域(你代码中的那个 final int g, a, b, ...)跟 public static final int I = 618; 不一样,后者才是所谓的“常量”。
    2. 拿 final 修饰的实例域必须使用下面两种方式之一进行初始化:
           a. 在声明的同时赋上初始值(比如 final int g = 618)
           b. 在构造方法中进行初始化(比如 public Test() { this.g = 618; })
           如果使用 b 方式要注意:你要保证此类的使用者无论使用那个构造方法无论传入什么参数来创建对象 this.g = 618; 像这样给 final 实例域赋值的语句必须要能执行到,而且只能被执行一次。
      

  7.   

    final 是不能更改的。想想当没有明显的初始化的时候,如果系统自动赋了一个值,那后面的初始化赋值语句岂不成了非法的了?
      

  8.   

    哦~~懂了,其实主要刚开始的时候看到可以在构造函数里,初始化final变量,而其他所有的数据类型都在调用构造函数之前被初始化,所以觉得挺奇怪的。感谢各位!!