構造方法
我們對封裝已經有了基本的了解,接下來我們來看一個新的問題,依然以Person為例,由於Person中的屬性都被private了,外界無法直接訪問屬性,必須對外提供相應的set和get方法。當創建人對象的時候,人對象一創建就要明確其姓名和年齡,那該怎么做呢?
構造方法介紹(構造器)
在開發中經常需要在創建對象的同時明確對象的屬性值,比如員工入職公司就要明確他的姓名、年齡等屬性信息。
那么,創建對象就要明確屬性值,那怎么解決呢?也就是在創建對象的時候就要做的事情,當使用new關鍵字創建對象時,怎么給對象的屬性初始化值呢?這 就要學習Java另外一門小技術,構造方法。
那什么是構造方法呢?從字面上理解即為構建創造時用的方法,即就是對象創建時要執行的方法。既然是對象創建時要執行的方法,那么只要在new對象時,知道其執行的構造方法是什么,就可以在執行這個方法的時候給對象進行屬性賦值。
構造方法的格式:
修飾符 構造方法名(參數列表)
{
}
構造方法的體現:
構造方法沒有返回值類型。也不需要寫返回值。因為它是為構建對象的,對象創建完,方法就執行結束。
構造方法名稱必須和類名保持一致。
構造方法沒有具體的返回值。
構造方法的代碼體現:
class Person {
// Person的成員屬性age和name
private int age;
private String name;
// Person的構造方法,擁有參數列表
Person(int a, String nm) {
// 接受到創建對象時傳遞進來的值,將值賦給成員屬性
age = a;
name = nm;
}
}
默認構造方法和細節
1.一個都沒有。默認添加無參構造
2.一個以上,不默認添加無參構造需手動添加
在沒有學習構造方法之前,我們也可以通過new關鍵字創建對象,並調用相應的方法,同時在描述事物時也沒有寫構造方法。這是為什么呢?
在之前學習的過程中,描述事物時,並沒有顯示指定構造方法,當在編譯Java文件時,編譯器會自動給class文件中添加默認的構造方法。如果在描述類時,我們顯示指定了構造方法,那么,當在編譯Java源文件時,編譯器就不會再給class文件中添加默認構造方法。
class Person {
//如果沒有顯示指定構造方法,編譯會在編譯時自動添加默認的構造方法
//Person(){} //空參數的默認構造方法
}
當在描述事物時,要不要在類中寫構造方法呢?這時要根據描述事物的特點來確定,當描述的事物在創建其對象時就要明確屬性的值,這時就需要在定義類的時候書寫帶參數的構造方法。若創建對象時不需要明確具體的數據,這時可以不用書寫構造方法(不書寫也有默認的構造方法)。
構造方法的細節:
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;
}
}
構造方法和一般方法區別
到目前為止,學習兩種方法,分別為構造方法和一般方法,那么他們之間有什么異同呢?
構造方法在對象創建時就執行了,而且只執行一次。
一般方法是在對象創建后,需要使用時才被對象調用,並可以被多次調用。
問題:
有了構造方法之后可以對對象的屬性進行初始化,那么還需要對應的set和get方法嗎?
需要相應的set和get方法,因為對象在創建之后需要修改和訪問相應的屬性值時,在這時只能通過set或者get方法來操作。
思考,如下代碼有問題嗎?
class Person {
void Person() { //構造器沒有返回值
}
}
class PersonDemo {
public static void main(String[] args) {
Person p = new Person();
}
}
