1. 程式人生 > 其它 >Java基礎:構造器小結

Java基礎:構造器小結

目錄

1 構造器是怎麼產生的

需求:物件的初始化。
實現:
C語言中,基本資料型別,只需要宣告,不需要初始化,不過僅僅聲明後,其值是不確定的,是分配給該變數的記憶體塊區域中的原本的值,該值沒有任何意義,只能保證程式執行不報錯;而結構型別,也只需要宣告,不需要初始化,其內部成員的值也是不確定的。這樣的話,如果不顯式賦值,則程式會產生意外的結果,也就是會出錯。
而Java中,基本資料型別和引用資料型別(物件型別),只宣告,不初始化(給其顯式地賦值),並且你還想使用該值進行運算,則會報一個編譯時錯誤,提示你該物件沒有初始化。
但是如何初始化,而且是優雅地初始化。
基本資料型別,沒啥好討論的,直接 int i = 1;

完事。咱們討論類物件這種型別。
首先,考慮呼叫一個方法來對某個物件進行初始化,包括給該物件的屬性賦值,我們可以呼叫一個方法,比如initialize(),但有2個問題:1. 如何保證不和類中的其他成員變數、成員方法名稱重複;2. 編譯器如何優雅快速地確定要呼叫哪個方法,比如我們每次起床都要刷牙洗臉,每次吃飯都用碗筷,不需要動腦筋思考。
所以最終Java設計者參考和使用了C++的方案,使用類名作為構造器的名字。
由於類名首字母是大寫,而類中的成員變數和成員方法,首字母都是小寫,就保證了構造器不會和類中的其他變數、方法重名。
比如下面這樣:

class Dog {}

...
// 初始化Dog類物件。其中,'new Dog()' 就是呼叫構造器初始化 'dog' 物件
Dog dog = new Dog();
...

2 定義

在建立物件時被自動呼叫的特殊方法。

注意:在java中,物件基本上最終都要呼叫構造器來建立,但也有特殊情況。

3 命名注意事項

  1. 構造器的名稱,相比於其他方法而言,比較特殊
    1. 名稱和類名相同
    2. 首字母大寫(類名首字母也是大寫;另外,其他方法首字母都是小寫)
    3. 不用寫返回值型別(其他方法有返回值,則寫上返回值型別;沒有,則也需要寫void關鍵字)
    4. 修飾符卻可以使用public,protected 或 private等。

4 分類

  1. 無參構造器(該構造器沒有引數)
  2. 有參構造器(該構造器有1個或多個引數)

5 this和super關鍵字在構造器中的用法注意

先舉個例子:


public class Animal {
    private String id;

    public Animal() {
    }

    public Animal(String id) {
        this.id = id;
    }
}

public class Dog extends Animal {
    String name;
    Integer age;

    public Dog(String id, Integer age) {
        super(id);
        this.age = age;
    }

    public Dog(String id, String name, Integer age) {
        this(id, age);
        this.name = name;
    }
}

其中:

  1. this(id, age); 是呼叫 同一個類中的另一個構造器 public Dog(String id, Integer age) ,注意:必須寫在第一行,否則報編譯時錯誤;

  2. super(id);是呼叫 Dog的父類 Animal 中的構造器 public Animal(String id) ,注意:必須寫在第一行,否則報編譯時錯誤。

6 其他

  1. 當類中沒有構造器時,程式會自動幫我們建立一個無參構造器;反之,如果類中有人為建立的構造器,不管是否有引數,程式都不會幫我們建立構造器了。
  2. 類中允許有多個構造器。