一、什么是this关键字?
当你调用一个对象的方法时,如果这个方法中有this,那么在你调用时,this就会生成一个对于这个对象的引用。简单点来说,this可以理解为当前对象。
二、this关键字的使用(注意:this关键字只能在非静态方法内部使用)
this关键字可以用来调用属性(成员变量),方法,构造器。
2.1 this关键字调用属性(this.属性)
class Person{
private String name;
public Person() {
}
public String getName() {
return name;
}
public void setName(String name) {
//name=name;
this.name = name;
}
}
在setter方法中,形参名name与成员变量名name相同,这样会引起混淆。这时就可以通过this.name来表明指向的是成员变量name,避免了重复。
2.2 this关键字调用方法(this.方法)
public class Demo {
public static void main(String[] args) {
Person p1=new Person();
p1.setName("小钻风");
p1.speak();
}
}
class Person{
private String name;
public Person() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void speak(){
//当然此处this都可省略,效果一样
System.out.println(this.name+":大王叫我来巡山,");
this.run();
}
public void run(){
System.out.println("我把人间转一转");
}
}
输出:
小钻风:大王叫我来巡山,
我把人间转一转
在speak()方法中,可以通过this.name获取name值,也可以通过this.run()来调用run()方法,当然,这里的this都是可以省略的。在此处你可以使用this,但是一般是没有必要的。通过查看编译后的.class文件就会发现,当你不使用this时,编译器会帮你自动的应用上。
2.3 this调用构造器(this(参数列表))
在一个类中如果有多个构造器,这时就可能会出现一些代码重复。想要避免这些代码的重复,这时就可以通过this(参数列表)来实现,如此就会显式的调用与其参数列表相匹配的构造。注意:通过this调用构造器必须声明在当前构造器的首行
class Person {
private String name;
private int age;
public Person() {
System.out.println("空参构造");
}
public Person(String name) {
this();
this.name = name;
System.out.println("参数为name的构造");
}
public Person(int age) {
this.age = age;
}
public Person(String name, int age) {
this(name);
this.age = age;
System.out.println("两个参数的构造");
}
}
public class Demo {
public static void main(String[] args) {
Person p = new Person("张三",10);
}
}
输出:
空参构造
参数为name的构造
两个参数的构造
2.4 用在return语句中返回对当前对象的引用
class Person{
private String name;
private int num=0;
public Person() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void speak(){
//当然此处this都可省略,效果一样
System.out.println(this.name+this.num+"号:大王叫我来巡山,");
this.run();
}
public void run(){
System.out.println("我把人间转一转");
}
public Person num(){
num++;
System.out.println(num);
return this;
}
}
public class Demo {
public static void main(String[] args) {
Person p1=new Person();
p1.setName("小钻风");
p1.speak();
System.out.println("====================");
p1.num().num().speak();
}
}
输出:
小钻风0号:大王叫我来巡山,
我把人间转一转
====================
1
2
小钻风2号:大王叫我来巡山,
我把人间转一转
因为num()方法返回的是this,而this就是当前对象的引用。因此这里p1.num().num().speak();
都是同一个对象在操作,所以输出的num才会不断的累加。
2.5 使用this向其他对象传递当前对象
class Person {
void eat(Food food) {
Food cooked = food.getCooked();
System.out.println(food.getExtent());
}
}
class Food {
//程度
String extent;
String getExtent() {
return extent;
}
void setExtent(String extent) {
this.extent = extent;
}
Food getCooked() {
extent = "生的";
return FoodUtils.cook(this);
}
}
class FoodUtils {
static Food cook(Food food) {
System.out.println(food.getExtent());
System.out.println("开始做饭");
food.setExtent("已烧熟");
return food;
}
}
public class Demo {
public static void main(String[] args) {
Person p1 = new Person();
p1.eat(new Food());
}
}
输出:
生的
开始做饭
已烧熟
Food要调用外部工具类FoodUtis中的方法做一些操作,这里就需要使用this将其自身传给外部方法。