this學習
1、this調用構造方法測試
構造方法之間的調用,能夠經過this關鍵字來完成。this
構造方法調用格式:spa
1 this(參數列表);
構造方法的調用:設計
2、this的原理圖解code
瞭解了構造方法之間是能夠相互調用,那爲何他們之間經過this就能夠調用呢?經過上面的學習,簡單知道使用this能夠實現構造方法之間的調用,可是爲何就會知道this調用哪個構造方法呢?接下來須要圖解完成。對象
圖列說明:blog
一、先執行main方法,main方法壓棧,執行其中的new Person(「張三」,23);繼承
二、堆內存中開闢空間,併爲其分配內存地址0x33,,緊接着成員變量默認初始化(name=null age = 0);內存
三、擁有兩個參數的構造方法(Person(String nm , int a))壓棧,在這個構造方法中有一個隱式的this,由於構造方法是給對象初始化的,那個對象調用到這個構造方法,this就指向堆中的那個對象。
四、因爲Person(String nm , int a)構造方法中使用了this(nm);構造方法Person(String nm)就會壓棧,並將「張三」傳遞給nm。在Person(String nm , int a)構造方法中一樣也有隱式的this,this的值一樣也爲0x33,這時會執行其中name = nm,即把「張三」賦值給成員的name。當賦值結束後Person(String nm , int a)構造方法彈棧。
五、程序繼續執行構造方法(Person(String nm , int a)中的age = a;這時會將23賦值給成員屬性age。賦值結束構造方法(Person(String nm , int a)彈棧。
六、當構造方法(Person(String nm , int a)彈棧結束後,Person對象在內存中建立完成,並將0x33賦值給main方法中的p引用變量。
注意:
this到底表明什麼呢?this表明的是對象,具體表明哪一個對象呢?哪一個對象調用了this所在的方法,this就表明哪一個對象。
調用其餘構造方法的語句必須定義在構造方法的第一行,緣由是初始化動做要最早執行。
3、成員變量和局部變量同名問題
當在方法中出現了局部變量和成員變量同名的時候,那麼在方法中怎麼區別局部變量成員變量呢?能夠在成員變量名前面加上this.來區別成員變量和局部變量。
public class Person { private int age; private String name; // 給姓名和年齡初始化的構造方法 Person(String name, int age) { // 當須要訪問成員變量是,只須要在成員變量前面加上this.便可 this.name = name; this.age = age; } public void speak() { System.out.println("name=" + this.name + ",age=" + this.age); } } class PersonDemo { public static void main(String[] args) { Person p = new Person("張三", 23); p.speak(); } }
4、this的應用
學習完了構造方法、this的用法以後,如今作個小小的練習。
需求:在Person類中定義功能,判斷兩我的是不是同齡人
1 class Person { 2 private int age; 3 private String name; 4 5 // 給姓名和年齡初始化的構造方法 6 Person(String name, int age) { 7 // 當須要訪問成員變量是,只須要在成員變量前面加上this.便可 8 this.name = name; 9 this.age = age; 10 } 11 12 public void speak() { 13 System.out.println("name=" + this.name + ",age=" + this.age); 14 } 15 16 // 判斷是否爲同齡人 17 public boolean equalsAge(Person p) { 18 // 使用當前調用該equalsAge方法對象的age和傳遞進來p的age進行比較 19 // 因爲沒法肯定具體是哪個對象調用equalsAge方法,這裏就可使用this來代替 20 /* 21 * if(this.age == p.age) { return true; } return false; 22 */ 23 return this.age = p.age; 24 } 25 }
super
1、子父類中構造方法的調用
在建立子類對象時,父類的構造方法會先執行,由於子類中全部構造方法的第一行有默認的隱式super();語句。
格式:
1 調用本類中的構造方法 2 this(實參列表); 3 調用父類中的空參數構造方法 4 super(); 5 調用父類中的有參數構造方法 6 super(實參列表);
爲何子類對象建立都要訪問父類中的構造方法?由於子類繼承了父類的內容,因此建立對象時,必需要先看父類是如何對其內容進行初始化的,看以下程序:
1 //父類 2 public class Person { 3 int a=1; 4 public Person(){ 5 6 } 7 public Person(String name){ 8 a=5; 9 System.out.println("父類構造方法"); 10 } 11 } 12 //子類 13 public class Test { 14 15 public static void main(String[] args) { 16 Student stu=new Student("name"); 17 18 } 19 } 20 //測試類 21 public class Test { 22 23 public static void main(String[] args) { 24 Student stu=new Student("name"); 25 26 } 27 }
運行結果爲:
父類構造方法
5
總結:經過結果發現,子類構造方法執行時中,調用了父類構造方法,這說明,子類構造方法中有一句super()。
那麼,子類中的構造方法爲何會有一句隱式的super()呢?
緣由:子類會繼承父類中的內容,因此子類在初始化時,必須先到父類中去執行父類的初始化動做。這樣,纔可使用父類中的內容。
當父類中沒有空參數構造方法時,子類的構造方法必須有顯示的super語句,指定要訪問的父類有參數構造方法。
二 、子類對象建立過程的細節
若是子類的構造方法第一行寫了this調用了本類其餘構造方法,那麼super調用父類的語句還有嗎?
這時是沒有的,由於this()或者super(),只能定義在構造方法的第一行,由於初始化動做要先執行。
父類構造方法中是否有隱式的super呢?
也是有的。記住:只要是構造方法默認第一行都是super();
父類的父類是誰呢?super調用的究竟是誰的構造方法呢?
Java體系在設計,定義了一個全部對象的父類Object
注意:
一、類中的構造方法默認第一行都有隱式的super()語句,在訪問父類中的空參數構造方法。因此父類的構造方法既能夠給本身的對象初始化,也能夠給本身的子類對象初始化。
二、若是默認的隱式super()語句在父類中沒有對應的構造方法,那麼必須在構造方法中經過this或者super的形式明確要調用的構造方法。
3、super應用
描述學生和工人這兩個類,將他們的共性name和age抽取出來存放在父類中,並提供相應的get和set方法,同時須要在建立學生和工人對象就必須明確姓名和年齡。
1 //定義Person類,將Student和Worker共性抽取出來 2 class Person { 3 private String name; 4 private int age; 5 public Person(String name, int age) { 6 // super(); 7 this.name = name; 8 this.age = age; 9 } 10 public String getName() { 11 return name; 12 } 13 public void setName(String name) { 14 this.name = name; 15 } 16 public int getAge() { 17 return age; 18 } 19 public void setAge(int age) { 20 this.age = age; 21 } 22 } 23 class Student extends Person { 24 // Student類的構造方法 25 Student(String name, int age) { 26 // 使用super關鍵字調用父類構造方法,進行相應的初始化動做 27 super(name, age); 28 } 29 public void study() {// Studnet中特有的方法 30 System.out.println(this.getName() + "同窗在學習"); 31 } 32 } 33 class Worker extends Person { 34 Worker(String name, int age) { 35 // 使用super關鍵字調用父類構造方法,進行相應的初始化動做 36 super(name, age); 37 } 38 public void work() {// Worker 中特有的方法 39 System.out.println(this.getName() + "工人在工做"); 40 } 41 } 42 public class Test { 43 public static void main(String[] args) { 44 Student stu = new Student("小明",23); 45 stu.study(); 46 47 Worker w = new Worker("小李",45); 48 w.work(); 49 } 50 }