Java基礎(chǔ)——繼承寄摆,我繼承了什么

類的繼承格式

class 父類 {
}
class 子類 extends 父類 {
}

通過extends關(guān)鍵字來實現(xiàn)

一、為什么需要繼承

有一些類有共同的地方技竟,容易出現(xiàn)代碼冗余冰肴,所以我們需要抽取一下,封裝繼承多態(tài)嘛。

子類通過復(fù)寫方法等方式可以對父類做一些拓展熙尉,比如:
筆都有產(chǎn)地和顏色联逻,筆就是父類,鋼筆繼承自筆检痰,鋼筆的產(chǎn)地和顏色是什么包归,蠟筆呢,毛筆也有铅歼,但是毛筆沒有筆帽公壤,特殊一點,這就可以做拓展了椎椰,為什么沒有筆帽厦幅,要注意什么。

二慨飘、繼承到底繼承了什么确憨?有什么特點?

一個類里面有4種東西

  • 屬性(包括類屬性和實例屬性)瓤的、
  • 方法(包括類方法和實例方法)休弃、
  • 構(gòu)造器/構(gòu)造方法
  • 初始化塊(包括類的初始化塊和實例的初始化塊)。

子類繼承父類的時候圈膏,到底繼承了什么塔猾?

  • 1、子類繼承父類所有的屬性(除了private)
  • 2稽坤、子類繼承父類(除private)所有的方法丈甸,(子類方法如果不調(diào)用 super.所復(fù)寫方法名稱 ,那么對應(yīng)父類方法將不會執(zhí)行)
    • final方法不可以被繼承
    • static方法不可以被繼承尿褪,隨著類的加載而加載老虫,繼承毛線。但是如果權(quán)限允許子類還是可以用茫多。
  • 3、子類可以通過super忽刽,表示父類的引用天揖,調(diào)用父類的屬性或者方法。
    (構(gòu)造函數(shù)和代碼塊是無法被繼承)

對于private這點非常好理解跪帝,因為private的訪問權(quán)限是本類中嘛今膊,就算通過super也不能訪問private的private屬性。但是可以通過對應(yīng)的get方法獲取伞剑,get是public嘛斑唬。

如果子類非要訪問父類的私有域,那么就反射吧

