JAVA中有關繼承的一個例項
在JAVA中,“extends”用來表示繼承,當建立一個類時,總是在繼承,除非已經明確指出要從其他類中繼承,否則都是隱式從JAVA中的標準根類Object中繼承,下面的一個程式示範了JAVA中的許多特性:
package access; class Cleanser{ private String s = "Cleanser"; public void append(String a){ s +=a; } public void dilute(){ append(" dilute()"); } public void apply(){ append(" apply()"); } public void scrub(){ append(" scrub()"); } public String toString(){ return s; } public static void main(String[] args){ Cleanser x = new Cleanser(); x.dilute(); x.apply(); x.scrub(); System.out.print(x);; } } public class Detergent extends Cleanser{ public void scrub(){ append(" Detergent.scrub()"); super.scrub(); } public void foam(){ append(" foam()"); } public static void main(String[] args) { // TODO Auto-generated method stub Detergent x = new Detergent(); x.dilute(); x.apply(); x.scrub(); x.foam(); System.out.println(x); System.out.println("Testing base class:"); Cleanser.main(args); } }
該程式的執行結果為:
2.在Cleanser和Detregent中均含有main()方法,可以為每個類都建立一個main()方法,這樣做可以使測試更加方便,每個類的單元測試簡便易行,並且在單元測試完成後,不需要刪除該方法,可以留待下次的測試。
3.一個程式中含有多個類,也只有在命令列所呼叫的那個類的main()方法會被呼叫,因此,如果命令列是java Detregent,那麼Detregent.main()方法會被呼叫。即使Cleanser不是一個public類,如果命令列是java Cleanser,那麼Cleanser.main()也會被呼叫,即使一個類只具有包訪問許可權,其public main()依然可以訪問。
4.Detregent.main()明確呼叫了Cleanser.main(),並將引數傳遞給了它。也可以向其傳遞任何String陣列。
5.Cleanser中的所有方法都應為public,這一點非常重要,為了繼承,一般的規則為:將所有資料成員指定為private,將所有的方法指定為public,而protected藉助匯出類來訪問,特殊情況下根據實際進行微動。原因在於如果不加任何的訪問限制符,那麼預設為包訪問許可權,它僅允許包內成員訪問,而其它包的某個類要繼承時,只能訪問public成員。
6.在Cleanser的介面中有一組方法:append()、dilute()、apply()、scrub()、toString()方法。由於Detregent繼承自Cleanser,那麼Detregent可以在介面中自動獲取這些方法,可以將繼承視作對類的複用。
7.在scrub()中,使用基類定義的方法對其進行修改是可行的,若相要在新版本中呼叫從基類繼承來的方法,但在scrub()中並不能直接呼叫scrub(),因為會產生遞迴效應,所以可以利用surper可以對基類中的scrub()進行呼叫。
8.在繼承中,並不一定非得使用基類的方法,可以在匯出類中新增自己想要的新方法。除了可以呼叫Detregent的方法外還可以呼叫Cleanser中所有可用的方法。