面向對象有三大特性:封裝、繼承和多態。個人認為,繼承和多態很像,繼承大的作用是體現多態。
繼承
1、什么是繼承
繼承是面向對象語言的一個重要特性。繼承是從父類中繼承了父類的相關方法等。也就是說,父類有的東西,子類能通過繼承獲得與父類相同的東西。
當創建一個類時,除非明確指定我們要繼承的類,否則我們默認的都繼承自Object類。
2、父類(超類)和子類
當類A繼承了類B時,類B稱為類A的父類/超類,類A稱為類B的子類。
繼承時,使用關鍵字:extends,子類訪問父類時,使用super關鍵字。
3、繼承的作用
繼承最大的作用是代碼的復用。減少了代碼的冗余
繼承表現出來的是父子類的相同特性。
4、以筆、圓珠筆和鉛筆為例。圓珠筆和鉛筆都是筆,都繼承自筆類,它們都能寫寫畫畫。
新建Pens(父類)及BallpointPen(子類)、鉛筆(Pen),它們都有相同的寫方法和能寫的特點
public class Pens { public void write(){ System.out.println("I am " + this.getClass().getSimpleName() + ", I can write"); } /** * 特點 */ public void feature(){ System.out.println("I can write"); } }
/** * 圓珠筆 * 繼承了Pens類的特性(write和feature) */ public class BallpointPen extends Pens { }
/** * 鉛筆 * 繼承了Pens類的特性(write和feature) */ public class Pencil extends Pens { }
@Test void contextLoads() { //BallpointPen BallpointPen ballpointPen = new BallpointPen(); ballpointPen.write(); ballpointPen.feature(); System.out.println("........................."); //Pencil Pencil pencil = new Pencil(); pencil.write(); pencil.feature(); }
/**
* 輸出
* I am BallpointPen, I can write
* I can write
* .........................
* I am Pencil, I can write
* I can write
*/
在子類和測試代碼中,不需要再另外寫任何的代碼,圓珠筆和鉛筆都能實現與筆類相同的特性。
多態
1、 什么是多態
多態是面向對象語言的另一個重要特性。
多態是同一特性在不同的類有不同的表現。
2、 多態的作用
a) 代碼復用。
b) 提高代碼的擴展性和維護性。
3、 還是以圓珠筆和鉛筆為例。圓珠筆和鉛筆都是筆,都可以寫寫畫畫,但圓珠筆是不可擦除的,而鉛筆是可擦除的。
/** * 圓珠筆 * 繼承了Pens類的特性(write和feature) * 無法被擦除,重寫feature方法 */ public class BallpointPen extends Pens { @Override public void feature() { super.feature(); System.out.println("I can`t be erased"); } }
/** * 鉛筆 * 繼承了Pens類的特性(write和feature) * 可以被擦除,重寫feature方法 */ public class Pencil extends Pens { @Override public void feature() { super.feature(); System.out.println("I can be erased"); } }
與上面相同的測試代碼,在圓珠筆和鉛筆中輸出了不同的特點(可擦除和不可擦除)
/** * 輸出 * I am BallpointPen, I can write * I can write * I can`t be erased * ......................... * I am Pencil, I can write * I can write * I can be erased */
二者的關系
繼承是不同的類有相同的特性、相同的實現等,而多態是相似的類有不同的特性或同一特性有不同的實現。要實現多態,需要先實現繼承。