Java基礎——面向對象(4)
第一章 構造方法
對象創建時要執行的方法。既然是對象創建時要執行的方法,那麽只要在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)