Java-this、super關鍵字(認真分析)
阿新 • • 發佈:2017-10-11
習慣 類成員 發生 nbsp spa author ++ jvm 類繼承
一、this關鍵字
this關鍵字只能用於方法體內,當創建一個對象時候,JVM就會為這個對象分配一個資深的指針,就是this。因此this只能在非靜態方法中使用,靜態方法和靜態的代碼塊中絕對不能使用this,this只和特定的對象關聯,不和類關聯,同一個類的不同對象有不同的this。
舉個栗子:
1 package cn.zpoor.Test; 2 /** 3 * @author 薛定諤的貓 4 * 測試this*/ 5 public class Main { 6 private String name; 7 private int age; 8 privateString sex; 9 private int i = 33; 10 //一個參數的構造器 11 public Main(int n) { 12 age = n;//可以寫成this.age = age; 13 } 14 15 //帶有兩個參數的構造器 16 public Main(int age,String name,String sex) { 17 //成員變量和參數同名,成員變量被屏蔽,用this來訪問成員變量 18 this.name = name; 19 this.sex = sex;20 } 21 22 //默認構造器 23 public Main() { 24 this(0, null, null);//this調用另一個構造方法,並且只能放在第一行。 25 } 26 27 public Main(String name) { 28 this(0, name, "man"); 29 } 30 31 32 private void info(Main m) { 33 System.out.println("-------------"); 34 System.out.println(m.name);35 System.out.println(m.age); 36 System.out.println(m.sex); 37 this.f();//寫可以寫成this.f(); 38 } 39 40 private void f() { 41 //局部變量和成員變量相同,成員變量被屏蔽,用this來訪問成員變量 42 int i; 43 i = this.i++; 44 System.out.println(i); 45 System.out.println(this.i); 46 } 47 48 //返回當前實例的引用 49 50 private Main getSelf() { 51 return this; 52 } 53 54 55 public static void main(String[] args) { 56 Main m1 = new Main(); 57 Main m2 = new Main("zpoor"); 58 m1.info(m1); 59 m2.info(m2); 60 } 61 } 62 63 /*------------- 64 null 65 0 66 null 67 33 68 34 69 ------------- 70 zpoor 71 0 72 man 73 33 74 34 75 76 */
不要慌(冷靜分析):
一、通過this調用另一個構造方法,this(參數列表),僅僅在構造函數,別的地方不能用,而且要放在構造方法中的第一行
二、方法的參數或者方法中的局部變量和成員變量重名的情況下,成員變量被屏蔽,就要用this.成員變量來引用成員變量。如果沒有重名用不用都不為過。
三、在方法中,引用該方法所屬類的當前對象時候,直接用this
總結:this是指向對象本身的一個指針。
二、super關鍵字
super和this類似,是被屏蔽的成員變量或者成員方法,或者是引用被屏蔽的成員變量和成員方法,一般都是發生在繼承裏面,super用在子類裏面,用來訪問父類中屏蔽的成員
舉個栗子:
1 package cn.zpoor.Test; 2 /** 3 * @author 薛定諤的貓 4 * 測試super*/ 5 public class Father { 6 public String Value = "Father"; 7 public String x = "Father中的成員變量"; 8 9 public Father() { 10 System.out.println("Father的構造器被調用"); 11 } 12 13 public Father(String Value) { 14 this.Value = "Father帶參數的構造器運行了"; 15 } 16 17 public void info() { 18 System.out.println("Father的info方法被調用"); 19 } 20 public static void main(String[] args) { 21 new Son().test(); 22 } 23 } 24 25 class Son extends Father { 26 public String Value = "Son"; 27 28 public Son() { 29 super();//調用父類的構造方法,只能必須放在第一行 30 System.out.println("Son的無參方法被調用"); 31 } 32 33 public Son(String name) { 34 super(name); 35 System.out.println("Son帶參數的構造器被調用"); 36 } 37 38 //重寫父類info方法 39 public void info() { 40 System.out.println("Son的info方法被調用"); 41 } 42 43 public void test() { 44 String Value = "老鐵,得勁不?";//局部變量覆蓋成員變量和超類成員變量 45 System.out.println("-----1-----"); 46 System.out.println(Value);//輸出局部變量Value 47 System.out.println(this.Value);//輸出子類成員變量 48 System.out.println(super.Value);//輸出父類的成員變量 49 50 System.out.println("------2-----"); 51 System.out.println(x);//輸出超類成員變量x,子類繼承來的 52 System.out.println(super.x);//輸出曹磊成員變量x 53 54 System.out.println("--------3------"); 55 info();//調用子類的info方法 56 this.info();//調用子類的info方法 57 super.info();//調用超類的info方法 58 } 59 } 60 61 /* 62 Father的構造器被調用 63 Son的無參方法被調用 64 -----1----- 65 老鐵,得勁不? 66 Son 67 Father 68 ------2----- 69 Father中的成員變量 70 Father中的成員變量 71 --------3------ 72 Son的info方法被調用 73 Son的info方法被調用 74 Father的info方法被調用 75 */
總結(拿煙的手微微顫抖):
一、子類構造方法要調用父類的構造方法,super(參數列表),參數不是必須的,但是放在第一行是一定的。
二、當子類的局部變量或者子類的局部變量和父類的成員變量重名,也就是子類變量覆蓋父類變量的時候,super.成員變量來引用父類的成員變量,如果沒有覆 蓋,就不需要了,但是最好這樣,這是一個好習慣。
三、當子類的成員方法覆蓋了父類的成員方法,就是子類的方法定義和父類的方法相同(重寫,覆蓋),super.方法名(參數列表)來調用父類的成員變量。
不行了,煙燙手。
Java-this、super關鍵字(認真分析)