一、構造方法 在開發中經常需要在創建對象的同時明確對象的屬性值。構造方法就是在創建對象時要執行的方法。既然是對象創建時要執行的方法,那麼只要在new對象是,知道其執行的構造方法是什麼,就可以在執行這個方法的時候給對象進行屬性賦值。
構造方法的格式:修飾符 構造方法名(參數列表){ }
構造方法的體現:
構造方法沒有返回值類型。也不需要寫返回值。因爲它是爲構建對象的,對象創建完,方法就執行結束。
構造方法名稱必須和類型保持一致。
構造方法沒有具體的返回值。
構造方法的代碼體現:
class Person {
// Person的成員屬性age和name
private int age;
private String name;
// Person的構造方法,擁有參數列表
Person(int a, String nm) {
// 接受到創建對象時傳遞進來的值,將值賦給成員屬性
age = a;
name = nm;
}
}
構造方法調用:構造方法是專門用來創建對象的,也就是在new對象時要調用構造方法。
class Person {
// Person的成員屬性age和name
private int age;
private String name;
// Person的構造方法,擁有參數列表
Person(int a, String nm) {
// 接受到創建對象時傳遞進來的值,將值賦給成員屬性
age = a;
name = nm;
}
public void speak() {
System.out.println("name=" + name + ",age=" + age);
}
}
class PersonDemo {
public static void main(String[] args) {
// 創建Person對象,並明確對象的年齡和姓名
Person p2 = new Person(23, "張三");
p2.speak();
}
}
上述代碼演示了創建對象時構造方法的調用。即在創建對象時,會調用與參數列表對應的構造方法。
默認構造方法:
在沒有用構造方法之前,也可以通過new關鍵字創建對象,並調用相應的方法。描述事物時,並沒有顯示指定構造方法,當在編譯Java文件時,編譯器會自動給class文件中添加默認的構造方法。如果在描述類時,我們顯示指定了構造方法,那麼,當在編譯Java源文件時,編譯器就不會再給class文件中添加默認構造方法。
具體要不要在類中寫構造方法,要根據描述事物的特點來確定當描述的事物在創建其對象時就要明確屬性的值,這時就需要在定義類的時候書寫帶參數的構造方法。若創建對象時不需要明確具體的數據,這時可以不用書寫構造方法(不書寫也有默認的構造方法)。
構造方法的細節:
1、一個類中可以有多個構造方法,多個構造方法是以重載的形式存在的
2、構造方法是可以被private修飾的,作用:其他程序無法創建該類的對象。
二、this關鍵字 在方法之間調用時,可以通過方法名進行調用。但是針對構造方法,無法通過構造方法名來相互調用。
構造方法之間的調用,可以通過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;
}
}
成員變量和局部變量同名問題:
當在方法中出現了局部變量和成員變量同名的時候,那麼在方法中怎麼區別局部變量成員變量呢? 可以在成員變量名前面加上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關鍵字
在創建子類對象時,父類的構造方法會先執行,因爲子類中所有構造方法的第一行有默認的隱式super();語句。
格式:調用本類中的構造方法 this(實參列表);
調用父類中的空參數構造方法 super();
調用父類中的有參數構造方法 super(實參列表);
子類對象創建過程的細節:
1.如果子類的構造方法第一行寫了this調用了本類其他構造方法,那麼super調用父類的語句這時是沒有的,因爲this()或者super(),只能定義在構造方法的第一行,因爲初始化動作要先執行。
2.父類構造方法中也是有隱式的super的。只要是構造方法默認第一行都是super();
3.在Java體系中,定義了一個所有對象的父類Object。