Java初始化順序
*********************繼承中的對象初始化順序(內存結構)************************
private 修飾的屬性 和方法 不能被繼承
父類中 private 修飾的屬性 比如 private BMW bmw = new BMW(); 在子類對象中存在不存在?
其實是有的! 子類對象包含父類中所有的屬性的....
一.隱式的創建父類的對象
1. 給父類對象的實例變量分配空間、默認初始化
2. 聲明時初始化、初始化塊初始化
3. 構造函數初始化
二.創建子類的對象
1. 給子類對象的實例變量分配空間、默認初始化
2. 聲明時初始化、初始化塊初始化
3. 構造函數初始化
二.創建子類的對象
父類對象的初始化塊執行
使用父類的name,age構造函數初始化
子類對象的初始化塊執行
子類sno,name,age構造函數執行
*******************************super指針****************************
super 指向隱式創建的父類對象
一. 使用super()調用父類的構造函數
(1) super()
在子類構造函數中 如果什麽也不寫 相當於寫上 super() 調用父類默認的構造函數
註意: 這時 父類中 如果寫了帶參數的構造函數,一定要把不帶參數的默認的構造函數加上
否則會報錯
2. super(參數) 調用指定的父類構造函數
public Student(int sno,String name,int age){
//super();//調用父類的默認的構造函數
super(name,age);//調用指定的父類構造函數初始化
System.out.println("子類sno,name,age構造函數執行");
this.sno = sno;
}
繼承! = 含有
繼承: 子類對象可以有權利隨意訪問,使用this來隨意訪問屬性或方法才叫繼承
二. 使用super 訪問被隱藏的父類同名實例變量
super.父類屬性名
例如
super.name
三. 使用super調用 父類的方法
super.父類方法名()
public class JavaTeacher extends Teacher{
public void teach(){
super.teach();//調用父類的teach()方法 保留父類的行為 解決了代碼冗余問題
System.out.println("我不僅要說 而且要敲代碼");
}
public static void main(String[] args) {
JavaTeacher jt = new JavaTeacher();
jt.teach();
}
}
*********************************************屬性的隱藏**************************************
父類Person 中定義一個name="父親"
子類Student中也定義一個name="孩子"
子類對象中有兩份name,直接在子類對象中 定義一個方法 intro 打印 name 打印的是子類對象的name
叫做屬性的隱藏
*******************************************繼承中的類初始化**************************************
第一次使用類的時候
Student s = new Student();
一.父類的類初始化
二.子類的類初始化
********************************重寫 Override (也叫覆蓋)************************
一.why
大雁和鴿子都屬於鳥類, 繼承鳥這個類,都可以飛,而鴕鳥是一種特殊的鳥,不會飛.如果鴕鳥
繼承鳥類以後不做任何處理,鴕鳥也會飛了.. 顯然不對
當子類的行為 和 從父類繼承下來的行為 不太一樣的時候, 需要使用重寫 ,來重新定義子類的行為
二.what 什麽是重寫
也叫做覆蓋
推翻 父類繼承下來的行為 整個推翻 重寫
三. how 如何重寫
重寫首先建立在繼承的基礎上,子類要繼承父類..
最簡單的重寫: 子類定義的方法 和父類方法完全一樣 ,叫做重寫
演示代碼:
鳥
package com.chapter8.演示重寫;
//鳥
public class Bird {
public void fly(){
System.out.println("我是一只小小鳥,我在飛");
}
}
鴕鳥
public class TuoNiao extends Bird {
public void fly(){
System.out.println("我是鴕鳥,我不會飛");
}
public static void main(String[] args) {
TuoNiao tuoniao = new TuoNiao();
tuoniao.fly();
}
}
************************************重寫規則: 一同一大兩小 ***************************************
一同: 方法的簽名相同
方法的簽名 = 方法名 + 參數列表
如何驗證是否是正確的重寫
使用註解 @Override
如果是正確的重寫 不報錯 否則 編譯報錯
編譯的時候 編譯器幫你驗證
註解是有功能的,註釋只是一個提示作用,沒有其他功能
一大: 子類方法的訪問控制權限 比父類方法的訪問控制權限要大(或相同)
private
default
protected
public
兩小:
1. 子類方法的返回值 是 父類方法返回值的子類(協變式返回值)
2. 子類方法拋出的異常 比 父類方法拋出的異常 範圍小
************************************Overload 和Override的區別***************************************
一.Overload 重載
1.方法的名稱相同,參數列表不同的方法之間叫做重載
參數列表不同體現在三個方面:
1. 個數不同
2. 類型不同
3. 順序不同
二. Override 重寫
子類繼承父類, 子類重寫父類的方法, 只要符合重寫規則就叫重寫
重寫規則如下:
...
************************************其他零散知識***************************************
1.同一個類中的方法之間可以相互重寫嗎??
不可以. 重寫要建立在繼承的基礎上,子類去重寫父類的方法.
2. 子類可以重載父類的方法嗎??
可以.
Java初始化順序