黑马程序员技术交流社区
标题:
this中构造函数初始化问题
[打印本页]
作者:
黑马-王鹏
时间:
2013-3-13 20:41
标题:
this中构造函数初始化问题
本帖最后由 黑马-王鹏 于 2013-3-13 21:04 编辑
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);
}
}
复制代码
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, 下载次数: 34)
下载附件
2013-3-13 20:37 上传
作者:
我自信我很牛
时间:
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
class Person
{
private String name;
private int age;
{
<FONT color=red>System.out.println("年龄");//这块是构造代码块,随着类的加载而加载
</FONT>}
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);
}
}
复制代码
问题解答如代码中红色字体,由于此块是构造代码块,它会随着你类的加载而加载,所以你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