JavaRush /Java Blog /Random-TW /JAVA 物件導向程式設計概念
shabnahm
等級 18

JAVA 物件導向程式設計概念

在 Random-TW 群組發布
JAVA基於物件導向程式設計的概念,它允許您進入更高的抽象層次,以現實的方式解決任何問題。物件導向的方法根據更容易在應用程式中重複使用的現實世界物件來概念化問題的解決方案。例如,Chair(椅子)、Fan(風扇)、Dog(狗)、Computer(電腦)等。在 JAVA 中,類別是定義給定類型的物件的一般行為的佈局、範本或原型。實例是類別的單獨實現,類別的所有實例都具有相同的屬性,這些屬性在類別定義中進行了描述。例如,您可以定義一個名為 House 的類,並將房間數作為屬性,並建立該類別的實例,例如兩房房屋、三房房屋等。JAVA 物件導向程式設計概念 - 1優點: 下面列出了物件導向軟體開發的一些優點。
  • 降低了軟體支援成本,主要是由於它是模組化執行的。
  • 透過繼承等功能改進了程式碼重用,從而加快了軟體開發速度。
  • 提高了程式碼的可靠性和靈活性。
  • 由於現實世界的模擬,易於理解。
  • 在物件層級更好的抽象。
  • 降低從一個開發階段過渡到另一個開發階段的複雜性。
OOP有四個主要特徵:
  • 封裝
  • 遺產
  • 多態性
  • 抽象

封裝

封裝充當物件應該隱藏什麼以及應該打開什麼以供其他物件存取的契約。在JAVA中,我們使用存取修飾符private來隱藏方法並限制外界對變數的存取。JAVA也有各種存取修飾符:public、default、protectedprivate,用於限制不同等級的可見性。但最終的目標是封裝那些不該改變的東西。最有效的方法是一個類別應該只有一個改變的理由,而封裝使「一個理由」的設計成為現實。正確的封裝方法是隱藏經常變化的東西,以避免損壞其他類別。 優點: 以下是封裝的一些優點:
  • 我們可以透過隱藏物件的屬性來保護物件的內部狀態。
  • 這提高了程式碼的模組化,因為它可以防止物件以意外的方式進行互動。
  • 提高程式碼可用性。
  • 這支援特定實體的合約關係。
  • 封裝使得軟體更容易維護。
  • 對程式碼的更改可以彼此獨立地進行。

多態性

程式設計中的多態性是指為不同的底層形式(資料型別)提供相同介面的能力。這意味著具有不同功能的類別共享相同的接口,並且可以透過引用傳遞參數來動態呼叫。一個典型的例子是類別Shape(shape)以及從它繼承的所有類別:(square正方形)、circle(圓形)、dodecahedron(十二面體)、irregular polygon(不規則多邊形)、splat(斑點)等等。在此範例中,每個類別都有自己的方法Draw(),客戶端程式碼可以簡單地執行以下操作:
Shape shape = new Shape();
Shape.area()獲得任何形狀的正確行為 多態性的美妙之處在於,使用不同類別的程式碼不需要知道它正在使用哪個類,因為它們都按照相同的原理工作。物件導向程式語言用來實現動態多態性的過程稱為動態綁定。 注意:多態性是根據物件選擇更具體的方法來執行的能力。當不涉及抽象類別時,就會出現多態性。 優點:
  • 建立可重複使用的程式碼。也就是說,一旦一個類別被創建、實現和測試,就可以自由地使用它,而不必擔心其中到底寫了什麼。
  • 這允許更通用和鬆散耦合的程式碼。
  • 編譯時間減少,從而加快開發速度。
  • 動態連結。
  • 相同的介面可用於建立具有不同實作的方法。
  • 可以使用相同的方法簽名來替換整個實作。
