Java基础(五)继承和多态
1.多態
先來看一個例子,其中Employee類是父類,Manager類繼承了Employee類:
public static void main(String[] args){// construct a Manager objectManager boss = new Manager("Carl Cracker", 80000, 1987, 12, 15);boss.setBonus(5000);Employee[] staff = new Employee[3];// fill the staff array with Manager and Employee objects staff[0] = boss;staff[1] = new Employee("Harry Hacker", 50000, 1989, 10, 1);staff[2] = new Employee("Tommy Tester", 40000, 1990, 3, 15);// print out information about all Employee objectsfor (Employee e : staff)System.out.println("name=" + e.getName() + ",salary=" + e.getSalary());}在for循環中,盡管這里將e聲明為Employee類型,但實際上e既可以引用Employee類型的對象,也可以引用Manager類型的對象。當e引用Employee對象時,e.getSalary()方法嗲用的是Employee類中的getSalary()方法;當e引用Manager對象時,e.getSalary()調用的是Manager類中的getSalary方法。
一個對象變量(例如:e)可以指示多種實際類型的現象被稱為多態(polymorphism)。在運行時能夠自動地選擇調用哪個方法的現象稱為動態綁定。
一個用來判斷是否應該設計為繼承關系的簡單規則,就是“is-a”規則,它表明子類的每個對象也是父類的對象。“is-a”規則的另一種表述是置換法則。它表明程序中出現的父類對象的任何地方都可以用子類對象置換。
在Java中,對象變量是多態的。也就是,一個對象變量既可以引用它本身的類對象,也可以引用它的任何一個子類的對象。
?
2.抽象類
父類中抽象方法可以不用實現,為了提高程序的清晰度,包含一個或多個抽象方法的類本身必須被聲明為抽象的。
除了抽象方法外,抽象類還可以包含具體數據和具體方法。
抽象方法充當著占位的角色,它們的具體實現在子類中。擴展抽象類可以有兩種選擇:一種是在抽象類中定義部分抽象類方法或者不定義抽象類方法,這樣就必須將子類也標記為抽象類;另一種是定義全部的抽象方法,這樣一來,子類就不是抽象的了。
類即使不含抽象方法,也可以將類聲明為抽象類。
抽象類不能被實例化。也就是說,如果一個類聲明為abstract,就不能使用創造這個類的對象,但是可以創建一個具體子類的對象。同時,可以定義一個抽象類的對象變量,但是它只能引用非抽象子類的對象。
例如:Person類是抽象類,Student是具體子類。
?
Person p = new Student();?
?
3.受保護訪問protected
在前面我們知道了,最好將類中的域標記為private,因為任何聲明為private的內容對其他類都是不可見的,這對于子類來說也完全適用,即就連子類也不能訪問父類的私有域。
如果希望父類中的某些方法允許被子類訪問,或允許子類的方法訪問父類的某個域,可以將這些方法或域聲明為protected。
在實際應用中,要謹慎使用protected。如果需要將設計的類提供給其他程序員使用,而在這個域中設置了一些受保護域,由于其他程序員可以由這個類再派生出新類,同時可以訪問其中的受保護域。在這種情況下,如果需要對這個類的實現進行修改,就必須通知所有使用這個類的程序員。這違背了OOP提倡的數據封裝原則。
?
4總結Java中用于控制可見性的4個訪問控制符
- private-僅對本類可見
- public-對任何類都可見
- protected-對本包和所有子類可見
- 沒有修飾符-對本包可見
5.總結繼承的設計技巧
- 將公共操作和域放在父類
- 不要使用受保護的域
protected定義的實例域并不能帶來更好地保護,原因主要有兩點:(1)子類集合時無限制的,任何一個人都能夠由某個類派生一個子類,并編寫代碼以直接訪問protected的實例域,從而破壞了封裝性。(2)在Java中,同一個包中的所有類都可以訪問protected域,而不管它是否為這個類的子類。
- 使用繼承實現“is-a”關系
- 除非所有繼承的方法都有意義,否則不要使用繼承
- 在覆蓋方法時,不要改變預期的行為
- 使用多態,而非類型信息
例如,下面這種情況就應該考慮使用多態性,如果兩個action是相同的概念,就應該為這個概念定義一個方法,并將其放置在兩個類的父類或接口中。
if(x是類型1)action(x); else if (x是類型2)action(x);- 不要過多地使用反射
? 反射是很脆弱的,即編譯器很難幫助人們發現程序中的錯誤,因此只有在運行時才發現錯誤并導致異常。
轉載于:https://www.cnblogs.com/BigJunOba/p/9321606.html
總結
以上是生活随笔為你收集整理的Java基础(五)继承和多态的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 05-session-会话跟踪技术
- 下一篇: java美元兑换,(Java实现) 美元