日期:2014-05-20  浏览次数:20817 次

java中一个类的属性何时初始化
public class test {
 
    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Person person=new Person();
        System.out.println(person.name);
System.out.println(person.snumber);
System.out.println(person.age);
System.out.println(person.salary);
         
        int a;
        System.out.println(a);
        String b;
        System.out.println(b);
     
    }
 
}
 
class Person {
public String name;
public Integer snumber;
public int age;
public Float salary;
 
     
}

main中的a和b都会报错:The local variable a may not have been initialized
而person中的这些变量也没有初始化,在执行了new之后却可以直接输出了,引用类型的初始化为null,值类型的初始化为0.
有没有相关文档详解一下这个new过程是怎样执行的啊?

------解决方案--------------------
拷贝的。差不多就是这个意思。
Class.forName()会对类初始化,而loadClass()只会装载或链接。可见的效果就是类中静态初始化段及字节码中对所有静态成员的初始工作的执行(这个过程在类的所有父类中递归地调用). 这点就与ClassLoader.loadClass()不同. ClassLoader.loadClass()加载的类对象是在第一次被调用时才进行初始化的。
你可以利用上述的差异. 比如,要加载一个静态初始化开销很大的类, 你就可以选择提前加载该类(以确保它在classpath下), 但不进行初始化, 直到第一次使用该类的域或方法时才进行初始化


------解决方案--------------------
继承Person的时候new了下面的ab没有new没有对象所以报错了
------解决方案--------------------
首先先来说下你上面出错的原因:
    类里定义的成员变量,可不赋初值,若不赋初值则JAVA会按上表为其添加默认值;
    方法里定义的局部变量,变量在参与运算之前必须赋初值,jvm不负责为局部变量赋值,在使用时必须自己显式初始化,否则就会报你上面的错误。

接下来说下类的加载包含new的过程以及哪些情况进行初始化哪些情况不需要初始化,给你介绍两篇文章,看完后就很清楚了:
http://blog.csdn.net/xiaoyufu007/article/details/6654377
http://java.chinaitlab.com/advance/26623.html
------解决方案--------------------
方法里的变量必须自己赋初值.
------解决方案--------------------
变量都要赋初值
------解决方案--------------------
Person自定义类里的那几个成员变量都是全局变量具有默认值,不赋值可以使用。int 是0 float是0.0 String是null,a,b是局部变量没有默认值,要初始化才能使用,说起来貌似跟new没什么直接关系。