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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黑马-王鹏 中级黑马   /  2013-3-13 20:41  /  2148 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 黑马-王鹏 于 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, 下载次数: 30)

D6QO]@PMSHAY2N4Q2)]R~M0.jpg

8 个回复

倒序浏览
这个不是this的问题,是因为你有个局部代码块,输出了年龄,然后其他的估计你也知道了,
回复 使用道具 举报
理解毕老师的下面对象的加载过程你就明白了
Person p = new Person("zhangsan",20);

该句话都做了什么事情?
1,因为new用到了Person.class.所以会先找到Person.class文件并加载到内存中。
2,执行该类中的static代码块,如果有的话,给Person.class类进行初始化。
3,在堆内存中开辟空间,分配内存地址。
4,在堆内存中建立对象的特有属性。并进行默认初始化。
5,对属性进行显示初始化。
6,对对象进行构造代码块初始化。//构造代码快优于构造函数
7,对对象进行对应的构造函数初始化。
8,将内存地址付给栈内存中的p变量。
回复 使用道具 举报
.......楼主仔细看下。。你就是这样输出的。不管this什么事。。
关于this:
1.this表示当前类的对象在一个类里,你不需要new他的实例就直接可以用this调用它的方法和属性。
2.可以用在构造函数调用时候使用。
回复 使用道具 举报
  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就会先有它
回复 使用道具 举报
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);
}
}
回复 使用道具 举报
问题补充:那个是构造代码块,构造代码块随着类的加载一起加载,所以先输出了“年龄”俩个字,然你你调用的是两个参数构造函数,这个构造函数有this(),这个时候调用无参构造,“姓名”两个字输出。
回复 使用道具 举报
你理解错了函数的初始化顺序吧。。
静态代码块初始化 >> 成员变量的默认初始化 >>显示初始化>> 构造代码块初始化 >> 构造函数初始化。
这是我总结的,希望对你有帮助!!
回复 使用道具 举报
嗯,明白了,谢谢楼上的两位哈
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马