面向對象的三大特征:
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 歡迎轉載,轉載務必說明出處。(如果本文對您有幫助,可以點擊一下右下角的 推薦,或評論,謝謝!) |