繼承有什么特點:

  • Java只可以單繼承,不能多繼承

  • 繼承的好處是是可以提高效率恕刘,抽取封裝缤谎,缺點是提高了代碼耦合。

  • Object是所有類的直接或者間接父類褐着,Object是萬類之祖坷澡。

  • 繼承中的this和super

    • super關(guān)鍵字
      我們可以通過super關(guān)鍵字來實現(xiàn)對父類成員的訪問,用來引用當(dāng)前對象的父類含蓉。

    • this關(guān)鍵字
      指向自己的引用频敛。

  • 繼承與final

    • final 類
      final class 類名 {//類體}

      不能繼承的,即最終類
      被聲明為 final 類的方法自動地聲明為 final馅扣,但是實例變量并不是 final

    • final方法
      修飾符(public/private/default/protected) final 返回值類型 方法名(){//方法體}

      該方法不能被子類重寫

  • final實例變量

    final修飾的變量稱為常量斟赚,這些變量只能賦值一次,final 的變量不能被修改
    final修飾的引用類型變量,表示該變量的引用不能變,而不是該變量的值不能變;

  • 如果子類方法簽名和父類簽名完全一致差油,那就必須寫上@Override的注解拗军,也就是必須復(fù)寫,不然的話厌殉,報錯食绿。

  • 調(diào)用被覆蓋的父類方法:使用super.方法名(實參);

三、子類的初始化

類的初始化分為 類初始化 和 對象初始化公罕。

三器紧、1.類初始化

先執(zhí)行父類的 類成員(static成員) 和 類代碼塊(static代碼塊),后執(zhí)行子類的類成員(static成員) 和 類代碼塊(static代碼塊)楼眷。

static成員和static代碼塊僅會在類加載的時候加載一次铲汪。

三、2.對象初始化

1罐柳、先初始化父類的屬性和代碼塊掌腰,后初始化子類的屬性和代碼塊。
2张吉、接著初始化父類的構(gòu)造函數(shù)齿梁,然后是子類

關(guān)于子類能從父類繼承到什么和繼承中的類初始化,我們看一下下面的代碼就清楚了:

AClass

public class AClass {
    int normalVar = 10;
    // 父類私有變量肮蛹,子類無法繼承勺择,但可以get到
    private int priVar = 20;
    {
        System.out.println("AClass 普通代碼塊");
    }
    
    static{
        System.out.println("AClass static代碼塊");
    }
    
    public AClass(){
        System.out.println("AClass 無參構(gòu)造方法");
    }
    
    public AClass(String str){
        System.out.println("AClass 帶參構(gòu)造方法!");
        
    }
    public void aMethodOne(){
        normalVar = 55;
        System.out.println("aMethodOne");
    }
    
    public void aMethodTwo(){
        normalVar = 66;
        System.out.println("aMethodTwo");
    }
    
    public int getPriVar() {
        return priVar;
    }
    
    public void setNormalVar(int normalVar) {
        this.normalVar = normalVar;
    }
}

.
.
BClass

public class BClass extends AClass{
    {
        System.out.println("BClass 普通代碼塊");
    }
    
    static{
        System.out.println("BClass static代碼塊");
    }
    

    public BClass(){
        System.out.println("BClass 無參構(gòu)造方法");
    }
    
    public BClass(String str){
        System.out.println("BClass 帶參構(gòu)造方法伦忠!");
    }
    
    @Override
    public void aMethodOne() {
        super.aMethodOne();
        System.out.println("子類Override的aMethodOne方法 并且調(diào)用super.aMethodOne();");
    }

    @Override
    public void aMethodTwo() {
        //super.aMethodTwo();
        System.out.println("子類Override的aMethodTwo方法 不調(diào)用super.aMethodTwo();");
    }
    
    public void getFatherVar(){
        System.out.println("調(diào)用父類的非私有變量:"+normalVar);
        //int a = priVar; // 父類的私有變量子類無法繼承省核,本句會報錯
    }
}

.
.
TrtExt

public class TrtExt{
    public static void main(String[] args) {
        BClass bClass1 = new BClass();
        
        System.out.println("=========");
        BClass bClassZs = new BClass("張三"); 
        bClassZs.getFatherVar();
        bClassZs.setNormalVar(88); // 子類bClass2對象改變父類的變量,不會影響其他子類
        
        System.out.println("====================");
        BClass bClassLs = new BClass("李四"); 
        bClassLs.getFatherVar();// 
        
        System.out.println("====================");
        BClass bClassWw = new BClass("王五"); 
        bClassWw.getFatherVar();// 父類的原始值
        bClassWw.aMethodOne(); // BClass的aMethodOne方法有super.aMethodOne();所以會調(diào)父類的aMethodOne()
        bClassWw.getFatherVar();
        
        System.out.println("====================");
        BClass bClassAl = new BClass("阿六"); 
        bClassAl.getFatherVar();//  父類的原始值
        bClassAl.aMethodTwo();// BClass的aMethodTwo方法 沒有super.aMethodOne();所以不調(diào)父類aMethodTwo
        bClassAl.getFatherVar();
    }
}

.
.
輸出:

AClass static代碼塊
BClass static代碼塊
AClass 普通代碼塊
AClass 無參構(gòu)造方法
BClass 普通代碼塊
BClass 無參構(gòu)造方法
=========
AClass 普通代碼塊
AClass 無參構(gòu)造方法
BClass 普通代碼塊
BClass 帶參構(gòu)造方法昆码!
調(diào)用父類的非私有變量:10
====================
AClass 普通代碼塊
AClass 無參構(gòu)造方法
BClass 普通代碼塊
BClass 帶參構(gòu)造方法气忠!
調(diào)用父類的非私有變量:10
====================
AClass 普通代碼塊
AClass 無參構(gòu)造方法
BClass 普通代碼塊
BClass 帶參構(gòu)造方法邻储!
調(diào)用父類的非私有變量:10
aMethodOne
子類Override的aMethodOne方法 并且調(diào)用super.aMethodOne();
調(diào)用父類的非私有變量:55
====================
AClass 普通代碼塊
AClass 無參構(gòu)造方法
BClass 普通代碼塊
BClass 帶參構(gòu)造方法!
調(diào)用父類的非私有變量:10
子類Override的aMethodTwo方法 不調(diào)用super.aMethodTwo();
調(diào)用父類的非私有變量:10

通過這個例子旧噪,我們可以清楚地看到

  • 1吨娜、靜態(tài)代碼塊只會隨著類的加載加載一次,優(yōu)先于對象

  • 2舌菜、子類只可以繼承父類的非private的變量方法萌壳,無法繼承代碼塊構(gòu)造方法

  • 3、當(dāng)子類被實例化時日月,會先調(diào)用父類的無參構(gòu)造方法袱瓮。

  • 子類從父類繼承的變量和方法是獨立的,不會受到其他子類的影響爱咬。
    (bClass2改變父類的變量不會影響bClass3繼承到的變量)

  • 4尺借、子類復(fù)寫父類的方法,如果不調(diào)用 super.所復(fù)寫方法名稱 那么對應(yīng)父類方法將不會執(zhí)行精拟,也就是說燎斩,這個方法就相當(dāng)一個普通的方法,沒有從父類繼承到什么蜂绎。
    (絕大多數(shù)情況下是需要調(diào)用 super.所復(fù)寫方法名稱 的栅表,但是有時候我們個別子類不想要父類方法的初始化邏輯,我們可以靈活選擇是否保留 )

四师枣、overload和override

方法重載(overload)
1.必須是同一個類
2方法名一樣
3參數(shù)類型不一樣或參數(shù)數(shù)量不一樣

方法的重寫/復(fù)寫(override)

子類對父類方法的復(fù)寫

兩同兩小一大原則:

兩同:
方法名相同怪瓶,參數(shù)類型相同

兩小:
子類返回類型小于等于父類方法返回類型践美,若為基本類型或者void則必須相同
子類拋出異常小于等于父類方法拋出異常洗贰,

一大:
子類訪問權(quán)限大于等于父類方法訪問權(quán)限。

實例一下:

AClass

public class AClass {
    public int number = 10;
    protected void changeNumber(int i){
        setNumber(100);
        System.out.println("父類 changeNumber:  "+number);
        
    }
    
    public int setNumber(int i) {
        number = i;
        System.out.println("父類 number:  "+number);
        return number;
    }
}

.
.
BClass

public class BClass extends AClass{

    // 這個復(fù)寫方法的訪問權(quán)限比父類大陨倡,也就是兩者訪問權(quán)限不一致敛滋,但是也是對那個方法的復(fù)寫
    @Override
    public void changeNumber(int i) {
        super.changeNumber(i);
        setNumber(i);
    }
}

.
.
TrtExt

public class TrtExt{
    public static void main(String[] args) {
        BClass bClass2 = new BClass(); 
        bClass2.changeNumber(70);
    }
}

輸出:


父類 number:  100
父類 changeNumber:  100
父類 number:  70

我們看到,其實并不是復(fù)寫的方法就需要和父類方法完全一致的兴革。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末绎晃,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子杂曲,更是在濱河造成了極大的恐慌箕昭,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件解阅,死亡現(xiàn)場離奇詭異,居然都是意外死亡泌霍,警方通過查閱死者的電腦和手機货抄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進店門述召,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蟹地,你說我怎么就攤上這事积暖。” “怎么了怪与?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵夺刑,是天一觀的道長。 經(jīng)常有香客問我分别,道長遍愿,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任耘斩,我火速辦了婚禮沼填,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘括授。我一直安慰自己坞笙,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布荚虚。 她就那樣靜靜地躺著薛夜,像睡著了一般。 火紅的嫁衣襯著肌膚如雪版述。 梳的紋絲不亂的頭發(fā)上梯澜,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天,我揣著相機與錄音院水,去河邊找鬼腊徙。 笑死,一個胖子當(dāng)著我的面吹牛檬某,可吹牛的內(nèi)容都是我干的撬腾。 我是一名探鬼主播,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼恢恼,長吁一口氣:“原來是場噩夢啊……” “哼民傻!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起场斑,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤漓踢,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后漏隐,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體喧半,經(jīng)...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年青责,在試婚紗的時候發(fā)現(xiàn)自己被綠了挺据。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片取具。...
    茶點故事閱讀 38,622評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖扁耐,靈堂內(nèi)的尸體忽然破棺而出暇检,到底是詐尸還是另有隱情,我是刑警寧澤婉称,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布块仆,位于F島的核電站,受9級特大地震影響王暗,放射性物質(zhì)發(fā)生泄漏悔据。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一瘫筐、第九天 我趴在偏房一處隱蔽的房頂上張望蜜暑。 院中可真熱鬧,春花似錦策肝、人聲如沸肛捍。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽拙毫。三九已至,卻和暖如春棺禾,著一層夾襖步出監(jiān)牢的瞬間缀蹄,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工膘婶, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留缺前,地道東北人。 一個月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓悬襟,卻偏偏與公主長得像衅码,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子脊岳,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,490評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 一:java概述:1逝段,JDK:Java Development Kit,java的開發(fā)和運行環(huán)境割捅,java的開發(fā)工...
    ZaneInTheSun閱讀 2,635評論 0 11
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法奶躯,類相關(guān)的語法,內(nèi)部類的語法亿驾,繼承相關(guān)的語法嘹黔,異常的語法,線程的語...
    子非魚_t_閱讀 31,598評論 18 399
  • 莫瞬、6一参淹、基本知識 1.JDK和JRE的區(qū)別 答:JDK是java語言開發(fā)工具包醉锄,包含JRE和開發(fā)工具(javac....
    夢游的沙師弟閱讀 1,197評論 0 4
  • 前言:最近感冒的不太想去面試,在家就對Java se的基礎(chǔ)做了一些小總結(jié) 1.JDK和JRE的區(qū)別 一 基礎(chǔ)知識 ...
    AntCode閱讀 1,122評論 0 1
  • 寫代碼: 1浙值,明確需求。我要做什么檩小? 2开呐,分析思路。我要怎么做规求?1,2,3筐付。 3,確定步驟阻肿。每一個思路部分用到哪些...
    橫沖直撞666閱讀 351評論 0 0