上篇說到Java-static關鍵字 今天咱們開始學習有關Java繼承的知識。java
繼承是面向對象三大特徵之一,封裝居首位,封裝以後造成了獨立體,獨立體A和獨立體B之間可能存在繼承關係。其實程序中的繼承靈感來自於現實生活,在現實生活中繼承到處可見,例如,兒子繼承了父親的財產,兒子不須要努力就頗有錢。markdown
繼承時子類繼承父類的特徵和行爲,使得子類對象(實例)具備父類的屬性,或子類從父類繼承方法,使得子類具備與父類相同的行爲。ide
兔子和羊屬於食草動物類,獅子和豹屬於食肉動物類。食草動物和食肉動物又是屬於動物類。因此繼承須要符合的關係是:is-a(Bird is-a Animal),父類更通用,子類更具體。學習
雖然食草動物和食肉動物都是屬於動物,可是二者的屬性和行爲上有差異,因此子類會具備父類的通常特性也會具備自身的特性。測試
爲何要使用繼承機制?在不一樣的類中也可能會有共同的特徵和動做,能夠把這些共同的特徵和動做放在一個類中,讓其它類共享。所以能夠定義一個通用類,而後將其擴展爲其它多個特定類,這些特定類繼承通用類中的特徵和動做。
繼承是 Java 中實現軟件重用的重要手段,避免重複,易於維護。this
java中繼承的語法格式: class 類名 extends 父類名{ 類體; }
爲何須要繼承,接下來咱們用如下這個需求來講明一下:3d
public class Account { //銀行帳戶類 //帳號 private String actno; //餘額 private double balance; //帳號和餘額的set和get方法 public String getActno() { return actno; } public void setActno(String actno) { this.actno = actno; } public double getBalance() { return balance; } public void setBalance(double balance) { this.balance = balance; } }
public class CreditAccount { //信用帳戶類 //帳號 private String actno; //餘額 private double balance; //帳號和餘額的set和get方法 public String getActno() { return actno; } public void setActno(String actno) { this.actno = actno; } public double getBalance() { return balance; } public void setBalance(double balance) { this.balance = balance; } //信譽度(特有屬性) private double credit; //信譽度的set和get方法 public double getCredit() { return credit; } public void setCredit(double credit) { this.credit = credit; } }
以上兩個類分別描述了「銀行帳戶類」和「信用帳戶類」,信用帳戶類除了具備銀行帳戶類的特徵以外還有本身的特性,按照以上代碼的編寫方式,程序將會很是的臃腫,咱們將上面的程序修改成繼承方式,請看代碼:code
public class Account { //銀行帳戶類 //帳號 private String actno; //餘額 private double balance; //帳號和餘額的set和get方法 public String getActno() { return actno; } public void setActno(String actno) { this.actno = actno; } public double getBalance() { return balance; } public void setBalance(double balance) { this.balance = balance; } }
public class CreditAccount extends Account{ //信用帳戶類 //信譽度(特有屬性) private double credit; //信譽度的set和get方法 public double getCredit() { return credit; } public void setCredit(double credit) { this.credit = credit; } }
public class AccountTest { public static void main(String[] args) { CreditAccount act = new CreditAccount(); act.setActno("111111111"); act.setBalance(9000.0); System.out.println(act.getActno() + "信用帳戶,餘額" + act.getBalance() + "元"); } }
運行結果以下圖所示:對象
經過以上的代碼,咱們能夠看到繼承是能夠解決代碼臃腫問題的,換句話說,繼承解決了代碼複用的問題,但這其實並非繼承最重要的做用,繼承最重要的做用是:有了繼承纔有了方法覆蓋和多態(後續的課程中詳細講解)。blog
繼承有哪些特性呢?如下內容須要記憶:
● B類繼承A類,則稱A類爲超類(superclass)、父類、基類,B類則稱爲子類(subclass)、派生類、擴展類。
● java中的繼承只支持單繼承,不支持多繼承,C++中支持多繼承,這也是java體現簡單性的一點,換句話說,java中不容許這樣寫代碼:class B extends A,C{ }。
● 雖然java中不支持多繼承,但有的時候會產生間接繼承的效果,例如:class C extends B,class B extends A,也就是說,C直接繼承B,其實C還間接繼承A。
● java中規定,子類繼承父類,除構造方法和被private修飾的數據不能繼承外,剩下均可以繼承。
● java中的類沒有顯示的繼承任何類,則默認繼承Object類,Object類是java語言提供的根類(老祖宗類),也就是說,一個對象與生俱來就有Object類型中全部的特徵。
● 繼承也存在一些缺點,例如:CreditAccount類繼承Account類會致使它們之間的耦合度很是高,Account類發生改變以後會立刻影響到CreditAccount類。
接下來咱們來測試一下從Object類中繼承過來的方法,先來看一下Object類的部分源代碼:
咱們來嘗試調用這個方法,請看代碼以及執行結果:
public class ExtendsTest{ public static void main(String[] args) { ExtendsTest et = new ExtendsTest(); String s = et.toString(); System.out.println(s); } }
運行結果以下圖所示:
雖然輸出結果看不懂,可是起碼看到這個字符串當中確實是有一個「@」符號的,toString()方法確實被ExtendsTest類繼承過來了。
推薦給你們個比較詳細的Java零基礎教程,下面這個是我看過的以爲挺不錯的,值得觀看收藏。
分享給你們,點這裏
看完若是對你有幫助,感謝點贊支持~