接下來重點學習一下兩種方式
隱式初始化,jvm自動呼叫,無需我們手動操作達成上述兩個條件,則jvm在初始化子類物件時進行隱式初始化條件為
所有父類的構造方法都執行完畢,開始執行子類構造方法
需要注意的是
顯式初始化,需要程式設計師手動寫**,告訴jvm呼叫哪個父類構造器如何使用?
什麼是super關鍵字?
this vs super
this關鍵字:表示當前物件的引用 super關鍵字:super代表父類物件的引用
this呼叫當前類中定義的構造方法:this(實參列表)
super呼叫父類中定義的構造方法:super(實參列表)
this訪問當前物件的成員變數值 super訪問父類物件中,成員變數的值
this訪問當前物件的成員方法 super訪問父類物件,成員方法
super與this關鍵字this關鍵字概念:this代表所在類的物件引用。
記住: 方法被哪個物件呼叫,this就代表哪個物件。
1.super可以在子類中 呼叫父類中名稱相同的 成員方法和成員變數
2.this可以在方法中呼叫 類中的與方法內區域性變數名稱相同 的成員方法和成員變數
3.super和this的區別
(a).this 代表當前類的物件
代表物件的記憶體空間標識(用來儲存當前類定義的內容,成員變數、方法)
(b).super (代表父類物件) 可以這麼理解,實際並不代表父類物件
代表物件的記憶體空間的標識(用來儲存父類定義的內容,成員變數、方法)
使用場景:
當區域性變數和成員變數名字相同時用this,子類變數和父類變數名字相同時用super
super用法:(this和super均適用)
1.訪問成員變數
this.成員變數 super.成員變數 (區域性變數直接呼叫不需要修飾符)
2.訪問構造方法
this(…) super(…) 如果是有參方法,()裡面寫引數
3.訪問成員方法
this.成員方法() super.成員方法()
super和this使用情況記憶體圖
1.main方法入棧,建立乙個son型別變數son,然後在堆上建立son型別物件new son()
2.物件的記憶體空間有兩個標識,this空間儲存子類的成員變數num1=10,num2=20,super空間儲存父類變數num1=1,num2=2;
son呼叫show方法,show()入棧,它的區域性變數為num1=100,num2=200;,呼叫不同的變數需要在變數名前加上識別符號,如super.num1, this.num2
隱式子類物件建立:
條件:
a. 當父類提供了預設的建構函式(無參構造方法)
b. 子類的構造方法中, 沒有顯式呼叫父類的其它構造方法
結果:
jvm自動在子類構造方法第一句加上 「 super() 「
在執行子類的構造方法之前,jvm會自動執行父類
顯式子類物件建立:
程式設計師寫**告訴jvm在呼叫子類構造器之前呼叫父類構造方法
可以在子類構造器的第一行使用super關鍵字,呼叫父類的構造方法
總結:1,無論是隱式還是顯式,最終都是為了保證父類構造器先於子類執行
2,若父類中不存在預設構造方法,則必須在子類構造方法中使用super關鍵字呼叫父類構造器
3,在子類構造方法中,super語句必須在第一行
4,在子類構造方法中,也可以用this呼叫自身構造,也必須在第一行
5,this和super不能共存
6,構造**塊和靜態**塊也是「先父後子」
為什麼this和super都必須在第一行?
因為子類構造器第一行永遠都有乙個super關鍵字呼叫,如果你自己的super和this不在第一行,會形成迴圈
分析程式:
public
class
demo
}class
person
}class
student
extends
person
public
student
(int svar)
public
student
(int svar, string svarstring)
}class
primarystudent
extends
student
}ends student
}
輸出:
person類的無參構造
student int構造方法
student int string構造方法
primarystudent類的 三參構造
java筆記 初識物件導向04繼承
一,繼承中類的建構函式 在對子類物件進行初始化時,父類的建構函式也會執行,那是因為子類的建構函式預設第一行有一條隱式的語句super super 這會訪問父類中的空引數的建構函式。一些有有用的結論 子類的所有的建構函式,預設都會訪問父類中空引數的建構函式 因為子類每乙個建構函式內的第一行都有一句隱式...
day04物件導向 static 繼承
物件導向最重要的概念是 類和物件。定義類構造器this關鍵字 封裝 靜態成員變數訪問 例項成員變數訪問 靜態方法訪問 例項方法訪問 拓展面試題 1 靜態方法中是否可以直接訪問靜態方法?可以的,都屬於類可以直接訪問的 2 靜態方法中是否可以直接訪問例項方法?不可以的,例項方法屬於物件必須用物件訪問 3...
物件導向基礎 繼承05(子類的屬性隱藏 方法覆蓋)
子父類中能否擁有同名的屬性呢?如果可以,請嘗試 建立子類物件,在父類中,編寫方法,返回該屬性 最終我們發現,子類可以訪問到父類的成員變數 如果我就想在子類方法中,訪問父類的同名成員變數,怎麼辦?物件名點成員變數名的,編譯器檢索機制 注意事項 子父類中能否擁有同名的方法呢?如果可以,請嘗試 再在父子類...