黑马程序员技术交流社区

标题: this中构造函数初始化问题 [打印本页]

作者: 黑马-王鹏    时间: 2013-3-13 20:41
标题: this中构造函数初始化问题
本帖最后由 黑马-王鹏 于 2013-3-13 21:04 编辑
  1. class Person
  2. {
  3. private String name;
  4. private int age;
  5. {
  6. System.out.println("年龄");
  7. }
  8. Person()
  9. {
  10. System.out.println("姓名");
  11. }
  12. Person(String name)
  13. {
  14. this();
  15. this.name =name;
  16. }
  17. Person(String name,int age)
  18. {
  19. this(name);//<STRONG><FONT color=red>this调用构造函数必须放在第一行。因为初始化要先执行</FONT></STRONG>
  20. this.age = age;
  21. }
  22. }
  23. class PersonDemo4
  24. {
  25. public static void main(String[] args)
  26. {
  27. Person p = new Person("lisi",30);
  28. }
  29. }
复制代码
file:///C:/Documents%20and%20Settings/wangpeng/Application%20Data/Tencent/Users/1198571320/QQ/WinTemp/RichOle/D6QO]@PMSHAY2N4Q2)]R~M0.jpg
我个人理解应该是姓名在前,年龄在后,为什么反了呢?

D6QO]@PMSHAY2N4Q2)]R~M0.jpg (23.4 KB, 下载次数: 29)

D6QO]@PMSHAY2N4Q2)]R~M0.jpg

作者: 我自信我很牛    时间: 2013-3-13 20:52
这个不是this的问题,是因为你有个局部代码块,输出了年龄,然后其他的估计你也知道了,
作者: 曹睿翔    时间: 2013-3-13 20:53
理解毕老师的下面对象的加载过程你就明白了
Person p = new Person("zhangsan",20);

该句话都做了什么事情?
1,因为new用到了Person.class.所以会先找到Person.class文件并加载到内存中。
2,执行该类中的static代码块,如果有的话,给Person.class类进行初始化。
3,在堆内存中开辟空间,分配内存地址。
4,在堆内存中建立对象的特有属性。并进行默认初始化。
5,对属性进行显示初始化。
6,对对象进行构造代码块初始化。//构造代码快优于构造函数
7,对对象进行对应的构造函数初始化。
8,将内存地址付给栈内存中的p变量。

作者: 黑马-陈思源    时间: 2013-3-13 20:55
.......楼主仔细看下。。你就是这样输出的。不管this什么事。。
关于this:
1.this表示当前类的对象在一个类里,你不需要new他的实例就直接可以用this调用它的方法和属性。
2.可以用在构造函数调用时候使用。
作者: 杨博    时间: 2013-3-13 20:56
  1. class Person
  2. {
  3. private String name;
  4. private int age;
  5. {
  6. <FONT color=red>System.out.println("年龄");//这块是构造代码块,随着类的加载而加载
  7. </FONT>}
  8. Person()
  9. {
  10. System.out.println("姓名");
  11. }
  12. Person(String name)
  13. {
  14. this();
  15. this.name =name;
  16. }
  17. Person(String name,int age)
  18. {
  19. this(name);//<STRONG><FONT color=red>this调用构造函数必须放在第一行。因为初始化要先执行</FONT></STRONG>
  20. this.age = age;
  21. }
  22. }
  23. class PersonDemo4
  24. {
  25. public static void main(String[] args)
  26. {
  27. Person p = new Person("lisi",30);
  28. }
  29. }
复制代码
问题解答如代码中红色字体,由于此块是构造代码块,它会随着你类的加载而加载,所以你new Person就会先有它

作者: 朱盛文    时间: 2013-3-13 20:57
class Person
{
private String name;
private int age;
{
System.out.println("年龄");                      //这是构造代码块,随着类的加载而加载,但是又先于构造函数,所以先打印年龄。
}
Person()
{
System.out.println("姓名");                      //构造函数,在构造代码块加载后再加载。
}
Person(String name)
{
this();
this.name =name;
}
Person(String name,int age)
{
this(name);//<STRONG><FONT color=red>this调用构造函数必须放在第一行。因为初始化要先执行</FONT></STRONG>
this.age = age;
}
}
class PersonDemo4
{
public static void main(String[] args)
{
Person p = new Person("lisi",30);
}
}
作者: 我自信我很牛    时间: 2013-3-13 21:00
问题补充:那个是构造代码块,构造代码块随着类的加载一起加载,所以先输出了“年龄”俩个字,然你你调用的是两个参数构造函数,这个构造函数有this(),这个时候调用无参构造,“姓名”两个字输出。
作者: HM周磊    时间: 2013-3-13 21:00
你理解错了函数的初始化顺序吧。。
静态代码块初始化 >> 成员变量的默认初始化 >>显示初始化>> 构造代码块初始化 >> 构造函数初始化。
这是我总结的,希望对你有帮助!!
作者: 黑马-王鹏    时间: 2013-3-13 21:03
嗯,明白了,谢谢楼上的两位哈




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