刚讲了构造函数,下来说说构造函数的调用,用this
this调用构造函数
构造函数之间的调用
class Person
{
// Person的成员属性
private int age;
private String name;
//无参数的构造函数
Person()
{
}
//给姓名初始化的构造函数
Person(String nm)
{
name = nm;
}
//给姓名和年龄初始化的构造函数
Person(String nm , int a)
{
//由于已经存在给姓名进行初始化的构造函数 name = nm;因此只需要调用即可
//调用其他构造函数,需要通过this关键字来调用
this(nm);
//给年龄初始化
age = a;
}
}
构造函数调用格式:
this(参数列表);
this关键字和构造函数
class Person
{
private int age;
private String name;
Person()
{
}
Person(String nm)
{
// this -- 指向当前对象
name = nm;
}
Person(String nm , int a)
{
// this -- 指向当前对象
this(nm);// 等效于Person(nm)
age = a;
}
}
class PersonDemo
{
public static void main(String[] args)
{
Person p = new Person("张三",23);
}
}
// 创建对象时看的是new关键字,有new有对象
// 构造方法只是进一步完成初始化属性的。真正创建对象是 new + 构造
原理说明:
- 先执行
main
方法,main方法压栈,执行其中的new Person(“张三”,23)
; - 堆内存中开辟空间,并为其分配内存地址
0x33
,紧接着成员变量默认初始化(name=null age = 0
); - 拥有两个参数的构造函数(Person(String nm , int a))压栈,在这个构造函数中有一个隐式的this,因为构造函数是给对象初始化的,那个对象调用到这个构造函数,this就指向堆中的那个构造函数。
- 由于Person(String nm , int a)构造函数中使用了this(nm);构造函数
Person(String nm)
就会压栈,并将“张三”传递给nm。在Person(String nm )构造函数中同样也有隐式的this,this的值同样也为0x33
,这时会执行其中name = nm,即把“张三”赋值给成员的name。当赋值结束后Person(String nm )构造函数弹栈。 - 程序继续执行构造函数(Person(String nm , int a)中的age = a;这时会将23赋值给成员属性age。赋值结束构造函数(Person(String nm , int a)弹栈。
- 当构造函数Person(String nm , int a)弹栈结束后,Person对象在内存中创建完成,并将
0x33
赋值给main方法中的p引用变量。
注意:
this到底代表什么呢?this代表的是对象,具体代表哪个对象呢?哪个对象调用了this所在的函数,this就代表哪个对象。
调用其他构造函数的语句必须定义在构造函数的第一行,原因是初始化动作要最先执行。
成员变量和局部变量同名问题
class Person
{
private int age;
private String name;
//给姓名和年龄初始化的构造函数
Person(String name , int age)
{
//当需要访问成员变量是,只需要在成员变量前面加上this.即可
this.name = name;
this.age = age;
}
public void speak()
{
System.out.println("name="+this.name+",age="+this.age);
}
}
class PersonDemo
{
public static void main(String[] args)
{
Person p = new Person("张三",23);
p.speak();
}
}
当局部变量和成员变量同名的时候,我们可以用this.的形式去区分成员变量和局部变量
this的使用:
this.属性 this() this.方法()