Java中this的問題

今天學習Servlet中牽扯到了this這個關鍵字,下面做個筆記,也給大家一起參考學習一下。 
首先this是指當前運行類實例對象。當你創建一個對象並調用該對象的方法的時候其實下面這樣的:
Person p = new Person();
  p.show(String name);

其實在編譯之後編程機器語言是p.show(p , name);第一個參數是本類的對象的引用。而在這個show方法中怎麼來用這個引用呢?其實就是用this來代替這個引用。也就是當前運行類實例對象。

而靜態方法就是沒有this的方法,也就是靜態的方法中不能使用this,因爲靜態方法編譯成機器語言之後,並沒有在參數中加入本類對象的引用,也就是 p.show(String name)和原來一樣。這就是this的由來。

下面說一下this的一些使用

public class Father {
    public void fun(){
        System.out.println("this is Father's fun");
        this.show();
    }
    public void show(){
        System.out.println("father's show : ");
    }
}

public class Son extends Father {
    public void fun(){
        System.out.println("this is Son's fun()");
        super.fun();
    }
    public void show(){
        System.out.println("Son's show() ");
    }
    public static void main(String[] args) {
        Son son = new Son();
        son.fun();
    }
}

在看到結果之前大家可以先猜一下是不是和自己想象的結果一樣,結果如下:

this is Son's fun()
this is Father's fun
Son's show() 

有些人對this理解不深的可能會產生疑問,爲什麼結果會是這樣。我在前面已經說過:”this是指當前運行類實例對象”,所以,要看是誰調用了這個方法。這裏寫圖片描述
在父類中又通過this調用了show()方法,因爲show方法是子類繼承自父類的。而且,此時的this是指當前的調用者,圖中已經說過,當前的調用者是son,所以此時的this也是son所以調用的show方法也就是子類的show方法了。

那麼下面再給大家看一段代碼:

public class Father {
    public String name ="father";
    public void fun(){
        System.out.println("this is Father's fun :"+this.name);
    }
}

public class Son extends Father {
   public String name="son";

    public void fun(){
        System.out.println("this is Son's fun() :" + this.name);
        super.fun();
    }
    public static void main(String[] args) {
        Son son = new Son();
        son.fun();
    }
}

仍然希望大家先猜一下結果。
結果如下:

this is Son's fun() :son
this is Father's fun :father

是不是覺得很詭異。
這裏我解釋一下。前面的例子中show方法時子類繼承並覆蓋了父類的方法,所以調用的是子類的show方法,如果子類沒有重寫父類的方法的話,其實仍舊調用父類的方法的(大家可以在父類中添加一個方法,用this調用一下試試。此處不在舉例),但是字段不能覆蓋,誰的就是誰的,子類繼承了父類,字段在子類中就變成了 編譯時類型的字段了(可以看一下我的上一篇博客又介紹),所以此時的this是調用自己的屬性了,舉個例子:

  public static void main(String[] args) {
        Son son = new Son();
        System.out.println(son.name);
        Father f = new Son();
        System.out.println(f.name);
    }

這裏的運行結果就是:

son
father

這就牽扯到了多態。多態的特點是,成員變量編譯時看左邊,成員方法編譯看左邊,運行看右邊

大家要記住方法是誰運行看誰,字段是誰的就是誰的。

發佈了53 篇原創文章 · 獲贊 39 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章