當我們在寫大量代碼的時候往往忽略了最基本的東西 ,在這裏我跟大家分享一下this,super,final的用法
Android 中this主要有三種用法:
1、表示對當前對象的引用
2、表示用類的成員變量,而非函數參數,注意在函數參數和成員變量同名是進行區分
3、用於在構造方法中引用滿足指定參數類型的構造器(其實也就是構造方法)。但是這裏必須非常注意:只能引用一個構造方法且必須位於開始
例子:
1、表示對當前對象的引用
this指的是當前對象,你在一個類裏調用this,就是調用這個類的對象,如果你在一個內部類裏調用this,這個this所指的 是這個內部類,而程序如果需要的是外部類的對象,就使用使用 類名.this,這是因爲內部類可以直接訪問外部類的屬性和方法
2、表示用類的成員變量,而非函數參數,注意在函數參數和成員變量同名是進行區分
3、用於在構造方法中引用滿足指定參數類型的構造器(其實也就是構造方法)。但是這裏必須非常注意:只能引用一個構造方法且必須位於開始
Android 中super主要用法:
class Person { 2 public int c; 3 private String name; 4 private int age; 5 protected void setName(String name){ 6 this.name=name; 7 } 8 protected void setAge(int age){ 9 this.age=age; 10 } 11 protected void print(){ 12 System.out.println("Name="+name+" Age="+age); 13 } 14 } 15 public class DemoSuper extends Person{ 16 public void print(){ 17 System.out.println("DemoSuper:"); 18 super.print(); 19 } 20 public static void main(String[] args){ 21 DemoSuper ds=new DemoSuper(); 22 ds.setName("kevin"); 23 ds.setAge(22); 24 ds.print(); 25 } 26 }
在DemoSuper中,重新定義的print方法覆寫了父類的print方法,它首先做一些自己的事情,然後調用父類的那個被覆寫了的方法。輸出結果說明了這一點:
DemoSuper:
Name=kevin Age=22
這樣的使用方法是比較常用的。另外如果父類的成員可以被子類訪問,那你可以像使用this一樣使用它,用“super.父類中的成員名”的方式,但常常你並不是這樣來訪問父類中的成員名的。
在構造函數中
構造函數是一種特殊的方法,在對象初始化的時候自動調用。在構造函數中,this和super也有上面說的種種使用方式,並且它還有特殊的地方,請看下面的例子:
1 class Person { 2 public static void prt(String s){ 3 System.out.println(s); 4 } 5 Person() { 6 prt("A Person."); 7 } 8 Person(String name) { 9 prt("A person name is:"+name); 10 } 11 } 12 public class Chinese extends Person{ 13 Chinese() { 14 super(); //調用父類構造函數(1) 15 prt("A chinese.");//(4) 16 } 17 Chinese(String name) { 18 super(name);//調用父類具有相同形參的構造函數(2) 19 prt("his name is:"+name); 20 } 21 Chinese(String name,int age) { 22 this(name);//調用當前具有相同形參的構造函數(3) 23 prt("his age is:"+age); 24 } 25 public static void main(String[] args) { 26 Chinese cn=new Chinese(); 27 cn=new Chinese("kevin"); 28 cn=new Chinese("kevin",22); 29 } 30 }
在這段程序中,super後加參數的是用來調用父類中具有相同形式的構造函數,如1和2處。this後加參數則調用的是當前具有相同參數的構造函數,如3處。當然,在 Chinese的各個重載構造函數中,this和super.prt”(因爲它是父類中的方法且可被子類訪問因爲子類是內部類),它照樣可以正確運行。但這樣似乎就有點畫蛇添足的味道了。
最後,寫了這麼多,如果你能對“this通常指代當前對象,super通常指代父類”這句話牢記在心,那麼本篇便達到了目的.
Android 中static與final主要用法:
static
final
public class TestStaticFinal {
private static final String strStaticFinalVar = "aaa";
private static String strStaticVar = null;
private final String strFinalVar = null;
private static final int intStaticFinalVar = 0;
private static final Integer integerStaticFinalVar = new Integer(8);
private static final ArrayList<String> alStaticFinalVar = new ArrayList<String>();
private void test() {
System.out.println("-------------值處理前----------");
System.out.println("strStaticFinalVar=" + strStaticFinalVar + "");
System.out.println("strStaticVar=" + strStaticVar + "");
System.out.println("strFinalVar=" + strFinalVar + "");
System.out.println("intStaticFinalVar=" + intStaticFinalVar + "");
System.out.println("integerStaticFinalVar=" + integerStaticFinalVar + "");
System.out.println("alStaticFinalVar=" + alStaticFinalVar + "");
//strStaticFinalVar="哈哈哈哈";//錯誤,final表示終態,不可以改變變量本身.
strStaticVar = "哈哈哈哈"; //正確,static表示類變量,值可以改變.
//strFinalVar="呵呵呵呵"; //錯誤, final表示終態,在定義的時候就要初值(哪怕給個null),一旦給定後就不可再更改。
//intStaticFinalVar=2; //錯誤, final表示終態,在定義的時候就要初值(哪怕給個null),一旦給定後就不可再更改。
//integerStaticFinalVar=new Integer(8); //錯誤, final表示終態,在定義的時候就要初值(哪怕給個null),一旦給定後就不可再更改。
alStaticFinalVar.add("aaa"); //正確,容器變量本身沒有變化,但存放內容發生了變化。這個規則是非常常用的,有很多用途。
alStaticFinalVar.add("bbb"); //正確,容器變量本身沒有變化,但存放內容發生了變化。這個規則是非常常用的,有很多用途。
System.out.println("-------------值處理後----------");
System.out.println("strStaticFinalVar=" + strStaticFinalVar + "");
System.out.println("strStaticVar=" + strStaticVar + "");
System.out.println("strFinalVar=" + strFinalVar + "");
System.out.println("intStaticFinalVar=" + intStaticFinalVar + "");
System.out.println("integerStaticFinalVar=" + integerStaticFinalVar + "");
System.out.println("alStaticFinalVar=" + alStaticFinalVar + "");
}
public static void main(String args[]) {
new TestStaticFinal().test();
}
}