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过程是怎样执行的啊?
...全文
772 7 打赏 收藏 转发到动态 举报
写回复
用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下), 但不进行初始化, 直到第一次使用该类的域或方法时才进行初始化
JCTP 0.3.2 2013-2-27 增加:JCTPStructUtil工具 修正:交易API部分函数出现空指针异常的问题 修正:行情API部分函数出现空指针异常的问题 变更:发布包增加JCTP.jar *********************************************** JCTP 0.3.1 2013-2-26 修正:交易API部分函数出现空指针异常的问题 *********************************************** JCTP 0.3 2013-2-26 增加:完成对交易API的封装 增加:格式化结构体方法注释为javadoc格式(暂未转成文) 增加:优化结构体属性的调用方式,增加getter/setter方法,隐藏bridj框架代码 修正:解决Bridj框架一处与CTP接口的兼容问题 修正:解决回调方法结构体的属性值为文时出现乱码的问题 变更:移动util包到jctp路径下 变更:发布版本号格式更改,缩进1位 *********************************************** JCTP 0.0.2 2013-1-31 增加:JCTPLibraryUtil,用于初始化CTP环境或卸载CTP环境 增加:JCTPMdApi,将Bridj调用CTP的代码隐藏 增加:JCTPMdSpi,将Bridj调用CTP的代码隐藏 增加:JCTPTraderApi,将Bridj调用CTP的代码隐藏 增加:JCTPTraderSpi,将Bridj调用CTP的代码隐藏 修正:Spi回调时报空指针,无法进入回调方法的问题 修正:无法调用带参数的CreateFtdc.....Api函数的问题 修正:只能在调试模式下进行回调的问题 变更:CTP动态链接库置入jar包 变更:将JCTP相关独立出CTP调用包
该课程由付强老师主讲,系统的、全面的、具体的讲解了java入门的知识。可以使初级的学员入门。Java入门Java的历史、Java的版本、Java的优势、软件行业前景Java开发环境搭建、编写Java入门练习虚拟机的运行机制、Java的平台无关性、虚拟机垃圾回收机制基础语法关键字、标识符、Java数据型分、基础数据型、取值范围变量、常量、三种注释、生成doc文档、运算符、表达式if语句、switch语句、嵌套判断for语句、while语句、do-while语句、嵌套循环和对象面向过程和面向对象的区别的构成、访问修饰符、对象的内存分配this关键字、按值传递与按引用传递、对象的初始化顺序高级特性的继承、父子初始化顺序、单继承性方法的覆盖、重载、super关键字、多态、instanceof关键字、强制型转换、static关键字、final关键字数组和枚举一维数组的应用及内存分配多维数组的应用及内存分配数组的复制、数组的按引用传递排序算法:冒泡、直接选择、插入选择、希尔、快速、归并、堆排序Arrays工具的应用枚举型的应用常见的使用Object的底层及应用、ObjectsString的底层及应用、正则表达式StringBuffer和StringBuilder的底层及应用Math的应用、包装的应用日期的应用:Date、DateFormat、Calendar、LocalDateTime、Instant、LocalDate、MonthDay、ZonedDateTime、YearMonth、新旧日期转换BigInteger和BingDecimal、DecimalFormatSystem、Scanner抽象和接口抽象的规则及应用接口的规则及应用默认方法、静态方法、函数式接口、Lambda表达式异常异常的定义异常的处理:抓(try-catch-finally)、抛(throws)异常的分、自定义异常的应用、throw关键字集合框架集合框架结构:接口、实现Collection接口的方法、Set接口的方法、List接口的方法、Map接口的方法Array、Linked、Hash、Tree底层实现原理泛型的作用、Collections工具、历史集合I/O流Path的原理及应用、Files的原理及应用文件字节流FileInputStream的原理及应用对象、缓冲流、数据流的原理及应用字符流的原理及应用多线程进程与线程的概念、查看线程对象Java内存模型线程的创建与启动:扩展Thread、实现Runnable接口、实现Callable接口、线程池线程状态的转换:新建、就绪、运行、阻塞、死亡线程的调度:sleep、yield、join、interrupt、wait后台线程、定时任务线程的并发与同步、同步锁、同步块、线程安全的Lock接口、CAS、volatile修饰符内部成员内部、本地内部的应用匿名内部的原理及引用、Lambda表达式设计模式基础设计模式概念、框架概念7大设计原则:开闭原则、依赖倒置原则、单一职责原则、接口隔离原则、迪米特原则、里氏替换原则、合成复用原则单例模式、工厂模式、模板模式、代理模式、装饰模式、适配器模式、外观模式、策略模式、观察者模式、命令模式、备忘录模式、观察者模式反射反射包Class的使用反射获取属性、方法、构造器通过反射创建对象/通过反射调用方法反射的应用

62,614

社区成员

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

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