Android中this的用法

來源:互聯網
上載者:User

標籤:代碼   video   break   防止   button   world   內部類   ted   string   

關於Android中this的用法解釋問題由來

由於很多同學在學習Android時候沒有對Java有很深的瞭解,很多人都會對代碼中各種各樣的this產生疑惑。

以《第一行代碼Android》P37頁,P43頁代碼為例:

protected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.first_layout);    Button button1 = (Button) findViewById(R.id.button_1);    button1.setOnClickListener(new View.OnClickListener() {        @Override        public void onClick(View v) {            Intent intent = new Intent(FirstActivity.this, SecondActivity.class);        }    });}

有些同學會覺得非常奇怪,這個this是用來指代什麼呢?是和class一樣的意思嗎?

那為什麼FirstActivity要用this,而SecondActivity卻要用class呢?

this的三種用法1.表示對當前對象的引用

以以下代碼為例:

public class MainActivity extends AppCompatActivity implements View.OnClickListener {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        Button play = (Button) findViewById(R.id.play);        Button stop = (Button) findViewById(R.id.stop);        play.setOnClickListener(this);        stop.setOnClickListener(this);    }    @Override    public void onClick(View v) {        switch (v.getId()) {            case R.id.play:                Videoplay();                break;            case R.id.stop:                Videostop();                break;        }    }}

play.setOnClickListener(this)中的this,是對當前類MainActivity的引用。
那麼為什麼在開始的代碼中要使用FirstActivity.this來引用FirstActivity呢?

我們仔細分析上下兩段代碼,發現this所處的類是不一樣的,上面的代碼中,this存在於匿名類View.OnClickListener()中!
匿名類View.OnClickListener()是FirstActivity的內部類,如果我們在內部類中使用this,他所引用的類應該是View.OnClickListener()。
Android編譯器在編譯我們的代碼的時候就會發現:“誒View.OnClickListener()你丫誰啊?我咋從你身上啟動SecondActivity啊”。然後就快樂的報錯了。
所以在內部類中,如果我們需要獲得其外部類,就要使用“外部類.this”的寫法。

  • 註:“.class”是因為表示其它類的寫法。
2.表示用類的成員變數,而非函數參數

以以下代碼為例:

public class Book {    private int id;    public int getId() {        return id;    }    public void setId(int id) {        this.id = id;    }}

在代碼中我們定義了一個Book類並產生了對應的getter和setter方法。在setter方法中我們發現了this,而且還是this.而不是.this!
仔細研究setId方法,我們發現裡面的幾個id所對應的東西都是不一樣的。

setId(int id)中的id指的是外部調用這個方法時所賦予的參數,比如建立一個Book類變數book,book.setId(1)中的1就是參數。
this.id中的id我們顯然希望他是Book類中的成員變數id,=id中的id顯然應該是賦予的參數,和setId(int id)為同樣的東西。
故而這個this就是為了防止編譯器把三個id都認為是同樣的東西,特地指明了第二個this是Book類中的成員變數id。

  • 有些同學可能會和第一個用法中的this混淆,認為this不是指向setId方法嗎?這說明你混淆了類和方法之間的區別。this指向的是類而不是方法。
3.用於在構造方法中引用滿足指定參數類型的構造器

這個說法可能有些複雜,因為這個主要是用在Java中的,Java中一個方法可能對應多種構造方法,如:

public class Student    public Student()    }   public Student(String name)    }   public Student(int id)    }}

以方便我們減少方法的數量,那麼如果我們修改上述代碼變為:

public class Student    public Student() {       this(“HelloWorld”);   }   public Student(String name) {   }   public Student(int id) {    }}

this又出現了,這次this出現在了構造方法之中,這意味著當你不使用參數調用Student類時,編譯器會自動認為你使用了“HelloWorld”參數調用了Student類中的Student(String name)的構造方法,如果改成this(1)的話那就是Student(int id)的構造方法.

  • 註:第三種用法,每個構造方法只能引用一個構造方法!而且必須位於起始位置。

    public class Student    public Student() {       this(“HelloWorld”);   }   public Student(String name) {       this(1);   }   public Student(int id) {   }}

    這是符合規範的,無論你使用Student()還是Student(“...”),都等於Student(1);

    public class Student    public Student() {       this(“HelloWorld”);       this(1);   }   public Student(String name) {      }   public Student(int id) {   }}

    這是錯誤的,你使用Student()時編譯器會不知道到底應該使用Student(“HelloWorld”)還是Student(1)而選擇死亡。

Android中this的用法

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.