java中一个类的属性何时初始化

hijk1984 2013-12-12 11:53:41
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过程是怎样执行的啊?
...全文
803 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
simpleTeach 2014-11-23
  • 打赏
  • 举报
回复
Person类没有定义构造方法,所以系统默认Person类拥有一个空的无参构造方法,在Person类继承至Object类,所以在使用new关键字创建Person类实例时调用构造方法是这样的 Person(){ super(); ....(内容为空) } new关键字创建实例就是在堆中开辟空间,然后将类中属性初始化并存入的过程。 当然,上面都是废话 需要说明的是,类在构造方法中对类中的成员变量完成初始化操作, 那么那些没有明文进行初始化操作的变量又是什么命运呢 java为这些没有进行初始化的成员变量规定了默认值, 如前面所说, int 等基本数据类型 为 0 对象成员为null。 至此已经基本上解决问题了 另外 需要给楼主扩充的是(也就是标题所问,java中一个类的属性何时进行初始化?) 通过如此实验即可理解 public class Text { int a=1; int b; Object o; public Text(){ System.out.print(a+"\t"+b+"\t"+o); } public static void main(String[] args){ new Text(); } } 1 0 null 由结果我们可以看出,类中成员变量在构造方法开始时,就已经被赋予了相应的值,如果成员标量中基本数据类型已经进行了直接赋值,那么进入构造方法时就等于所赋之值,如果成员变量在进入构造方法之前没有赋值,那么就使用默认值进入构造方法体中。 需要强调的时,默认赋值在构造方法之前,不是之后。
xtdstyle 2013-12-14
  • 打赏
  • 举报
回复
Person自定义类里的那几个成员变量都是全局变量具有默认值,不赋值可以使用。int 是0 float是0.0 String是null,a,b是局部变量没有默认值,要初始化才能使用,说起来貌似跟new没什么直接关系。
  • 打赏
  • 举报
回复
变量都要赋初值
浪漫小和 2013-12-14
  • 打赏
  • 举报
回复
方法里的变量必须自己赋初值.
UDown 2013-12-14
  • 打赏
  • 举报
回复
首先先来说下你上面出错的原因: 类里定义的成员变量,可不赋初值,若不赋初值则JAVA会按上表为其添加默认值; 方法里定义的局部变量,变量在参与运算之前必须赋初值,jvm不负责为局部变量赋值,在使用时必须自己显式初始化,否则就会报你上面的错误。 接下来说下类的加载包含new的过程以及哪些情况进行初始化哪些情况不需要初始化,给你介绍两篇文章,看完后就很清楚了: http://blog.csdn.net/xiaoyufu007/article/details/6654377 http://java.chinaitlab.com/advance/26623.html
林亻乔 2013-12-14
  • 打赏
  • 举报
回复
继承Person的时候new了下面的ab没有new没有对象所以报错了
失落夏天 2013-12-12
  • 打赏
  • 举报
回复
拷贝的。差不多就是这个意思。 Class.forName()会对类初始化,而loadClass()只会装载或链接。可见的效果就是类中静态初始化段及字节码中对所有静态成员的初始工作的执行(这个过程在类的所有父类中递归地调用). 这点就与ClassLoader.loadClass()不同. ClassLoader.loadClass()加载的类对象是在第一次被调用时才进行初始化的。 你可以利用上述的差异. 比如,要加载一个静态初始化开销很大的类, 你就可以选择提前加载该类(以确保它在classpath下), 但不进行初始化, 直到第一次使用该类的域或方法时才进行初始化

62,635

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