java--面對對象之this關鍵字和super關鍵字

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);內存

三、擁有兩個參數的構造方法(PersonString nm , int a))壓棧,在這個構造方法中有一個隱式的this,由於構造方法是給對象初始化的,那個對象調用到這個構造方法,this就指向堆中的那個對象。

四、因爲PersonString nm , int a)構造方法中使用了this(nm);構造方法Person(String nm)就會壓棧,並將「張三」傳遞給nm。在PersonString nm , int a)構造方法中一樣也有隱式的thisthis的值一樣也爲0x33,這時會執行其中name = nm,即把「張三」賦值給成員的name。當賦值結束後PersonString nm , int a)構造方法彈棧。

五、程序繼續執行構造方法(PersonString nm , int a)中的age = a;這時會將23賦值給成員屬性age。賦值結束構造方法(PersonString nm , int a)彈棧。

六、當構造方法(PersonString 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應用

 

    描述學生和工人這兩個類,將他們的共性nameage抽取出來存放在父類中,並提供相應的getset方法,同時須要在建立學生和工人對象就必須明確姓名和年齡。

 

 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 }
相關文章
相關標籤/搜索