一、什麼是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將其自身傳給外部方法。