A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 何堂红 中级黑马   /  2014-5-28 00:20  /  1861 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 何堂红 于 2014-5-28 17:20 编辑

在堆内存中,新建对象时,jvm会自动为成员变量赋初值,而调用空参构造函数时,jvm也会对对象进行初始化,它们两的输出结果一样,那这它们两有什么区别吗?请尽量回答的详细些,我被它困扰好几天啦。谢谢啦!

评分

参与人数 1技术分 +1 收起 理由
Silent_memory + 1 赞一个!

查看全部评分

6 个回复

倒序浏览
  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. */
复制代码

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1 赞一个!

查看全部评分

回复 使用道具 举报

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

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1 赞一个!

查看全部评分

回复 使用道具 举报
相濡、彼岸 发表于 2014-5-28 13:33
大白话:构造函数的作用就是给对象初始化的,默认初始化也是给对象初始化的,初始化顺序不一样,先后顺序分 ...

嗯,很详细,这正是我要的答案,太感谢了!
回复 使用道具 举报
塔罗 发表于 2014-5-28 09:56
我觉的把。自己定义空参的构造函数与默认的构造函数没有什么区别。但是一旦你定义了带有参数的构造函数,系 ...

谢谢您的解答!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马