三妹終于上大學了,學的計算機軟體程式設計。她學校離我家很近,坐公共汽車也就 10 站路的距離, 每逢周末她都會來找我,讓我輔導她學習 Java。作為一名擁有十餘年程式設計經驗的程式員,再加上父母給我們的這份血緣關系,我覺得義不容辭。
“二哥,這次我們要學習的内容是‘構造方法’,對吧?”看來三妹已經提前預習了我上次留給她的作業。
“是的,三妹。在 Java 中,構造方法是一種特殊的方法,當一個類被執行個體化(建立對象)的時候,就會調用構造方法。隻有在構造方法被調用的時候,對象才會被配置設定記憶體空間。 ”我面帶着樸實無華的微笑回答着她,“每次使用 new 關鍵字建立對象的時候,構造方法至少會被調用一次。”
“如果你在一個類中沒有看見構造方法,并不是因為構造方法不存在,而是被預設了,編譯器會給這個類提供一個預設的構造方法。”
“往大的方面說,Java 有兩種類型的構造方法:無參構造方法和有參構造方法。”
“注意,之是以叫它構造方法,是因為對象在建立的時候,需要通過構造方法初始化值(就是描寫對象的那些狀态)。”
----正兒八經的分割線,正文開始------------
01、建立構造方法的規則有哪些
構造方法必須符合以下三個規則:
構造方法的名字必須和類名一樣;
構造方法沒有傳回類型;
構造方法不能是抽象的、靜态的、最終的、同步的,也就是說,構造方法不能通過 abstract、static、final、synchronized 關鍵字修飾
不過,我們可以使用通路權限修飾符(private、protected、public、default)來修飾構造方法,它控制了構造方法的建立方式。
02、 什麼是預設構造方法
如果一個構造方法中沒有任何參數,那麼它就是一個預設構造方法,也稱為無參構造方法。
/**
* @author 微信搜「沉默王二」,回複關鍵字 PDF
*/
public class Bike {
Bike(){
System.out.println("一輛自行車被建立");
}
public static void main(String[] args) {
Bike bike = new Bike();
}
}
在上面這個例子中,我們為 Bike 類中建立了一個無參的構造方法,它在我們建立對象的時候被調用。
程式輸出結果如下所示:
一輛自行車被建立
通常情況下,無參構造方法是可以預設的,我們程式員并不需要顯式的聲明無參構造方法,我們更傾向于把這項工作交給編譯器。
“二哥,預設構造方法的目的是什麼?它是一個空的啊!”三妹疑惑地看着我,提出了這個尖銳的問題。
“三妹啊,預設構造方法的目的主要是為對象的字段提供預設值,看下面這個例子你就明白了。”我胸有成竹地回答道。
/**
* @author 沉默王二,一枚有趣的程式員
*/
public class Person {
private String name;
private int age;
public static void main(String[] args) {
Person p = new Person();
System.out.println("姓名 " + p.name + " 年齡 " + p.age);
}
}
輸出結果如下所示:
姓名 null 年齡 0
在上面的例子中,預設構造方法初始化了 name 和 age 的值,name 是 String 類型,是以預設值為 null,age 是 int 類型,是以預設值為 0。
03、什麼是有參構造方法
有參數的構造方法被稱為有參構造方法,參數可以有一個或多個。有參構造方法可以為不同的對象提供不同的值。當然,也可以提供相同的值。
/**
* @author 沉默王二,一枚有趣的程式員
*/
public class ParamConstructorPerson {
private String name;
private int age;
public ParamConstructorPerson(String name, int age) {
this.name = name;
this.age = age;
}
public void out() {
System.out.println("姓名 " + name + " 年齡 " + age);
}
public static void main(String[] args) {
ParamConstructorPerson p1 = new ParamConstructorPerson("沉默王二",18);
p1.out();
ParamConstructorPerson p2 = new ParamConstructorPerson("沉默王三",16);
p2.out();
}
}
在上面的例子中,構造方法有兩個參數(name 和 age),這樣的話,我們在建立對象的時候就可以直接為 name 和 age 指派了。
new ParamConstructorPerson("沉默王二",18);
new ParamConstructorPerson("沉默王三",16);