標籤:代碼 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”的寫法。
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的用法