Java基础 -- 复用类(组合和继承)
復用類有兩種實現方式。
- 在新的類中產生現有類的對象,由于新的類是由現有類的對象所組成,所以這種方法稱之為組合。
- 采用繼承實現。
一? 組合語法
下面創建兩個類WaterSource和SprinklerSystem。其中SprinklerSystem中包含WaterSource的對象引用。
class WaterSource {//如果定義時沒有初始化,則基本類型會被自動初始化為0,對象引用初始化為Nullprivate String s;WaterSource(){System.out.println("WaterSource()");s = "Constructed";} }public class SprinklerSystem {private String value1,value2,value3,value4;//定義時初始化private WaterSource source = new WaterSource();private int i;private float f;public String toString() {return "value1 = " + value1 + " " + "value2 = " + value2 + " " +"value3 = " + value3 + " " +"value4 = " + value4 + "\n" +"i = " + i + " " + "f = " + f + " " + "source = " + source;}public static void main(String[] args) {SprinklerSystem sprinklers = new SprinklerSystem();System.out.println(sprinklers);} }運行結果如下:
WaterSource() value1 = null value2 = null value3 = null value4 = null i = 0 f = 0.0 source = WaterSource@15db9742?注意:如果把一個對象以String類型輸出,則默認調用的是該對象的toString()方法。
類中成員變量如果是基本基本類型則默認被初始化為零,如果是對象引用則會被初始化為null。
我們也可以自己去初始化他們:
- 在定義成員變量的時候初始化,比如private String s1 = "happy";這意味著他們能夠在構造函數被調用之前初始化。
- 在類的構造函數中初始化;
- 在使用這些成員變量之前初始化,這種方式稱之為惰性初始化;
- 使用實例初始化{s1 = "happy";}。
二 繼承語法
Java創建一個類時,默認都是繼承于Object,除非自己指定從哪個類繼承。
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.println(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) {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);}}?運行結果如下:
Cleanser dilute() apply() Detergent.scrub() scrub() foam() Testing base class: Cleanser dilute() apply() scrub()?看以看到繼承使用的是關鍵字extends,如果在子類中想調用父類方法,可以使用super.*。
1、初始化父類
在創建一個子類對象時,父類構造器總會在子類構造器之前被調用。
class Art{Art(){System.out.println("Art constructor");} }class Drawing extends Art{Drawing(){System.out.println("Drawing constructor");} }public class Cartoon extends Drawing{Cartoon(){System.out.println("Cartoon constructor");}public static void main(String[] args) {Cartoon x = new Cartoon();} }?運行輸出如下:
Art constructor Drawing constructor Cartoon constructor?所以很容易發現,子類對象的構建過程是從父類"向外"擴散的,所以父類在子類構造器可以訪問它之前,就已經完成了初始化。
上面的父類構造函數是沒有參數的,如果父類只有一個帶有參數的構造器,就必須在子類構造器中用關鍵字super顯式的編寫調用父類構造器的語句,否則編譯器將無法找到符合'類名()'形式的構造器。
2、重載
重載是指不同的函數使用相同的函數名,但是函數的參數個數和類型不同。調用的時候根據函數的參數來區別不同的函數。在Java中,子類可以重載父類的方法。
//重載顯示 class Homer{char doh(char c) {System.out.println("doh(char)");return 'd';}float doh(float f) {System.out.println("doh(float)");return 1.0f;} }class Milhouse{}class Bart extends Homer{void doh(Milhouse m) {System.out.println("doh(Milhouse)");} }public class Overload {public static void main(String[] args) {Bart b = new Bart();b.doh(1);b.doh('x');b.doh(1.0f);b.doh(new Milhouse());}}?運行結果如下:
doh(float) doh(char) doh(float) doh(Milhouse)?3、protected
在實際的項目中,經常會想要將某些事物盡可能對整個世界隱藏起來,但仍然允許子類的成員訪問它們。關鍵字protected就起這個作用,它指明"就用戶而言,這是private的,但對于任何繼承于此類的子類,它是可以訪問的“。
//Protected關鍵字的使用 class Villain{private String name; protected void set(String nm) {name = nm;}public Villain(String name) {this.name = name;}public String toString() {return "I'm a Villain and my name is " + name;} }public class Orc extends Villain{private int orcNumber;public Orc(String name,int orcNumber) {super(name);this.orcNumber = orcNumber;}public void change(String name,int orcNumber) {set(name);this.orcNumber = orcNumber;}public String toString() {return "Orc " + orcNumber + ": " + super.toString();}public static void main(String[] args) {Orc orc = new Orc("Z3",12);System.out.println(orc);orc.change("l4", 23);System.out.println(orc);} }?運行結果如下:
Orc 12: I'm a Villain and my name is Z3 Orc 23: I'm a Villain and my name is l4?可以發現子類change()方法可以訪問父類的set(),這是因為set()的訪問修飾符是protected。
?參考文獻:
[1]Java編程思想
轉載于:https://www.cnblogs.com/zyly/p/10546923.html
總結
以上是生活随笔為你收集整理的Java基础 -- 复用类(组合和继承)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python有了concurrent的话
- 下一篇: 华为的业务范围有哪些 这3个业务你了解