日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java基础 -- 复用类(组合和继承)

發布時間:2024/10/12 java 71 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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基础 -- 复用类(组合和继承)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。