摘要:面向對象與面向過程的區別要知道,二者并不是非此即彼,而是相輔相成的。而面向過程,則在微觀上對對象內部進行具體的實現。面向對象的三大特性說到面向對象,就不得不說其三大特性封裝繼承和多態。封裝封裝是面向對象最基礎的特性。
作者:伯特
出處:github.com/ruicbAndroid/LoulanPlan
聲明:本文出自伯特的《LoulanPlan》,轉載務必注明作者及出處。
剛學習 Java 那會就接觸了“面向對象”的概念,但當時并沒有太多實戰經驗,所以對其的理解也僅限于概念。當工作兩年后再回顧一下,有些概念能夠落地了,遂記錄一下,作為 LoulanPlan 的開篇。
1. 什么是面向對象面向對象是一種程序設計的思想,而不是一種方法,亦或準則。其指導我們從現實世界中客觀存在的事物出發,進行程序設計。
2. 什么是對象Everything is Object,在 Java 語言的世界中,萬事萬物皆對象。上面提到“從現實世界中客觀存在的事物出發”,這里客觀存在的事物,我們稱之為“對象”。
在程序中,對象是程序的基本構成單元,是客觀存在的事物的體現。一個對象通常由一組屬性和對這組屬性進行操作的若干服務(方法)構成。
3. 面向對象與面向過程的出現面對簡單的軟件程序,我們往往不需要考慮過多的設計,任何一個小的功能單元或模塊,都可以按照一定的步驟去實現,這種 step by step 的方式即為面向過程。
隨著程序的復雜性提升,我們無法按步驟去描述并實現編碼,所以面向過程已無法適應。加之考慮到代碼的可讀及復用性等,便有了對象的概念,以及面向對象的編程思想。
當然,還有面向組件、面向服務等設計思想,不在此討論。
4. 面向對象與面向過程的區別要知道,二者并不是非此即彼,而是相輔相成的。
面向對象思想要求我們從宏觀上進行程序設計,抽象出一個個“對象”。而面向過程,則在微觀上對“對象”內部進行具體的實現。
可以看出,面向對象最終還是離不開面向過程。
舉例來說,需要編程實現繪制圓形、三角形、矩形。
面向過程實現:
drawCircle... //一坨繪制相關的代碼,下同 drawTriangle drawRect
面向對象實現:
//抽象出畫筆對象 class Painter { drawCircle(){ //上述面向過程實現,下同 } drawTriangle(){} drawRect(){} } //面向對象,使用畫筆繪制 1. painter.drawCircle() //此處只需要調用對象的方法,下同 1. painter.drawTriangle() 2. painter.drawRect()5. 對象與類
前面介紹了對象以及面向對象,下面回到 Java 中聊聊類的概念。
5.1 類我們常說“物以類聚”,表達“ 同類的東西聚在一起”。其實 Java 中的類也可以這么去理解:“物”即客觀存在的“對象”,同類物體的特征描述,即為“類”。
上面是我的個人理解,用術語概括就是:類是客觀事物的抽象,或者說是對現實生活中事物的一種描述(屬性和行為)。
例如前面定義的 Painter 類,是對客觀事物畫筆的抽象,包含了一些繪制的方法(行為)。
5.2 對象與類的關系類進行實例化可生成對象,所以,類的具體表現或者實例就是對象,而對象的抽象或者總概括就是類。
6. 面向對象的三大特性說到面向對象,就不得不說其三大特性:封裝、繼承和多態。
下面簡單說說自己的理解吧,就不再貼相關示例了,網上有很多優秀的例子。
6.1 封裝封裝是面向對象最基礎的特性。在前面介紹對象時,提到“一個對象通常由一組屬性和對這組屬性進行操作的若干服務(方法)構成”,這里的構成體現的就是封裝性。
封裝,是指對外隱藏對象內部的屬性和實現細節,只提供相應的接口和方法進行交互。一方面,外部只需專注于對象所提供的能力,而不用關心內部實現細節;另一方面,避免了外部隨意修改或訪問內部屬性和方法,從而提升了程序的健壯性;同時,封裝能提升代碼的復用率。
6.2 繼承繼承指一個對象從另一個對象中獲得屬性和方法的過程,繼承者稱為子類,被繼承者稱為父類。繼承使得子類對象擁有父類對象的全部屬性與方法(非私有)。
Key point:
子類也可以被其他類繼承成為父類;
父類可以擁有多個子類,但一個子類只能有一個父類。這一點與現實中父親與孩子的關系是一致的;
Java 中任何類都是 java.lang.Object 的直接或間接子類;
子類不能繼承父類中訪問權限為 private 的成員變量和方法;
子類可以重寫(override)父類的方法;
子類可以通過 super 關鍵字訪問父類的成員變量、方法和構造器;
final 聲明的類或方法,不能被繼承或重寫;
6.3 多態多態是在繼承的基礎上實現的,多態實現的三個必要條件:
繼承
方法重寫(override)
父類引用指向子類對象,例如:Human human = new Man(),這里 Man extends Human。
當使用多態方式調用方法時,會依據以下規則:
首先檢查父類中是否有該方法,如果沒有,則編譯錯誤;
若子類重寫了該方法,調用子類的重寫方法;
若子類沒有重寫該方法,則調用父類的方法;
多態的好處:可以使程序有良好的擴展,并可以對所有類的對象進行通用處理。
7. 總結以上是本文的全部內容,希望能對你有所啟發。內容說不上全面、無誤,還望讀者朋友補充、指正。
最后,感謝閱讀。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/72244.html
摘要:可實現單例模式代碼塊初始化靜態變量,只被執行一次內部類不能與外部類重名,只能訪問外部類靜態數據包括私有多分支選擇整型或字符類型變量或整數表達式開始支持。 前言 大學期間接觸 Java 的時間也不短了,不論學習還是實習,都讓我發覺基礎的重要性。互聯網發展太快了,各種框架各種技術更新迭代的速度非常快,可能你剛好掌握了一門技術的應用,它卻已經走在淘汰的邊緣了。 而學習新技術總要付出一定的時間...
摘要:前言系列文章目錄我們都不陌生也是面試幾乎必問的考點本系列我們來深入思考有關的設計思想和實現細節解決了什么問題任何數據結構的產生總對應著要解決一個實際的問題的產生要解決問題就是如何有效的存取一組鍵值對鍵值對是最常使用的數據形式如何有效地存 前言 系列文章目錄 HashMap我們都不陌生, 也是java面試幾乎必問的考點, 本系列我們來深入思考有關HashMap的設計思想和實現細節. Ha...
摘要:在這些類當中有其自身的實現一般都是用來比較對象的成員變量值是否相同,而不再是比較類在堆內存中的存放地址了。舉例說明結果說明中有其自身的實現,屬于內容比較。 在研究hashcode的用法,發現自己對equals的理解還不夠深,廢話少說,繼續專研,記錄如下: 要想搞清楚equals和==的區別,就先要搞清楚JAVA的數據類型: showImg(https://segmentfault.co...
閱讀 2302·2021-11-24 10:18
閱讀 2738·2021-11-19 09:59
閱讀 1722·2019-08-30 15:53
閱讀 1201·2019-08-30 15:53
閱讀 1079·2019-08-30 14:19
閱讀 2492·2019-08-30 13:14
閱讀 3026·2019-08-30 13:00
閱讀 1965·2019-08-30 11:11