黑马程序员技术交流社区

标题: 构造函数的问题 [打印本页]

作者: 赵红萍    时间: 2012-11-24 12:06
标题: 构造函数的问题
我们在类中都会有一些成员变量,在使用它们时,系统就已经给他们初始化了,但是我没写构造函数,也没有构造代码块,而默认的构造函数里什么也没有啊,那这些成员变量是谁给初始化的?系统怎么做的呢?请高手指点....
作者: 杨卫腾    时间: 2012-11-24 13:36
类中的成员变量可以不进行初始化,系统会默认进行初始化的,但要是局部变量的话,一定要为进行初始化的。

默认情况如下:

Boolean             false
Char                  '\u0000'(null)
byte                   (byte)0
short                  (short)0
int                      0
long                   0L
float                   0.0f
double               0.0d



作者: 吴兵    时间: 2012-11-24 13:39
楼上正解
作者: 赵红萍    时间: 2012-11-24 14:06
杨卫腾 发表于 2012-11-24 13:36
类中的成员变量可以不进行初始化,系统会默认进行初始化的,但要是局部变量的话,一定要为进行初始化的。

...

类中的成员变量可以不进行初始化,系统会默认进行初始化的,系统是怎么给它们初始化的,是调用了哪个方法吗?
作者: 潘天功    时间: 2012-11-24 14:28
当然是JAVA虚拟机为类变量进行初始化!!即便是构造方法调用类变量,在这之前也是被JAVA虚拟机初始化的!!
简单的说JAVA的所有程序都是运行在JAVA虚拟机上的,不过按照先后初始化顺序,JAVA虚拟机在运行的时候会先初始化静态的成员变量,再初始化父类的成员变量,接着是自己的静态构造函数,然后是父类的静态构造函数,最后才是静态的其他方法,等到这些都执行完毕后,再按照以上顺序在把那些不是静态的属性或方法再初始化一变,这些就是初始化顺序,
作者: 梁枝武    时间: 2012-11-24 14:33
本帖最后由 梁枝武 于 2012-11-24 14:38 编辑

类中未显式定义构造函数 那么该类在创建实例的时候会调用默认的构造函数 该构造函数就是不含参数的构造函数,该构造函数即使你没定义系统也会给你加上,当你定义了构造函数之后默认的构造函数就会被覆盖掉 , 如果你定义了含参的构造函数,而创建实例 的时候调用的是不含参构造函数
则会抛出异常 所以当你定义了含参构造函数之后 不含参的构造函数就不存在了 此时必须显式的定义不含参构造函数,否则只能使用你定义的那个含参构造函数来创建对象

因此楼主说的自定义类没有任何构造函数 在创建对象的时候系统就会调用那么不含参的构造函数 从而对成员变量进行初始化
作者: 赵红萍    时间: 2012-11-24 14:46
梁枝武 发表于 2012-11-24 14:33
类中未显式定义构造函数 那么该类在创建实例的时候会调用默认的构造函数 该构造函数就是不含参数的构造函数 ...

不带参数的构造函数里什么都没有写啊,就是一个空函数,它怎么给成员变量初始化的?
作者: 赵红萍    时间: 2012-11-24 14:48
潘天功 发表于 2012-11-24 14:28
当然是JAVA虚拟机为类变量进行初始化!!即便是构造方法调用类变量,在这之前也是被JAVA虚拟机初始化的!! ...

你有图例吗?还不是很明白....
作者: 梁枝武    时间: 2012-11-24 15:35
本帖最后由 梁枝武 于 2012-11-24 15:41 编辑

所谓成员变量的初始化就是在创建对象的时候首先给成员变量在内存中开辟这些变量所需要的空间,并把该类这些变量的首个地址赋给它的引用变量
通过new 创建对象时成员变量的初始化与调用构造函数是分两步进行的且 , 成员变量的默认初始化和显式初始化都是在构造函数体内语句执行之前进行的
即成员变量默认初始化-->成员变量显示初始化-->调用构造函数(此时构造函数可以访问初始化后的成员变量或赋值或取值都可以)
所以不是说在构造函数内进行成员变量的初始化
只不过构造函数可以对已经初始化的成员变量进行赋新值操作




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2