方法重寫為多態性的一部分。重寫與兩個方法互動:父類別中的方法和衍生類別中的方法。這些方法具有相同的名稱和簽名。覆寫允許您對不同類型的物件以不同的方式執行相同的操作。例如:
while(it.hasNext()) {
Shape s = (Shape) it.next();
totalArea += s.area(dim); //будет применен полиморфизм и вызван нужный метод для каждого an object.
}
JAVA 物件導向程式設計概念 - 2方法重載或臨時多態性或靜態多態性 重載與同一類別的多個具有相同名稱但具有不同方法簽名的方法互動。重新載入可讓您對不同的資料以不同的方式描述相同的操作。它有時被稱為靜態多態,但實際上它不是多態。這只不過是兩個方法具有相同的名稱,但參數列表不同。重啟與繼承和多態無關。重載方法與重寫方法完全不同。 JAVA中透過產生實作參數多型 宣告 類別時,名稱欄位可以與不同的型別關聯,方法名稱可以與不同的參數和傳回型別關聯。JAVA透過使用泛型來支援參數多態性。
List<String> list = new ArrayList<String>();
為什麼我們不能重寫JAVA中的靜態方法? 重寫取決於類別實例的存在。多態性的想法是,你可以創建一個子類,那些子類實現的物件將與父類的相同方法(在子類中重寫)表現不同。靜態方法不與類別的任何實例關聯,因此不能應用重寫本身的概念。JAVA 的創建者受到影響這種方法的兩個考慮因素的指導。首先,存在程式碼執行問題:Smalltalk 因速度慢而受到很多批評(垃圾收集和多態性是這個問題的一部分),而 JAVA 的設計就是為了避免這種情況。第二個考慮因素是決定 JAVA 的目標受眾是 C++ 開發人員。讓靜態方法以這種方式工作對於 C++ 程式設計師來說非常熟悉,並且還加快了速度,因為無需向上查找類別層次結構來確定要呼叫哪個方法。您直接進入類別並呼叫特定的方法。

遺產

繼承是將基底類別的行為(即方法)和狀態(即變數)合併到衍生類別中的行為,以便它們在該衍生類別中可用。繼承的主要優點是它提供了程式碼重用的正式機制並避免了重複。繼承類別透過複製父類別的行為並添加新功能來擴展應用程式的功能。這使得程式碼高度耦合。如果要更改超類,則必須了解子類的所有詳細信息,以免破壞程式碼。繼承是軟體重用的一種形式,其中從現有類別(超類別)創建新類別(子類別),該類別擴展其功能並使用超類別的一些屬性。因此,如果有一個父類,然後出現一個子類,則子類別繼承父類別擁有的所有東西。 優點:
  • 改進了程式碼重用。
  • 邏輯關係「is a」(是某人、某物)成立。例如:一種 動物。(狗是一種動物)。
  • 程式碼模組化。
  • 排除重複。
缺陷:
  • 緊密耦合:子類別依賴父類別的實現,使得程式碼緊密耦合。
還有什麼要讀的:

Java 開發者小組:

抽象

抽象意味著根據類別的介面和功能來設計類別,而不考慮實作細節。抽象類別表示接口,但不包括實際的實作。它將物件的實現與其行為區分開來。抽象透過隱藏不重要的細節來簡化程式碼。 優點:
  • 透過使用抽象,我們可以分離出可以分組為某種類型的內容。
  • 經常修改的屬性和方法可以分組為單獨的類型,因此主類型不會變更。這強化了 OOP 原則:“代碼應該對擴展開放,但對變更關閉。 ”
  • 抽象簡化了領域模型的表示。
抽象和封裝之間的區別 封裝是用作抽像一部分的策略。封裝是指物件的結構:物件封裝其屬性並將其隱藏以防止外部存取。類別的使用者使用其方法與其交互,但無法直接存取類別結構。透過這種方式,類別抽象化了與其設計相關的實作細節。抽像是一個更通用的術語。除此之外,它還可以透過使用子類別來實現。例如,List標準庫中的類別(列表)是元素序列的抽象,根據元素在列表中的位置進行索引。列表的具體示例ListArrayListLinkedList。與列表互動的程式碼List會抽象化它所使用的列表的詳細資訊。如果不使用封裝隱藏底層狀態,通常不可能進行抽象化。如果一個類別暴露了它的內部結構,它就無法改變它的內部操作,因此不能被抽象化。 什麼是抽象類別和抽象方法? 在開發過程中,您可能希望基底類別只為其衍生類別提供介面。也就是說,您不希望任何人建立基底類別的實例。您需要以僅將物件強制轉換為該介面的方式使用該介面(這是允許多態行為的隱式強制轉換)。這是透過使用關鍵字使此類抽象來實現的abstract。這就帶來了一些限制,例如無法建立抽象類別的實例;使用抽象類別時,必須實作抽象方法。這確保了多態性。抽象類別可以包含抽象方法和具體方法。如果一個類別中至少有一個方法被宣告為抽象的,則整個類別也必須宣告為抽象的。然而,不必遵守相反方向的規則。如果一個類別被宣告為抽象的,則它不能包含抽象方法。僅定義其簽章而不提供實作的方法稱為抽象方法。它的實際實作留給了它的子類,這些子類擴展了抽象類。抽象方法不能被物件使用,只有另一個類別可以擴展它。 什麼時候應該使用抽象類別? 抽象類別可讓您定義一些預設行為,並讓子類別提供任何特定行為。例如:List(list) 是一個接口,又AbstractList定義了 List 的基本行為,可以原樣使用,也可以在子類別中進行細化,例如在ArrayList(list array) 中。 什麼是介面? 介面的概念是一個抽象類,但介面(由關鍵字定義interface)更進一步。它完全阻止方法或函數的任何實作。您只能聲明方法或函數,但不能提供其實作。實作介面的類別必須負責實際的實作。介面非常有用,並且在 OOP 中廣泛使用。由於它們共享介面本身和實現,因此它們提供了許多使用優勢:
  1. 多重繼承
  2. 松耦合。存在操作的抽象,例如分層,具體實作可以是任何東西:JDBC、JPA、JTA 等。
  3. 接口程式未實現
  4. 動態綁定多態性:暴露物件的程式接口,但不透露其實際實現。
  5. 抽象層次,功能分離。
