1. 程式人生 > >Java基礎——面向對象(4)

Java基礎——面向對象(4)

無法 code 由於 自己的 自己 通過 java tro 子類構造方法

第一章 構造方法

對象創建時要執行的方法。既然是對象創建時要執行的方法,那麽只要在new對象時,知道其執行的構造方法是什麽,就可以在執行這個方法的時候給對象進行屬性賦值。

構造方法的格式:

修飾符 構造方法名(參數列表){

}

構造方法的體現:

構造方法沒有返回值類型。也不需要寫返回值。因為它是為構建對象的,對象創建完,方法就執行結束。

構造方法名稱必須和類型保持一致。

構造方法沒有具體的返回值。

構造方法的代碼體現:

class Person {
    // Person的成員屬性age和name
    private int age;
    private String name;

    
// Person的構造方法,擁有參數列表 Person(int a, String nm) { // 接受到創建對象時傳遞進來的值,將值賦給成員屬性 age = a; name = nm; } }

構造方法的細節:

1、一個類中可以有多個構造方法,多個構造方法是以重載的形式存在的

2、構造方法是可以被private修飾的,作用:其他程序無法創建該類的對象。

class Person {
    private int age;
    private String name;

    // 私有無參數的構造方法,即外界不能通過new Person();語句創建本類對象
private Person() { } // 多個構造方法是以重載的形式存在 Person(int a) { age = a; } Person(String nm, int a) { name = nm; age = a; } }

構造方法在對象創建時就執行了,而且只執行一次。一般方法是在對象創建後,需要使用時才被對象調用,並可以被多次調用。

第二章 this關鍵字

2.1 this調用構造方法

構造方法調用格式:

this(參數列表);

構造方法的調用

class Person {
    
// Person的成員屬性 private int age; private String name; // 無參數的構造方法 Person() { } // 給姓名初始化的構造方法 Person(String nm) { name = nm; } // 給姓名和年齡初始化的構造方法 Person(String nm, int a) { // 由於已經存在給姓名進行初始化的構造方法 name = nm;因此只需要調用即可 // 調用其他構造方法,需要通過this關鍵字來調用 this(nm); // 給年齡初始化 age = a; } }

2.2 成員變量和局部變量同名問題

當在方法中出現了局部變量和成員變量同名的時候,可以在成員變量名前面加上this.來區別成員變量和局部變量.

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();
    }
}

第三章 super關鍵字

1.1 子父類中構造方法的調用

在創建子類對象時,父類的構造方法會先執行,因為子類中所有構造方法的第一行有默認的隱式super();語句。

調用本類中的構造方法

this(實參列表);

調用父類中的空參數構造方法

super();

調用父類中的有參數構造方法

super(實參列表);

為什麽子類對象創建都要訪問父類中的構造方法?因為子類繼承了父類的內容,所以創建對象時,必須要先看父類是如何對其內容進行初始化的.

public class Test {
    public static void main(String[] args) {
        new Zi();
    }
    
}
class Fu{
    int num ;
    Fu(){
        System.out.println("Fu構造方法"+num);
        num = 4;
    }
}
class Zi extends Fu{
    Zi(){
         //super(); 調用父類空參數構造方法
        System.out.println("Zi構造方法"+num);
    }
}

技術分享圖片

通過結果發現,子類構造方法執行時中,調用了父類構造方法,這說明,子類構造方法中有一句super()。

那麽,子類中的構造方法為什麽會有一句隱式的super()呢?

原因:子類會繼承父類中的內容,所以子類在初始化時,必須先到父類中去執行父類的初始化動作。這樣,才可以使用父類中的內容。

當父類中沒有空參數構造方法時,子類的構造方法必須有顯示的super語句,指定要訪問的父類有參數構造方法。

如果子類的構造方法第一行寫了this調用了本類其他構造方法,那麽super調用父類的語句還有嗎?

這時是沒有的,因為this()或者super(),只能定義在構造方法的第一行,因為初始化動作要先執行。

父類構造方法中是否有隱式的super呢?

也是有的。記住:只要是構造方法默認第一行都是super();

註意:

類中的構造方法默認第一行都有隱式的super()語句,在訪問父類中的空參數構造方法。所以父類的構造方法既可以給自己的對象初始化,也可以給自己的子類對象初始化。

如果默認的隱式super()語句在父類中沒有對應的構造方法,那麽必須在構造方法中通過this或者super的形式明確要調用的構造方法。

Java基礎——面向對象(4)