學習好繼承和多態是面向對象開發語言中非常重要的一個環節,如果在程序中使用繼承和多態,將使整個程序構架非常具有彈性,同時可以減少代碼的冗餘性。
工具/原料
ECLIPSE
一、類的繼承
繼承,其基本思想是基於某個父類的擴展,制定出一個新的之類,子類可以繼承父類的原有的屬性和方法,也可以增加原來父類所不具備的屬性和方法,或者直接重寫父類中的方法。
在java中使用extends關鍵字來標識兩個類的繼承關係,舉例如下:
在項目中分別創建Test類和Test2類,在Test類中編寫成員方法doSomething()和doIt,是Test類繼承Test2類,重寫父類的這兩個方法和父類方法,並新增doSomethingnew()方法,其中Test2類的構造方法中使用super關鍵字調用父類的構造方法和成員方法。
二、Object類
在開始使用class關鍵字定義類時,就應用到了繼承原理,因為在java中,所有的類都直接或間接繼承了java.lang.Object類。Object類是比較特殊的類,它是所有類的父類,是java類層中最高層的類。
在Object類中主要包括clone()/finalize()/equals()/toString()等方法,其中常用的兩個方法是equals()/toString()方法,由於所有類都是Object類的子類,所以任何類都可以重寫Object類的方法。
以下講述Object類中的幾個重要方法。
1、getClass()方法
getClass()方法是Object類定義的方法,它會返回對象執行時的Class實例,然後使用此實例調用getName()方法可以取得類的名稱:
語法如下:
getClass().getname();
2、toString()方法
toString方法的功能是將一個對象返回為字符串形式,它會返回一個string實例,在實際的應用中,通常重寫toString方法,為對象提供一個特定的輸出模式,當這個類轉換為字符串或與字符串連接時,將自動調用重寫的 toString()方法。
舉例說明:
在項目中創建ObjectInstance類,在類中重寫toString()方法,並在主方法中輸出該類的實例對象。
3、equals方法
equals方法比較的是兩個對象的實際內容
三、使用instenceof操作符判斷
當在程序使用向下轉型的操作時,如果父類對象不是子類對象的實例,就會發生ClassCastException的錯誤,所以在執行向下轉型之前需要養成一個良好習慣,就是判斷父類對象是否為子類對象的實例,這個判斷可以使用instenceof操作符來完成。可以使用instenceof判斷是否一個類實現了某個接口,也可以用它來判斷一個實例對象是否屬於一個類。
instenceof語法格式如下:
myobject instenceof ExampleClass
myobject某類的對象引用;
ExampleClass某個類
返回值為布爾值
舉例如下:
在項目中創建Parallelogram類和3個內部類Quadrangle/Square/Anything.其中Parallelogram類和Square類繼承Quadrangle類,在Parallelogram類主方法中分別創建這些類的對象,然後使用instenceof操作符判斷它們的類型並輸出結果
四、方法的重載
方法的重載就是在同一個類中允許使用一個以上的同名方法,只要這些方法的參數個數或類型不同即可。
舉例如下:
構成重載的條件:
在談到參數個數可以確定兩個方法是否具有重載關係時,會想到不定長參數方法。
不定長方法語法:
返回值 方法名(參數數據類型…參數名稱)
在參數列表中使用…形式定義不定長參數,其實這個不定長參數a就是一個數組,編譯器會將(int…a)這種形式看做int[]a,所以在add()方法體做累加操作時使用到了for循環語句,在循環中是根據數組a的長度作為循環條件,最終將累加結果返回。
舉例如下:
五、多態
利用多態可以使程序具有良好的擴展性,並可以對所有類對象進行通用處理。
六、抽象類和接口
1、抽象類
在解決實際問題時,一般將父類定義為為抽象類,需要使用這個父類進行多態和繼承。繼承樹中越是上方的類越抽象。在多態機制中,並不需要將父類初始化對象,我們需要的只是子類對象,所以在java語言中設置抽象類不可以實例化對像。
抽象類的語法如下:
public abstract classTest{
abstract void testAbstract();
}
abstract是定義抽象類的關鍵字
抽象類繼承關係,如下圖:
2、接口
接口是抽象類的延伸,可以將它看作是純粹的抽象類,接口中的所有方法都沒有方法體。下圖描述了各個子類繼承圖形後使用接口的關係。
接口使用interface關鍵字進行定義,其語法如下:
public interface 接口名稱{
void drwa();
}
public:接口可以像類一樣被權限修飾符修飾,但public關鍵字僅限於接口在其同名的文件中被定義。
interface:定義接口關鍵字
一個類實現一個接口可以使用implements關鍵字,舉例代碼如下:
public class Paralleogram extends Quadrangle implements 接口名稱{
}
舉例說明:
3、接口與繼承:
我們知道在java中不允許多重繼承,但使用接口就可以多重繼承,因為一個類可以同時實現多個接口,這樣可以將所有需要繼承的接口放置在implements關鍵字後並用逗號分開。
多重繼承的語法如下:
class 類名implements 接口1,接口2,接口3,...,接口n。
舉例說明:
在定義一個接口時使該接口繼承另一個接口。
interface 接口1{
}
interface 接口2 extends接口1{
}