黑马程序员技术交流社区
标题: 空参构造函数与默认值的区别 [打印本页]
作者: 何堂红 时间: 2014-5-28 00:20
标题: 空参构造函数与默认值的区别
本帖最后由 何堂红 于 2014-5-28 17:20 编辑
在堆内存中,新建对象时,jvm会自动为成员变量赋初值,而调用空参构造函数时,jvm也会对对象进行初始化,它们两的输出结果一样,那这它们两有什么区别吗?请尽量回答的详细些,我被它困扰好几天啦。谢谢啦!
作者: 谢振宣 时间: 2014-5-28 01:05
- class Demo
- {
- public static void main(String[] args)
- {
- Person p1 = new Person();
- Student s = new Student();
- Person p2 = new Person("张三",20);
- System.out.println("p1:name is "+p1.name+",age is "+p1.age);
- System.out.println("s::name is "+s.name+",age is "+s.age);
- System.out.println("p2:name is "+p2.name+",age is "+p2.age);
- }
- }
- class Person
- {
- String name = null;
- int age = 0;
- Person()//此处为空参数的构造函数
- {}
- Person(String name,int age)//此处为带参数的构造函数
- {
- this.name = name;
- this.age = age;
- }
- }
- class Student
- {
- String name = null;
- int age = 0;
- }
- /*执行结果为
- *p1:name is null,age is 0
- *s::name is null,age is 0
- *p2:name is 张三,age is 20
- *
- *若要创建一个类的对象,则该类必须对外提供构造函数。
- *当JVM要创建对象时,必然要调用该对象所属类的构造函数。
- *这时调用的可以是空参数构造函数,也可以是带参数的构造函数。
- *当JVM调用的是空参数的构造函数时,被创建对象的成员变量,只能拥有该变量的初始化值。
- *当JVM调用的是带参数的构造函数时,被创建对象的成员变量,将会拥有被指定的值。
- *
- *当一个类并没有明确自己的构造函数时,系统会默认的添加一个空参数的构造函数。
- *在创建对象时,JVM调用的是空参数的构造函数。
- *这时看起来就好像是,没有构造函数和有空参数的构造函数,所创建的对象是一样的。
- *其实,在编译时期,JVM已经为没有构造函数的类,添加了一个空参数的构造函数。
- */
复制代码
作者: 何堂红 时间: 2014-5-28 08:34
很详细,谢谢!:#
作者: 塔罗 时间: 2014-5-28 09:56
我觉的把。自己定义空参的构造函数与默认的构造函数没有什么区别。但是一旦你定义了带有参数的构造函数,系统将不会在有默认的构造函数了。这时最好定义一个空参的构造函数。因为你并不是创建所有对象都要赋值。
作者: 相濡、彼岸 时间: 2014-5-28 13:33
大白话:构造函数的作用就是给对象初始化的,默认初始化也是给对象初始化的,初始化顺序不一样,先后顺序分别为:默认初始化,显示初始化,构造代码块初始化,构造函数初始化。 创建对象的前提是这个类必须有构造函数。因为有了对象你才能给对象初始化,所以对象在前,所以jvm为了能使你创建对象成功, 就默认的根据对象的数据类型先赋了一个值,比如:String类型的对象默认值是null,int类型的对象默认值是0;构造函数然后再把null或者是0,改变成想要操作的数据值,如果你不准备给构造函数定义参数,也就是默认的空参数的构造函数,那么你就要在这之前直接在成员位置上赋值,或是用构造代码块赋值。
说的有点啰嗦,希望对你有帮助!
作者: 何堂红 时间: 2014-5-28 16:59
嗯,很详细,这正是我要的答案,太感谢了!
作者: 何堂红 时间: 2014-5-28 17:03
谢谢您的解答!
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |