java的學習:this關鍵字

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章