黑马程序员技术交流社区

标题: 空参构造函数与默认值的区别 [打印本页]

作者: 何堂红    时间: 2014-5-28 00:20
标题: 空参构造函数与默认值的区别
本帖最后由 何堂红 于 2014-5-28 17:20 编辑

在堆内存中,新建对象时,jvm会自动为成员变量赋初值,而调用空参构造函数时,jvm也会对对象进行初始化,它们两的输出结果一样,那这它们两有什么区别吗?请尽量回答的详细些,我被它困扰好几天啦。谢谢啦!
作者: 谢振宣    时间: 2014-5-28 01:05
  1. class Demo
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 Person p1 = new Person();
  6.                 Student s = new Student();
  7.                 Person p2 = new Person("张三",20);
  8.                 System.out.println("p1:name is "+p1.name+",age is "+p1.age);
  9.                 System.out.println("s::name is "+s.name+",age is "+s.age);
  10.                 System.out.println("p2:name is "+p2.name+",age is "+p2.age);
  11.         }
  12. }
  13. class Person
  14. {
  15.         String name = null;
  16.         int age = 0;
  17.         Person()//此处为空参数的构造函数
  18.         {}
  19.         Person(String name,int age)//此处为带参数的构造函数
  20.         {
  21.                 this.name = name;
  22.                 this.age = age;
  23.         }
  24. }
  25. class Student
  26. {
  27.         String name = null;
  28.         int age = 0;
  29. }
  30. /*执行结果为
  31. *p1:name is null,age is 0
  32. *s::name is null,age is 0
  33. *p2:name is 张三,age is 20
  34. *
  35. *若要创建一个类的对象,则该类必须对外提供构造函数。
  36. *当JVM要创建对象时,必然要调用该对象所属类的构造函数。
  37. *这时调用的可以是空参数构造函数,也可以是带参数的构造函数。
  38. *当JVM调用的是空参数的构造函数时,被创建对象的成员变量,只能拥有该变量的初始化值。
  39. *当JVM调用的是带参数的构造函数时,被创建对象的成员变量,将会拥有被指定的值。
  40. *
  41. *当一个类并没有明确自己的构造函数时,系统会默认的添加一个空参数的构造函数。
  42. *在创建对象时,JVM调用的是空参数的构造函数。
  43. *这时看起来就好像是,没有构造函数和有空参数的构造函数,所创建的对象是一样的。
  44. *其实,在编译时期,JVM已经为没有构造函数的类,添加了一个空参数的构造函数。
  45. */
复制代码

作者: 何堂红    时间: 2014-5-28 08:34
谢振宣 发表于 2014-5-28 01:05

很详细,谢谢!:#
作者: 塔罗    时间: 2014-5-28 09:56
我觉的把。自己定义空参的构造函数与默认的构造函数没有什么区别。但是一旦你定义了带有参数的构造函数,系统将不会在有默认的构造函数了。这时最好定义一个空参的构造函数。因为你并不是创建所有对象都要赋值。
作者: 相濡、彼岸    时间: 2014-5-28 13:33
大白话:构造函数的作用就是给对象初始化的,默认初始化也是给对象初始化的,初始化顺序不一样,先后顺序分别为:默认初始化,显示初始化,构造代码块初始化,构造函数初始化。
   创建对象的前提是这个类必须有构造函数。因为有了对象你才能给对象初始化,所以对象在前,所以jvm为了能使你创建对象成功,   就默认的根据对象的数据类型先赋了一个值,比如:String类型的对象默认值是nullint类型的对象默认值是0;构造函数然后再把null或者是0,改变成想要操作的数据值,如果你不准备给构造函数定义参数,也就是默认的空参数的构造函数,那么你就要在这之前直接在成员位置上赋值,或是用构造代码块赋值。
  
  说的有点啰嗦,希望对你有帮助!

作者: 何堂红    时间: 2014-5-28 16:59
相濡、彼岸 发表于 2014-5-28 13:33
大白话:构造函数的作用就是给对象初始化的,默认初始化也是给对象初始化的,初始化顺序不一样,先后顺序分 ...

嗯,很详细,这正是我要的答案,太感谢了!
作者: 何堂红    时间: 2014-5-28 17:03
塔罗 发表于 2014-5-28 09:56
我觉的把。自己定义空参的构造函数与默认的构造函数没有什么区别。但是一旦你定义了带有参数的构造函数,系 ...

谢谢您的解答!




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