首頁 Java java教程 淺析Java中的繼承與組合

淺析Java中的繼承與組合

Jan 21, 2017 pm 04:37 PM

前言

Java是一個物件導向的語言。每一個學過Java的人都知道,封裝、繼承、多型是物件導向的三個特徵。每個人在剛學習繼承的時候都會或多或少的有這樣一個印象:繼承可以幫助我實現類別的複用。所以,很多開發人員在需要重複使用一些程式碼的時候會很自然的使用類別的繼承的方式,因為書上就是這麼寫的(老師就是這麼教的)。但是,其實這樣做是不對的。長期大量的使用繼承會為程式碼帶來很高的維護成本。

其實我第一次學習java 的時候根本沒有聽說過組合這個名詞,老師也更沒有講解過,我一直以為是我自己落掉了什麼知識點,其實不是的,組合這個名詞暫且把它定義為一個思考的東西吧,相信讀者都接觸過了,但是並不知道它還有這個名字。

其實所謂的組合就是創建一個新類別去調用已經創建並且調試好的類,那麼這個新類就可以把它叫做是一個組合

例如我創建一個People

public class People {
 private String name;
 private int age;
  
 public void setName(String name){
 this.name = name;
 }
 public String getName(){
 return this.name;
 }
 public int getAge(){
 return this.age;
 }
 public void setAge(int age){
 this.age = age;
 }
}
登入後複製

 

例如我創建一個People

class Student {
 People people = new People();
}
登入後複製

 


例如我創建一個People

public class Student extends People{
 //doSomething
}
登入後複製

 

例如我創建一個People

public String re(){
 return this.name;
}
登入後複製

 

例如我創建一個People

{
 this.age = 10;
 this.name = "zhangsan";
}
登入後複製
那我現在要用這個類,我可以為這個類別增加一些新的特性,這時候我們就可以建立一個新的類,然後在這個類別裡建立People的物件。

例如我現在創建一個類別叫做Student

Student student = new Student();
System.out.println(student.getAge());
登入後複製

然後可以在這個類別裡添加一些屬性,比如定義個身份為student,在這裡我就不在論述了。

接下來看看繼承,其實繼承和組合本就有異曲同工之妙,先來看看是怎麼繼承的。

在java裡有一個叫做extends的關鍵字,它可以幫助我們繼承,被繼承的類我們稱作父類,也可以叫做基類,超類都行,而繼承者我們稱作子類或者衍生類別等等

這裡我們定義一個類別

//Temp1
System.out.println("i'm temp1");
//Temp2
System.out.println("i'm temp2");
//Temp3
System.out.println("i'm temp3");
登入後複製

這樣一來的話,該類別就繼承了父類別的全部成員方法和成員變量,但是注意,聲明為private權限的字段或者方法是不會被繼承下來的。

為了證明這一點我們在student類別寫一個方法

public class Mian{
 public static void main(String[] args){
 Temp3 temp3 = new Temp3();
 }
}
登入後複製

這裡編譯器會報一個錯誤"People.name is not visible",從這裡就可以看出,被聲明為private 的字段或者方法是不能被繼承下來的,如果你想把它繼承下來,可以把private改成protected,這樣的話,我們就能順利的繼承下name欄位。

這樣我們把People裡的字段全部初始化一下,只需在代碼裡加上這一段代碼塊就行了

i'm temp1
i'm temp2
i'm temp3
登入後複製


接下來在主函數裡聲明出這個student

rrreee

現在我們的發現這個寫法是可行的,儘管我們沒有在子類別中聲明任何的字段和方法,我們依然可以調用getAge();並且可以順利的打印出10


這是因為我們沒有在子類中重載任何方法,所以此時呼叫的是父類別的getAge,也就可以輕鬆的存取到父類別的private聲明的欄位了。

看完了這些相信大家對繼承已經有了一個初步的認識,那麼在繼承機制中,各個類別的構造方法又是怎麼被調用的呢,答案是自父類到子類依次調用.

示範的同時我先宣告三個類別Temp1、Temp2、Temp3,同時Temp3繼承自Temp2,而Temp2又繼承自Temp1,這樣的話,我們在各個類別的建構方法裡都放上一句列印的語句

rrreee

為了方便我這裡就這樣寫了,但是大家千萬要注意這些是放在各個類別的構造方法裡的。

我們在主函數裡創建一個Temp3的物件

rrreee

我們看控制台,列印出了

rrreee🎜🎜🎜由此可以看出先要創建temp3的對象,發現了extends,然後順道關鍵字著繼承鏈往上走,找到temp2,又發現extends關鍵字,接著找到temp1,然後呼叫temp1的構造方法,接著往下挨個呼叫。 🎜🎜總結🎜🎜以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或工作能帶來一定的幫助,如果有疑問大家可以留言交流。 🎜🎜更多 淺析Java中的繼承與組合相關文章請關注PHP中文網! 🎜
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

公司安全軟件導致應用無法運行?如何排查和解決? 公司安全軟件導致應用無法運行?如何排查和解決? Apr 19, 2025 pm 04:51 PM

公司安全軟件導致部分應用無法正常運行的排查與解決方法許多公司為了保障內部網絡安全,會部署安全軟件。 ...

如何使用MapStruct簡化系統對接中的字段映射問題? 如何使用MapStruct簡化系統對接中的字段映射問題? Apr 19, 2025 pm 06:21 PM

系統對接中的字段映射處理在進行系統對接時,常常會遇到一個棘手的問題:如何將A系統的接口字段有效地映�...

如何優雅地獲取實體類變量名構建數據庫查詢條件? 如何優雅地獲取實體類變量名構建數據庫查詢條件? Apr 19, 2025 pm 11:42 PM

在使用MyBatis-Plus或其他ORM框架進行數據庫操作時,經常需要根據實體類的屬性名構造查詢條件。如果每次都手動...

如何將姓名轉換為數字以實現排序並保持群組中的一致性? 如何將姓名轉換為數字以實現排序並保持群組中的一致性? Apr 19, 2025 pm 11:30 PM

將姓名轉換為數字以實現排序的解決方案在許多應用場景中,用戶可能需要在群組中進行排序,尤其是在一個用...

IntelliJ IDEA是如何在不輸出日誌的情況下識別Spring Boot項目的端口號的? IntelliJ IDEA是如何在不輸出日誌的情況下識別Spring Boot項目的端口號的? Apr 19, 2025 pm 11:45 PM

在使用IntelliJIDEAUltimate版本啟動Spring...

Java對像如何安全地轉換為數組? Java對像如何安全地轉換為數組? Apr 19, 2025 pm 11:33 PM

Java對象與數組的轉換:深入探討強制類型轉換的風險與正確方法很多Java初學者會遇到將一個對象轉換成數組的�...

電商平台SKU和SPU數據庫設計:如何兼顧用戶自定義屬性和無屬性商品? 電商平台SKU和SPU數據庫設計:如何兼顧用戶自定義屬性和無屬性商品? Apr 19, 2025 pm 11:27 PM

電商平台SKU和SPU表設計詳解本文將探討電商平台中SKU和SPU的數據庫設計問題,特別是如何處理用戶自定義銷售屬...

使用TKMyBatis進行數據庫查詢時,如何優雅地獲取實體類變量名構建查詢條件? 使用TKMyBatis進行數據庫查詢時,如何優雅地獲取實體類變量名構建查詢條件? Apr 19, 2025 pm 09:51 PM

在使用TKMyBatis進行數據庫查詢時,如何優雅地獲取實體類變量名以構建查詢條件,是一個常見的難題。本文將針...

See all articles