介面和抽象類別的區別。
  • 介面是與實作該介面的類別之間的契約關係,聲明實作依照介面指定的方式發生。這是一個帶有聲明方法的空殼。
  • 抽象類別定義一些通用行為,並要求其子類別為其類別定義非典型或特定行為。
  • 抽象類別的方法和成員可以使用任何存取修飾符來指定;反過來,所有介面方法都必須是公共的。
  • 繼承抽象類別時,子孫類別必須定義抽象方法,而介面可以繼承另一個接口,而不必定義其方法。
  • 一個後代類別只能擴展一個抽象類,但一個介面可以擴展,或者一個類別可以實作許多其他介面。
  • 後代類別可以定義具有相同或較少限制的存取修飾符的抽象方法,但實作介面的類別必須定義具有相同可見性等級的方法。
  • 介面不包含建構函數,而抽象類別包含建構函數。
  • Java介面中宣告的變數預設是final的。抽象類別可以包含非最終變數。
  • Java 介面的所有成員都是public. 抽象類別的成員可以成為等等publicprotected

作品

程式碼重用可以透過繼承和組合來實現。但是使用組合提供了比繼承更高層級的封裝,因為後端類別的變更不一定會影響屬於前端類別的程式碼。組合是一種在類別中使用「has-a」(具有、包含)關係的設計技術。java繼承和物件組合都可以用來重複使用程式碼。組合的本質是表達對象之間的「有」關係。想想一張椅子。椅子上有一個座位。椅子有靠背。一張椅子有一定數量的腿。短語“有一個”暗示椅子擁有或至少使用另一個物體的關係。這正是「has-a」關係,它是構成的基礎。 優點:
  • 能見度控制
  • 可以在運行時替換實現
  • 鬆散耦合,因為介面類別不依賴實作。
組合和繼承之間的差異
不。 組成(有一個/有) 繼承(是/是)
1 支援多態性和程式碼重用。 支援多態性和程式碼重用。
2 運行時物件已經建立。 該物件是在編譯時動態建立的。
3 可以在運行時替換該實作。 可以在編譯時更改實作。
4 子類別獨立於其父類,這有利於鬆散耦合(尤其是在介面控制下)。 子類別依賴父類別的實現,因此認為綁定是強的。
5 用途:房子有浴室。說房子是浴室是錯的。 繼承是單向的:房子就是建築物。但這棟建築不是一個家。
注意:不要僅為了確保程式碼重用而使用繼承。如果不存在關係「is a」(is),則組合用於這些目的。 組合和聚合之間的區別在於物件關係。 聚合是一種將一個類別放入集合中的關係。它是整個關係的一部分,部分可以在沒有整體的情況下存在。這樣的關係弱得多。不存在循環依賴。例如:訂單和產品。 組合是一種將一個類別放入集合中的關係。這是整個關係的一部分,沒有整體,部分就無法存在。如果整體被破壞,其所有組成部分也將被破壞。這是一種更牢固的關係。例如:多邊形及其頂點、階及其分量。
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION