——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-
为什么要使用this关键字?
情况1.当局部变量和成员变量同名的时候,使用this来区分这两变量。
例:
class Person
{
private String name;
Person(String name)
{
name =name;
}
public void show()
{
System.out.println("name="+name);
}
}
class PersonDemo3
{
public static void main(String [] args)
{
Person p1=new Person("zhangsan");
}
}
第18行新建了一个Person对象并初始化,“zhangsan”这个值是传给构造函数Person(Sting name)中的局部变量name的。函数里面再将“zhangsan”付给成员变量name。name =name;
这个语句的本意是将构造函数里面的局部变量name传给成员name,但实际上这个表达式是局部变量name赋值给了自己。因为当成员变量和局部变量同名时,java首先使用局部变量,局部变量无该名称则在成员变量里面查找,再无则报错。所以最终name的值还是为null,而不是“zhangsan”。
为了解决这个问题
- 可以将构造函数的形参名改为与name不同 的名字
Person(String n)
{
name =n;
}
虽然解决了问题,但是构造函数的形参没有直观含义,不推荐。
- 引入this关键字
Person(String name)
{
this.name =name;
}
这时的this代表其所在函数所属对象的引用,代码中执行到this的时候Person(String name)这个构造函数正在被对象p1引用,因此this.name就代表p1.name。不仅解决了问题,也提高了代码的可读性。
Person(String name)
{
p1.name =name;
}
情况1结论:this代表它所在函数所属对象的引用。简单说:哪个对象在调用this所在的函数,this就代表哪个对象。
情况2.当在函数内需要用到调用该函数的对象时,用this
当一个类中创建了多个构造函数,当这些函数之间的功能有包含重复的现象,这时候可以相互调用函数。
class Person
{
private String name;
private int age;
Person(String name)
{
this.name =name;
}
Person(String name,int age)
{
this.name = name;
this.age = age;
}
}
class PersonDemo4
{
public static void main(String[] args)
{
Person p1 = new Person("zhangsan");
Person p2 = new Person("lisi",20);
}
}
代码中,构造函数Person(String name,int age)里面有初始化name和age,这里面初始化name与构造函数Person(String name)功能一致。因此,构造函数Person(String name,int age)可简化为:
Person(String name,int age)
{
this(name);//构造函数之间不能使用Person(name)
this.age = age;
}
情况2结论:
this语句 用于构造函数之间进行互相调用。
注意事项:this语句只能定义在构造函数的第一行,因为初始化要先执行。
例子:
Person(String name)
{
this.name ="zhangsan";
}
Person(String name,int age)
{
this.name=name;
this(name);//传入的是"lisi",20,但是实际上p.name=zhangsan。因此需要把该语句放到函数内第一行。
this.age = age;
}
class PersonDemo4
{
public static void main(String[] args)
{
Person p = new Person("lisi",20);
}
}
另外,要避免构造函数之间循环引用,不然会造成死循环。
错误示例:
Person()
{
this.name ="zhangsan";
}
Person(String name)
{
this(name);
}
719

被折叠的 条评论
为什么被折叠?



