Java 基礎(chǔ) 20 super關(guān)鍵字以及繼承中的方法重寫

1.1 super 關(guān)鍵字的概述和使用

1.1.1super 關(guān)鍵字的概述

  • super的用法和this很像
    • this代表本類對象的引用
    • super代表父類存儲空間的標(biāo)識(可以理解為父類對象引用)
  • 用法(this和super均可如下使用)
    • 訪問成員變量
      • this.成員變量 super.成員變量
      • 訪問構(gòu)造方法
      • this(…) super(…)
      • 訪問成員方法
      • this.成員方法() super.成員方法()

1.1.2示例代碼

package com.itheima_02;

public class Father {
    public int age = 45;
}

package com.itheima_02;
/*
 * super和this的用法很像:
 *      this:代表本類對象的引用
 *      super:代表父類的存儲空間(可以理解為代表父類對象的引用)
 * 
 * 用法:
 *      訪問成員變量:
 *          this.成員變量
 *          super.成員變量
 *      訪問構(gòu)造方法:
 *          this(...)
 *          super(...)
 *      訪問成員方法:
 *          this.成員方法()
 *          super.成員方法()
 */
public class Son extends Father {
    public int age = 20;
    
    public void printAge() {
        int age = 10;
        System.out.println(age);
        //我要訪問成員范圍的age?
        System.out.println(this.age);
        //我要訪問父類成員范圍的age?
        System.out.println(super.age);
    }
}
package com.itheima_02;

public class ExtendsTest {
    public static void main(String[] args) {
        Son s = new Son();
        s.printAge();
    }
}

2.2 Java 繼承中構(gòu)造方法的特點

  • 子類中所有的構(gòu)造方法默認(rèn)都會訪問父類中空參數(shù)的構(gòu)造方法
  • 為什么呢?
    • 因為子類會繼承父類中的數(shù)據(jù),可能還會使用父類的數(shù)據(jù),所以,子類初始化之前,一定要先完成父類數(shù)據(jù)的初始化
    • 每一個構(gòu)造方法的第一條默認(rèn)語句都是super
  • 如果父類中沒有構(gòu)造方法,該怎么辦呢?
    • 在父類中加一個無參的構(gòu)造方法
    • 通過使用super關(guān)鍵字去顯示的調(diào)用父類的帶參構(gòu)造方法
    • 通過這里我們發(fā)現(xiàn)第一種解決方案最簡單,所以,建議我們自定義類的時候永遠(yuǎn)自己給出無參構(gòu)造方法

1.2.1 示例代碼

package com.itheima_03;

public class Father {
    /*
    public Father() {
        System.out.println("Father無參構(gòu)造方法");
    }
    */
    
    public Father(String name) {
        System.out.println("Father帶參構(gòu)造方法");
        System.out.println(name);
    }
}
package com.itheima_03;
/*
 * Java繼承中構(gòu)造方法的訪問特點:
 *      A:子類構(gòu)造方法執(zhí)行前都會先執(zhí)行父類無參構(gòu)造方法
 *      B:為什么呢?
 *          因為子類繼承父類,會繼承父類的非私有成員。
 *          而子類在初始化的時候,可能會使用父類的數(shù)據(jù),如果父類數(shù)據(jù)沒有先初始化,
 *          子類就不能使用這些數(shù)據(jù),所以,在子類初始化之前,一定要先完成父類數(shù)據(jù)的初始化。
 * 
 *      注意:在子類的構(gòu)造方法中,默認(rèn)第一行有一條語句:super()
 * 
 * 問題:假如父類中沒有無參構(gòu)造方法,怎么辦呢?
 *      A:在父類中添加一個無參構(gòu)造方法。
 *      B:可以通過super去訪問父類的帶參構(gòu)造方法。
 * 建議使用第一種解決方案,其實就是要求我們寫代碼的時候,每次都手動的給出無參構(gòu)造方法。
 */
public class Son extends Father {
    public Son() {
        //super();
        super("林青霞");
        System.out.println("Son無參構(gòu)造方法");
    }
    
    public Son(String name) {
        //super();
        super("林青霞");
        System.out.println("Son帶參構(gòu)造方法");
        System.out.println(name);
    }
}
package com.itheima_03;

public class ExtendsTest {
    public static void main(String[] args) {
        Son s = new Son();
        System.out.println("---------");
        Son s2 = new Son("林青霞");
    }
}

1.3 Java繼承中成員方法的特點

1.3.1 Java繼承中成員方法的特點

  • 通過子類對象去訪問一個方法
    • 首先在子類中找
    • 然后在父類中找
    • 如果還是沒有就會報錯

1.3.2 示例代碼

package com.itheima_04;

public class Father {
    public void show() {
        System.out.println("Father show");
    }
}
package com.itheima_04;
/*
 * Java繼承中成員方法的訪問特點:
 *      A:子類中方法和父類中方法的聲明不一樣,這個太簡單
 *      B:子類中方法和父類中方法的聲明一樣,調(diào)用的到底是誰的呢?
 *          執(zhí)行的是子類中的方法。
 * 
 * 通過子類對象調(diào)用方法:
 *      a:在子類中找,有就使用
 *      b:在父類中找,有就使用
 *      c:如果沒有就報錯
 */
public class Son extends Father {
    public void method() {
        System.out.println("Son method");
    }
    
    public void show() {
        System.out.println("Son show");
    }
}
package com.itheima_04;

public class ExtendsTest {
    public static void main(String[] args) {
        Son s = new Son();
        s.method();
        s.show();
        //s.function();
    }
}

1.4 方法重寫的概述和使用

1.4.1 方法重寫的概述

  • 方法重寫:子類中出現(xiàn)了和父類中一摸一樣的方法聲明

1.4.2 方法重寫的應(yīng)用

  • 當(dāng)子類需要父類的功能,而功能主體子類有自己特有的內(nèi)容時,可以重寫中的方法,這樣重寫父類中的方法,這樣,即沿襲了父類的功能,又定義了子類特有的內(nèi)容

1.4.3方法重寫的注意事項

注解

  • @Override
    • 表明該方法的重寫父類的方法
  • 方法重寫的注意事項
    • 父類中私有方法不能被重寫
    • 子類重寫父類方法時,訪問權(quán)限不能更低
    • 子類重寫父類方法時,建議訪問權(quán)限一摸一樣

1.4.4 示例代碼

package com.itheima_01;

public class Phone {
    public void call(String name) {
        System.out.println("給"+name+"打電話");
    }
}
package com.itheima_01;

public class NewPhone extends Phone {
    
    public void call(String name) {
        System.out.println("開啟視頻功能");
        //System.out.println("給"+name+"打電話");
        super.call(name);
    }
}
package com.itheima_01;
/*
 * 方法重寫:子類中出現(xiàn)了和父類中一模一樣的方法聲明的情況。
 * 
 * 方法重寫的應(yīng)用:
 *      當(dāng)子類需要父類的功能,而功能主體子類又有自己的特有內(nèi)容的時候,就考慮使用方法重寫,
 *      這樣即保證了父類的功能,還添加了子類的特有內(nèi)容。
 */
public class PhoneTest {
    public static void main(String[] args) {
        Phone p = new Phone();
        p.call("林青霞");
        System.out.println("-----------");
        NewPhone np = new NewPhone();
        np.call("林青霞");
    }
}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容