面向對象的三個基本特征

面向對象的三個基本特征是:封裝、繼承、多態。
?
o_OOBase.gif

封裝


封裝最好理解了。封裝是面向對象的特征之一,是對象和類概念的主要特性。
封裝,也就是把客觀事物封裝成抽象的類,并且類可以把自己的數據和方法只讓可信的類或者對象操作,對不可信的進行信息隱藏。

繼承


面向對象編程?(OOP)?語言的一個主要功能就是“繼承”。繼承是指這樣一種能力:它可以使用現有類的所有功能,并在無需重新編寫原來的類的情況下對這些功能進行擴展。
  • 通過繼承創建的新類稱為“子類”或“派生類”。
  • 被繼承的類稱為基類父類超類
  • 繼承的過程,就是從一般到特殊的過程。
要實現繼承,可以通過“繼承”(Inheritance)和“組合”(Composition)來實現。
在某些?OOP?語言中,一個子類可以繼承多個基類。但是一般情況下,一個子類只能有一個基類,要實現多重繼承,可以通過多級繼承來實現。
?
繼承概念的實現方式有三類:實現繼承、接口繼承和可視繼承
  • 實現繼承是指使用基類的屬性和方法而無需額外編碼的能力;
  • 接口繼承是指僅使用屬性和方法的名稱、但是子類必須提供實現的能力;
  • 可視繼承是指子窗體(類)使用基窗體(類)的外觀和實現代碼的能力。
在考慮使用繼承時,有一點需要注意,那就是兩個類之間的關系應該是“屬于”關系。例如,Employee?是一個人,Manager?也是一個人,因此這兩個類都可以繼承?Person?類。但是?Leg?類卻不能繼承?Person?類,因為腿并不是一個人。

抽象類僅定義將由子類創建的一般屬性和方法,創建抽象類時,請使用關鍵字?Interface?而不是?Class。OO開發范式大致為:劃分對象抽象類將類組織成為層次化結構(繼承和合成) →用類與實例進行設計和實現幾個階段。
?

多態

多態性(polymorphisn)是允許你將父對象設置成為和一個或更多的他的子對象相等的技術,賦值之后,父對象就可以根據當前賦值給它的子對象的特性以不同的方式運作。簡單的說,就是一句話:允許將子類類型的指針賦值給父類類型的指針

實現多態,有二種方式,覆蓋,重載

覆蓋,是指子類重新定義父類的虛函數的做法。
重載,是指允許存在多個同名函數,而這些函數的參數表不同(或許參數個數不同,或許參數類型不同,或許兩者都不同)。

其實,重載的概念并不屬于“面向對象編程”,重載的實現是:編譯器根據函數不同的參數表,對同名函數的名稱做修飾,然后這些同名函數就成了不同的函數(至少對于編譯器來說是這樣的)。

如,有兩個同名函數:function func(p:integer):integer;和function func(p:string):integer;。那么編譯器做過修飾后的函數名稱可能是這樣的:int_func、str_func。對于這兩個函數的調用,在編譯器間就已經確定了,是靜態的(記住:是靜態)。也就是說,它們的地址在編譯期就綁定了(早綁定),因此,重載和多態無關!

真正和多態相關的是“覆蓋”。當子類重新定義了父類的虛函數后,父類指針根據賦給它的不同的子類指針,動態(記住:是動態!)的調用屬于子類的該函數,這樣的函數調用在編譯期間是無法確定的(調用的子類的虛函數的地址無法給出)。因此,這樣的函數地址是在運行期綁定的(晚邦定)。

結論就是:重載只是一種語言特性,與多態無關,與面向對象也無關!引用一句Bruce Eckel的話:“不要犯傻,如果它不是晚邦定,它就不是多態。”
那么,多態的作用是什么呢?我們知道,封裝可以隱藏實現細節,使得代碼模塊化;繼承可以擴展已存在的代碼模塊(類);它們的目的都是為了??代碼重用。而多態則是為了實現另一個目的??接口重用!多態的作用,就是為了類在繼承和派生的時候,保證使用“家譜”中任一類的實例的某一屬性時的正確調用。
?

概念講解

  • 泛化(Generalization)
o_Generalization.gif
圖表?1?泛化

在上圖中,空心的三角表示繼承關系(類繼承),在UML的術語中,這種關系被稱為泛化(Generalization)。Person(人)是基類,Teacher(教師)、Student(學生)、Guest(來賓)是子類。若在邏輯上BA的“一種”,并且A的所有功能和屬性對B而言都有意義,則允許B繼承A的功能和屬性。
例如,教師是人,Teacher?是Person的“一種”(a kind of?)。那么類Teacher可以從類Person派生(繼承)。
如果A是基類,B是A的派生類,那么B將繼承A的數據和函數。
如果類A和類B毫不相關,不可以為了使B的功能更多些而讓B繼承A的功能和屬性。
若在邏輯上BA的“一種”(a kind of?),則允許B繼承A的功能和屬性。
?
  • 聚合(組合)
o_aggregationBase.gif
圖表?2?組合
若在邏輯上A是B的“一部分”(a part of),則不允許B從A派生,而是要用A和其它東西組合出B。
例如,眼(Eye)、鼻(Nose)、口(Mouth)、耳(Ear)是頭(Head)的一部分,所以類Head應該類Eye、Nose、Mouth、Ear組合而成,不是派生(繼承)而成。
?
聚合的類型分為無、共享(聚合)、復合(組合)三類。
?
  • 聚合(aggregation)
?
o_aggregation.gif
圖表?3?共享

上面圖中,有一個菱形(空心)表示聚合(aggregation)(聚合類型為共享),聚合的意義表示has-a關系。聚合是一種相對松散的關系,聚合類B不需要對被聚合的類A負責。
?
  • 組合(composition)
o_composition.gif
圖表?4?復合

這幅圖與上面的唯一區別是菱形為實心的,它代表了一種更為堅固的關系組合(composition)(聚合類型為復合)。組合表示的關系也是has-a,不過在這里,A的生命期受B控制。即A會隨著B的創建而創建,隨B的消亡而消亡。
?
  • 依賴(Dependency)
o_Dependency.gif
圖表?5?依賴

這里B與A的關系只是一種依賴(Dependency)關系,這種關系表明,如果類A被修改,那么類B會受到影響。

?
轉自http://xszonline.blogdriver.com/xszonline/1215445.html

轉載于:https://www.cnblogs.com/jinxiang1224/p/8468277.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/370486.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/370486.shtml
英文地址,請注明出處:http://en.pswp.cn/news/370486.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Spring構造函數注入和參數名稱

在運行時,除非在啟用了調試選項的情況下編譯類,否則Java類不會保留構造函數或方法參數的名稱。 這對于Spring構造函數注入有一些有趣的含義。 考慮以下簡單的類 package dbg; public class Person {private final String first;private final String …

java學習文檔_資深程序員帶你深入了解JAVA知識點,實戰篇,PDF文檔

JAVA 集合JAVA 集合面對浩瀚的網絡學習資源,您是否為很難找到適合自己的學習資源而感到苦惱過?那么,您來對地方了。在這里我們幫助大家整理了一份適于輕松學習 Java 文章的清單。JVM文字太多,不便之處敬請諒解JAVA 集合文字太多&a…

java程序員電影_Java程序員必看電影:Java 4-ever

(Scene: A father and his son playing "throw-and-catch")(場景: 一位父親和兒子玩丟接球游戲)Narrator: They appear to be a perfect family旁白: 他們看起來像是一個完美的家庭(Scene: bedtime story)(場景: 床邊故事)Father: Export all OLE objects with the c…

深入理解softmax函數

Softmax回歸模型,該模型是logistic回歸模型在多分類問題上的推廣,在多分類問題中,類標簽 可以取兩個以上的值。Softmax模型可以用來給不同的對象分配概率。即使在之后,我們訓練更加精細的模型時,最后一步也需要用soft…

《第二章:深入了解超文本》

從本章開始要去除無用的話&#xff0c;只在筆記中記載要點----- 使用<a>元素創建一個超文本鏈接&#xff0c;鏈接到另一個Web頁面。 <a>元素的內容會成為Web頁面中可單擊的文本。 href屬性告訴瀏覽器鏈接的目標文件。 了解屬性 例&#xff1a;style的type屬性指定…

strcpy函數_錯誤更正(拷貝賦值函數的正確使用姿勢)

這是一篇對什么是C的The Rule of Three的錯誤更正和詳細說明。閱讀時間7分鐘。難度???雖然上一篇文章的閱讀量只有凄慘的兩位數&#xff0c;但是懷著對小伙伴負責的目的&#xff0c;必須保證代碼的正確性。這是大廚做技術自媒體的態度。前文最后一段代碼是這樣的&#xff1a…

將Java應用程序打包為一個(或胖)JAR

這篇文章的目標是一個有趣但非常強大的概念&#xff1a;將應用程序打包為單個可運行的JAR文件&#xff0c;也稱為一個或胖 JAR文件。 我們習慣了大型WAR歸檔文件&#xff0c;其中包含所有打包在某些公用文件夾結構下的依賴項。 使用類似于JAR的打包&#xff0c;情況有所不同&a…

學習java的第三天,猜字符的小程序

關于猜字符的小程序 主要實現&#xff1a;隨機輸出5個字母&#xff0c;用戶輸入猜測的字母&#xff0c;進行對比得出結果 主要有3個方法&#xff1a;主方法main(); 產生隨機字符的方法generate(); 比較用戶輸入的字符與隨機產生的字符的方法check&#xff08;&#xff09;&…

《Linux命令行與shell腳本編程大全 第3版》創建實用的腳本---10

以下為閱讀《Linux命令行與shell腳本編程大全 第3版》的讀書筆記&#xff0c;為了方便記錄&#xff0c;特地與書的內容保持同步&#xff0c;特意做成一節一次隨筆&#xff0c;特記錄如下&#xff1a;轉載于:https://www.cnblogs.com/guochaoxxl/p/7894995.html

python安裝包找不到setup_如何安裝沒有setup.py的Python模塊?

在系統上開始使用該代碼的最簡單的方法是&#xff1a;>將文件放入機器上的目錄中,>將該目錄的路徑添加到您的PYTHONPATH步驟2可以從Python REPL完成如下&#xff1a;import syssys.path.append("/home/username/google_search")您的文件系統的外觀示例&#xf…

Spring Batch中面向TaskletStep的處理

許多企業應用程序需要批處理才能每天處理數十億筆交易。 必須處理這些大事務集&#xff0c;而不會出現性能問題。 Spring Batch是一個輕量級且強大的批處理框架&#xff0c;用于處理這些大數據集。 Spring Batch提供了“面向TaskletStep”和“面向塊”的處理風格。 在本文中&a…

布局中常見的居中問題

說到布局除了浮動以及定位外還有一個不得不提的點&#xff0c;那就是居中&#xff0c;居中問題我們在網頁布局當中經常遇到&#xff0c;那么以下就是分為兩部分來講&#xff0c;一部分是傳統的居中&#xff0c;另一種則是flex居中&#xff0c;每個部分又通過分為水平垂直居中來…

unity json解析IPA后續

以前說到的&#xff0c;有很大的限制&#xff0c;只能解析簡單的類&#xff0c;如果復雜的就會有問題&#xff0c;從老外哪里看到一片博客&#xff0c;是將類中的list 等復雜對象序列化&#xff0c; using UnityEngine; using System.Collections; using System.Collections.…

改善代碼質量之內連臨時變量

待增轉載于:https://www.cnblogs.com/muyl/articles/6940896.html

python 矩陣元素相加_Numpy中元素級運算

標量與矩陣的運算:加法&#xff1a;values [1,2,3,4,5]values np.array(values) 5#現在 values 是包含 [6,7,8,9,10] 的一個 ndarray乘法&#xff1a;x np.multiply(some_array, 5)x some_array * 5矩陣與矩陣的運算:加法&#xff1a;對應元素相加&#xff0c;但形狀必須相…

排序算法——桶排序

把數據放進若干個桶&#xff0c;然后在桶里用其他排序&#xff0c;近乎分治思想。從數值的低位到高位依次排序&#xff0c;有幾位就排序幾次。例如二位數就排兩次&#xff0c;三位數就排三次&#xff0c;依次按照個十百...的順序來排序。 第一次排序&#xff1a;50 12 …

原型設計模式:創建另一個小車

創建對象確實是一個耗時的過程&#xff0c;也是一件昂貴的事情。 因此&#xff0c;我們現在正努力節省時間和金錢。 我們該怎么做&#xff1f; 克隆奇跡多莉 有人記得多莉嗎&#xff1f; 是的&#xff0c;是綿羊&#xff0c;是第一個被克隆的哺乳動物。 好吧&#xff0c;我不想…

java實現周期任務_java定時任務的實現方式

本文列舉常見的java定時任務實現方式&#xff0c;并做一定比較。1. 循環內部sleep實現周期執行創建一個thread&#xff0c;run() while循環里sleep()來實現周期性執行; 簡單粗暴&#xff0c;作為一個初學者很容易想到。public class Task1 {public static void main(String[] a…

磁盤鏡像工具Guymager

磁盤鏡像工具Guymager在數字取證中&#xff0c;經常需要對磁盤制作鏡像&#xff0c;以便于后期分析。Kali Linux提供一款輕量級的磁盤鏡像工具Guymager。該工具采用圖形界面化方式&#xff0c;提供磁盤鏡像和磁盤克隆功能。它不僅生成dd的鏡像&#xff0c;還能生成EWF和AFF鏡像…

python怎么寫代碼求年華收益率_如何計算年化收益率?

關于投資年化收益率的計算&#xff0c;三思君覺得主要有三種&#xff0c;分別是一次性投資的收益率計算、定期定額的收益率計算、不定期不定額的收益率計算。1.一次性投資的收益率計算對于一次性投資的收益率&#xff0c;相信大家都會計算。比如&#xff0c;小李同學去年買了一…