---恢復內容開始---java
這篇隨筆和你們講講java中類的繼承是什麼?但願對大家有所幫助。編程
目錄this
1、Java繼承是什麼?spa
簡單來說,Java中的繼承是一個對象獲取父對象的全部屬性和行爲的機制。它是面向對象編程系統(OOP)的重要組成部分。Java中繼承的思想是,建立基於現有類的新類。從現有類中繼承,能夠重用父類的方法和字段。此外,還能夠在當前類中添加新方法和字段設計
繼承表示IS-A關係,也稱爲父子關係。3d
二·、爲何使用繼承?code
繼承就是 好比,你和你的父親,你能夠繼承你父親身上的基因,但繼承基因的同時你能夠除了繼承你父親基因的同時再創造新的基因,就好比你父親不高,可是你想變高,就能夠在基礎的同時使用重寫來改變你的身高。對象
那爲何要使用繼承呢?blog
一、能夠實現方法重寫(這樣能夠實現運行時多態性)。提升了代碼的複用性。繼承
二、繼承容許咱們重用代碼,它提升了Java應用程序的可重用性。
3、繼承的實現
1.java繼承的基本語法
1 package pkg12; 2 //Son是子類 ,Father是父類 因此就是子類繼承(extends)父類 3 public class Son extends Father{ 4 //方法...... 5 6 }
若是要繼承一個類的話,就要使用extends關鍵字
提示:繼承按時着成員在派生類中課訪問,而不是僅僅限於當前定義的類,要在包含基類的包的外部派生一個類,這個基類就必循聲明爲public ,若是沒有聲明爲public 這個類就不能直接地擴展到包的外部。
二、繼承的特色:
用一個習題,來解釋一下什麼叫作繼承,代碼以下:
1 package pkg11; 2 3 //定義了一個老師類 同時都有兩個屬性和兩個方法 4 class TeachJava{ 5 String name; 6 int age; 7 8 public void TeachJava(){ 9 System.out.println(this.name+"在上java課"); 10 } 11 public void sleep(){ 12 System.out.println(this.name+"在休息"); 13 } 14 } 15 16 17 //定義了二個老師類 同時都有兩個屬性和兩個方法 18 class TeachHtml{ 19 String name; 20 int age; 21 public void TeachHtml(){ 22 System.out.println(this.name+"在上Html課"); 23 } 24 public void sleep(){ 25 System.out.println(this.name+"在休息"); 26 } 27 } 28 29 30 public class TextExtends{ 31 public static void main(String args[]){ 32 //實例化出第一個老師 33 TeachJava tj = new TeachJava(); 34 tj.name = "張三"; 35 tj.age = 18 ; 36 tj.TeachJava(); 37 tj.sleep(); 38 //實例化出第二個老師 39 TeachHtml th = new TeachHtml(); 40 th.name = "李四"; 41 th.age = 34; 42 th.TeachHtml(); 43 th.sleep(); 44 } 45 }
運行效果:
看到咱們定義兩個老師類,你們有沒有發現一個問題呢?就是我定義了兩個老師類, 兩個老師類裏面發現兩個相同的屬性和一個方法 ,這時咱們就能夠採用繼承的方式來設計這個案例。
那咱們應該怎麼設計呢? 遵循上面說到的繼承語法:子類 繼承 父類。
1 package pkg11; 2 //咱們能夠把相同的屬性和方法放在一個類中,定義爲 父類 3 4 //父類 5 class Teacher{ 6 String name; 7 int age; 8 9 public void sleep(){ 10 System.out.println(this.name+"在睡覺"); 11 } 12 } 13 14 //子類 15 16 17 // 子類 繼承 父類 18 class TeachJava extends Teacher{ 19 public void TeachJava(){ 20 System.out.println(this.name+"在講java課程"); 21 } 22 } 23 24 // 子類 繼承 父類 25 class TeachHtml extends Teacher{ 26 27 public void TeachHtml(){ 28 System.out.println(this.name+"在講HTML課程"); 29 } 30 } 31 32 public class TextExtends1{ 33 public static void main(String args[]){ 34 TeachJava tj = new TeachJava(); 35 tj.name = "張三";//調用父類中的屬性 36 tj.age = 20; 37 tj.TeachJava();//釣魚本身的方法 38 tj.sleep();//調用父類的方法。 39 TeachHtml th = new TeachHtml(); 40 th.name="李四";//調用父類中的屬性 41 th.age = 25; 42 th.TeachHtml();//調用本身的方法 43 th.sleep();//調用父類的方法。 44 } 45 }
兩個老師類的中重複的屬性和方法,我沒個把他歸結爲一個類當中做爲 父類 ,由於咱們繼承的父類的屬性和方法,因此咱們就有和父類相同的屬性和方法,因此繼承的最明顯的優勢就是減小了代碼的重複性。
這樣繼承和咱們以前寫的代碼運行效果會同樣嗎?運行效果以下:
子類只能得到父類中的非private的屬性,若是想要繼承就得提供公共的set和get的方法,私有的方法是沒法繼承的。
這句特色要這樣理解呢 爲何說要繼承就的使用set和get方法呢?先看代碼:
package pkg11; //咱們能夠把相同的屬性和方法放在一個類中,定義爲 父類 //父類 class Teacher{ private String name; int age; public void sleep(){ System.out.println(this.name+"在睡覺"); } } //子類 // 子類 繼承 父類 class TeachJava extends Teacher{ public void TeachJava(){ System.out.println(name+"在講java課程"); } } // 子類 繼承 父類 class TeachHtml extends Teacher{ public void TeachHtml(){ System.out.println(this.name+"在講HTML課程"); } } public class TextExtends1{ public static void main(String args[]){ TeachJava tj = new TeachJava(); tj.name = "張三"; tj.age = 20; tj.TeachJava(); tj.sleep(); TeachHtml th = new TeachHtml(); th.name="李四"; th.age = 25; th.TeachHtml(); th.sleep(); } }
在我父類屬性中加了一個private,這樣咱們再運行運行程序看看會發生什麼?
這裏發生了報錯,都在name的報錯,因此上面的特色 說的真是這點私有的方法是沒法繼承的。
若是想在繼續繼承父類的話,那麼咱們就的使用封裝的方法,get和set
1 //父類 2 class Teacher{ 3 private String name; 4 int age; 5 6 //封裝 7 public void setName(String name){ 8 this.name = name; 9 } 10 public void getName(){ 11 return name; 12 } 13 public void sleep(){ 14 System.out.println(this.name+"在睡覺"); 15 } 16 }
以後調用方法就能夠進行繼承了。 1 package pkg11; 2 //咱們能夠把相同的屬性和方法放在一個類中,定義爲 父類 3
4 //父類 5 class Teacher{ 6 private String name; 7 int age; 8 9 //封裝 10 public void setName(String name){ 11 this.name = name; 12 } 13 public void getName(){ 14 return name; 15 } 16 public void sleep(){ 17 System.out.println(this.name+"在睡覺"); 18 } 19 } 20 //子類 21 // 子類 繼承 父類 22 class TeachJava extends Teacher{ 23 public void TeachJava(){ 24 System.out.println(this.getName+"在講java課程"); 25 } 26 } 27 // 子類 繼承 父類 28 class TeachHtml extends Teacher{ 29 30 public void TeachHtml(){ 31 System.out.println(this.getName()+"在講HTML課程"); 32 } 33 } 34 public class TextExtends1{ 35 public static void main(String args[]){ 36 TeachJava tj = new TeachJava(); 37 //tj.getName = "張三";
tj.getName("張三"); 38 tj.age = 20; 39 tj.TeachJava(); 40 tj.sleep(); 41 TeachHtml th = new TeachHtml(); 42 //th.getName="李四";
th.getName("李四"); 43 th.age = 25; 44 th.TeachHtml(); 45 th.sleep(); 46 } 47 }
運行效果:
以上繼承是單一繼承,java還有多極繼承
多級繼承: 在多級繼承中,派生類將繼承基類,而且派生類也充當其餘類的基類。在下面的圖像中,類A用做派生類B的基類,後者又用做派生類C的基類。在Java中,類不能直接訪問祖父母的成員。
就是能夠繼承多個
package pkg11; //多極繼承 class A{ } class B extends A{ } class C extends B{ } public class TextExtends1{ public static void main(String args[]){ } }
運行效果:
可是不支持多繼承,它能夠支持繼承多個類,但不支持同時繼承兩個類。
這樣是不支持的
1 package pkg11; 2 //錯誤展現 3 4 class A{ 5 6 } 7 8 class B{ 9 10 } 11 12 class C extends A,B{ 13 14 } 15 16 public class TextExtends3{ 17 public static void main(String args[]){ 18 19 } 20 }
運行效果:
總結:
繼承的優缺點
優勢:一、代碼共享,減小建立類的工做量,每一個子類都擁有父類的方法和屬性。
二、提升代碼的重用性,子類能夠形似父類,但又異於父類。
三、提升代碼的可擴展性。
缺點:
一、只要繼承,就必須擁有父類的全部屬性和方法; 二、下降代碼的靈活性。子類必須擁有父類的屬性和方法,讓子類多了約束; 三、加強了耦合性,當父類的常量、變量和方法被修改時,須要考慮子類的修改,並且在缺少規範的環境下,修改可能會形成嚴重的後果。