java基礎11 繼承(super、extends關鍵字和重寫,這三個要素出現的前提:必須存在繼承關系)


面向對象的三大特征:  

1.封裝   (將一類屬性封裝起來,並提供set()和get()方法給其他對象設置和獲取值。或者是將一個運算方法封裝起來,其他對象需要此種做運算時,給此對象調用)

2.繼承   (繼承關系通過extends關鍵字體現)

3.多態   (父類的引用指向子類的對象,或者接口的引用類型變量指向接口實現類的對象)


一、繼承

1.1、繼承的格式

    class 類名1 extends 類名2{
    
    }

1.2、繼承關系

繼承關系通過關鍵字extends體現的

1.3、繼承關系的注意事項

    1.父類私有的成員(成員變量或成員方法)不能被繼承.(如果要獲取成員變量的值,可以通過非私有成員方法獲取)
    2.父類的構造函數是不能夠被繼承
    3.創建子類的對象時默認會先調用父類無參構造器.
    4.千萬不要為了減少重復代碼而去繼承,只有真正存在繼承關系時,才去繼承

1.4、附錄

1、父類有有參構造器,子類無有參構造器,會報錯?
答:子類實例化有參的對象時,默認調用父類的無參構造器,父類中存在無參構造器,不會報錯,假如父類中沒有無參構造器,
只有有參構造器,那么需要在子類構造器中添加super關鍵字,super關鍵字括號里面填相應的參數,調用父類有參構造器

2、為什么要調用父類的構造器?這樣子做的意義何在?
答:調用父類的構造器是可以初始化父類繼承下去的屬性的.
注意:子類中如果有無參構造器,父類中一定也要有
 1 /*
 2 需求:有工人,農民,教師,科學家,服務生,其中,工人,農民,服務生只有基本工資.
 3      教師除基本工資外,還有課酬(元/天),科學家除基本工資外,還有年終獎,
 4      請你寫出相關類,將各種類型的員工的全年工資打印出來;
 5 */
 6 class People{
 7     private double BaseSal; //基本工資
 8      double Bonus; //獎金
 9     public People(){
10 
11     }
12     public People(double BaseSal){
13         this.BaseSal=BaseSal;
14     }
15     public double getBaseSal(){ //基本薪資
16         return BaseSal*12;
17     }
18     public double getBonus(double sal){ //額外薪資
19         return Bonus;
20     }
21     public double getYearSal(double sal){ //年薪
22         return getBonus(sal)+getBaseSal();
23     }
24 }
25 
26 class Worker extends People{ //工人
27     public Worker(double BaseSal){
28         super(BaseSal);
29     }
30     public double getBonus(double sal){//額外薪資
31         return Bonus;
32     }
33 }
34 
35 class Waiter extends People { //服務員
36     public Waiter(double BaseSal){
37         super(BaseSal);
38     }
39     public double getBonus(double sal){ //額外薪資
40         return Bonus;
41     }
42 }
43 
44 class Scientist extends People { //科學家
45     public Scientist(double BaseSal){
46         super(BaseSal);
47     }
48     public double getBonus(double sal){ //額外薪資
49         return getBaseSal()*(8/10);
50     }
51         
52 }
53 
54 class Teacher extends People { //教師
55     public Teacher(double BaseSal){
56         super(BaseSal);
57     }    
58     public double getBonus(double sal){
59         return 12*30*sal;
60     }
61 }
62 class Farmer extends People { //農民
63     public Farmer(double BaseSal){
64         super(BaseSal);
65    }
66     public double getBonus(double sal){ //額外薪資
67         return sal;
68    }
69 }
70 
71 class  Demo1{
72     public static void main(String[] args) {
73         Farmer f=new Farmer(1200);//
74         Teacher t=new Teacher(2000);
75         System.out.println("農民年薪"+f.getYearSal(0));//
76         System.out.println("老師的薪資"+t.getYearSal(500));
77         Waiter w=new Waiter(4000);
78         System.out.println("服務員薪資:"+w.getYearSal(100000));
79 
80     }
81 }

二、super關鍵字

2.1、概念

    super關鍵字代表了父類空間的引用

2.2、super關鍵字的作用

 1.子父類中存在這同名的成員時,在子類中默認訪問子類的成員,可以通過super關鍵字訪問父類指定父類成員
 2.創建子類對象時,默認調用父類的無參構造器,可以通過super關鍵字調用父類中有參構造器

2.3、super關鍵字調用父類的構造方法時,要注意的事項

 1.在子類的構造器中沒有指定調用父類的構造方法,那么編譯器會在子類構造器中默認添加一個super()
    2.super關鍵字調用父類構造函數時,該語句必須要是子類函數的第一語句
    3.super關鍵字與this關鍵字不能同時出現在一個構造函數中調用其他構造函數.因為兩個語句都需要是第一個語句(第一行)

2.4、super關鍵字與this關鍵字的區別

1.代表的事物不一致
    1.super關鍵字代表的是父類空間的引用.
    2.this關鍵字代表是所屬函數的調用對象.
2.使用的前提不一樣
    1.super關鍵字必須要有繼承關系才能使用
    2.this關鍵字不需要存在繼承關系也可以使用
3.調用構造函數的區別
    1.super關鍵字是調用父類的構造函數
    2.this關鍵字是調用本類的構造函數.

三、重寫

3.1、方法重寫的前提

   必須存在繼承關系

3.2、方法重寫的概念

   子父類出現同名的函數,這個我們就叫方法的重寫

3.3、什么時候需要使用重寫方法

父類的功能無法滿足子類的需求.

3.4、方法的重寫需要注意的事項

  1.方法重寫時,方法名和形參列表必須一致.
  2.方法重寫時,子類的訪問權限修飾符要大於或等於父類的訪問權限修飾符
  3.方法重寫時,子類的返回值類型必須要小於或者等於父類的返回值類型(引用數據類型),但是在基本數據類型中,子類和父類返回值類型要一致
  4.方法重寫時,子類拋出異常類型要小於或者等於父類的異常類型.

 

 

 

 

 

原創作者:DSHORE

作者主頁:http://www.cnblogs.com/dshore123/

原文出自:http://www.cnblogs.com/dshore123/p/8805436.html

歡迎轉載,轉載務必說明出處。(如果本文對您有幫助,可以點擊一下右下角的 推薦,或評論,謝謝!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM