深刻理解this關鍵字

Java提供了一個this關鍵字,this關鍵字老是指向調用該方法的對象。根據this出現的位置的不一樣,this做爲對象的默認引用有兩種情形。微信

1)構造器中引用該構造器正在初始化的對象。this

2)在方法中引用調用該方法的對象。spa

this關鍵字最大的做用就是讓類中一個方法,訪問該類裏的另外一個方法或者實例變量。假設定義了一個Person類,這個Person對象的eat()方法須要調用它的move()方法,則如何作呢?是否應該定義以下的Person類呢?code

    public class Person {
        
        //定義一個move()方法
        public void move(){
            System.out.println("正在執行move()方法");
        }
        //定義一個eat()方法,eat()方法須要藉助move()方法
        public void eat(){
            Person p = new Person();
            p.move();
            System.out.println("正在執行eat()方法");
        }
        
        public static void main(String[] args) {
            //建立Person對象
            Person p = new Person();
            //調用Person的eat()方法
            p.eat();
        }
    }

運行結果爲:對象

正在執行move()方法
正在執行eat()方法blog

以上這種方式確實可以作到在eat()方法裏調用move()方法,但從main()方法裏的程序中能夠看出,一共建立了兩個對象:main()方法裏建立一個對象;eat()方法裏建立一個對象。但是真的須要建立兩個對象嗎?答案是否認的!由於當程序調用eat()方法時必定會提供一個Person對象,而不須要從新建立一個Person對象了。class

所以須要在eat()方法中得到調用該方法的對象,經過this關鍵字就能夠知足這個需求。變量

this能夠表明任何對象,當this出如今某個方法體中時,它所表明的對象是不肯定的,但它的類型是肯定的,它所表明的類型只能是當前類:只有當這個方法被調用時,它所表明的對象才被肯定下來:誰在調用這個方法,this就表明誰。二維碼

將上面的Person類中的eat()方法改成一下這種方式更合適:引用

//定義一個eat()方法,eat()方法須要藉助move()方法
public void eat(){
    //使用this引用調用eat()方法的對象
    this.move();
    System.out.println("正在執行eat()方法");
}

上述程序中eat()方法須要依賴於move()方法,現實中這種依賴情形很是常見,例如寫字方法須要拿筆的方法,這種依賴都是同一個對象兩個方法之間的依賴。所以,Java容許對象的的一個成員直接調用另外一成員,能夠省略this前綴。也就是說,上面的程序能夠改成以下形式:

public void eat(){
    move();
    System.out.println("正在執行eat()方法");
}

另一種情形是:this關鍵字可用於構造器中做爲默認引用,因爲構造器是直接使用new關鍵字來調用,而不是使用對象來調用的,因此this在構造器中表明該構造器正在初始化的對象。例以下面的程序:

    public class Person {
        //定義一個名爲age的成員變量
        public int age;
        
        //構造器
        public Person() {
            //在構造器裏定義一個age變量
            int age = 0;
            //使用this表明該構造器正在初始化的對象
            //下面的代碼將會把該構造器正在初始化的對象的age成員變量設爲3
            this.age = 3;
        }


        public static void main(String[] args) {
            //使用new Person()建立的對象的age成員變量都將被設爲3
            //下面代碼輸出3
            System.out.println(new Person().age);
        }
    }

 與普通方法相似的是,大部分時候,在構造器中訪問其它成員變量和方法時均可以省略this前綴,但若是構造器中有一個與成員變量同名的局部變量,又必須在構造器中訪問這個被覆蓋的成員變量,則必須使用this前綴。如上面程序所示。

當this做爲對象的默認引用使用時,程序能夠像訪問普通引用變量同樣來訪問這個this引用,甚至能夠把this當成普通方法的返回值。請看下面程序:

    public class Person {
        public int age;
        
        public Person grow() {
            age ++;
            return this;
        }

        public static void main(String[] args) {
            Person p = new Person();
            //能夠連續調用同一個方法
            p.grow().grow().grow();
            System.out.println("p對象的age的值是:"+p.age);
        }
    }

運行結果爲:

p對象的age的值是:3

從上面的程序能夠看出,若是在某個方法中把this做爲返回值,則能夠屢次連續調用同一個方法,從而使得代碼更加的簡潔。但這種方式容易形成實際意義的模糊,例如上面的group()方法,用於表示對象的生長,即age變量的值加1,實際上不該該有返回值。

最後須要強調一點:靜態成員不能直接訪問非靜態成員,即static修飾的方法不能訪問不適用static修飾的普通方法。對於static修飾的方法而言,可使用類直接調用該方法,若是在static修飾的方法中使用this關鍵字,則這個關鍵字就沒法指向合適的對象。因此,static修飾的方法中不能使用this引用。

歡迎關注微信公衆號【Java典籍】,收看更多Java技術乾貨!

  ▼微信掃一掃下圖↓↓↓二維碼關注

 

相關文章
相關標籤/搜索