国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

面向對象概念的學習和思考

jzman / 2373人閱讀

摘要:摘要本文章關注點是理解面向對象概念,從抽象的角度上去理解對象,重點包括理解對象的作用,以及理解面向對象的三大特征封裝,繼承,多態。特性多態不同對象以自己的方式響應相同的消息的能力叫做多態。

摘要:本文章關注點是理解面向對象概念,從抽象的角度上去理解對象,重點包括理解對象的作用,以及理解面向對象的三大特征(封裝,繼承,多態)。本文重點關注的是理解概念。

在理解面向對象之前,首先回答幾個問題
1. 什么是對象,類
類,即類型的意思,而每一個對象都是某類(類型)的具體實例;比如鳥和魚,都是具體的對象,都是屬于動物這個類;
對象最簡單的描述就是:對象具有狀態、行為、和標志;
具有狀態異味著著對象可以擁有內部數據;
行為即方法;
標志即對象可以唯一的與其他對象區分開來,有些類似身份證的作業;

2. 為什么要面向對象以及對象的作用
在面向對象產生之前,最為熟知的是面向過程的編程,大學的入門課程C語言就是如此;
“面向過程(結構化編程)是以功能為目標導向來設計構造應用系統,這種做法導致我們設計程序時,不得不將客體所構成的現實世界映射到由功能模塊組成的解空間中,這種轉換過程,背離了人們觀察和解決問題的基本思路。
可見結構化設計在設計系統的時候,無法解決重用、維護、擴展的問題,而且會導致邏輯過于復雜,代碼晦澀難懂。于是人們就想,能不能讓計算機直接模擬現實的環境,用人類解決問題的思路,習慣,步驟來設計相應的應用程序?這樣的程序,人們在讀它的時候,會更容易理解,也不需要再把現實世界和程序世界之間來回做轉換。
與此同時,人們發現,在現實世界中存在的客體是問題域中的主角,所謂客體是指客觀存在的對象實體和主觀抽象的概念,這種客體具有屬性和行為,而客體是穩定的,行為不穩定的,同時客體之間具有各種聯系,因此面向客體編程,比面向行為編程,系統會更穩定,在面對頻繁的需求更改時,改變的往往是行為,而客體一般不需要改變,所以我們就把行為封裝起來,這樣改變時候只需要改變行為即可,主架構則保持了穩定。 ”[1]

那抽象出的對象的角色是什么呢?
對象可以理解為模擬中我們概念中的客體,因此對象的存在的目的就是為提供服務,服務鏈結構可以多樣化。比如汽車為司機服務,而零件商家為汽車服務(提供汽車零件)。
"將對象看做是服務提供者有一個好處就是有助于提高對象的內聚性。"[2]

3. 面向對象三大特性
面向對象的三大特性的是理解面向對象的關鍵點。
特性1: 封裝性
首先要問為什么要封裝以及封裝什么?
封裝的的原因在于:封裝可以讓使用者看不到具體的實現細節,創建者可以不用擔心被使用者誤改,從而減少程序Bug;
而且,允許庫設計工作者可以改變程序內部結構而不擔心影響客戶端。創建者改動需要調用者改動代碼的現象特別是以前很常見的。
同時,客戶端的目標也更明確:客戶端程序員不關心具體的實現,只關心拿創建者的接口的功能是什么。

封裝的內容包括三個方面:
(1)把自己的數據和方法只讓可信的類或者對象操作,即隱藏或者暴漏數據、接口。
(2)"找到變化并且把它封裝起來,你就可以在不影響其它部分的情況下修改或擴展被封裝的變化部分,這是所有設計模式的基礎,就是封裝變化,因此封裝的作用,就解決了程序的可擴展性"[1]
(3)現實寫代碼過程中,更多接觸的是:找到重復度高的,對代碼可重用的部分進行封裝;

特性2: 繼承
面向對象編程(OOP)一個主要功能就是“繼承”。繼承它可以使用現有類的所有功能,并在無需重新編寫原來的類的情況下可以復用基類的方法或者對這些功能進行擴展。
在考慮使用繼承時,有一點需要注意,那就是兩個類之間的關系應該是“屬于”關系。例如,Cat,Dog,因此這兩個類都可以繼承 Animal 類。否則,沒有這種關系的就不要繼承了。

接下來,理解下is-a和is-like-a關系

對于繼承有這么一個爭論:繼承應當只覆蓋基類(并且不添加基類中沒有的新成員函數)嗎?這就意味著派生類與基類是完全相同的類型,因為它們有相同的接口。結果是,我們可以用派生類的對象代替基類的對象。這被認為是純粹替代(pure substitution),常常被稱做替代原則(substitution principle)。在某種意義上,這是對待繼承的理想方法。我們常把基類和派生類之間的關系看做是一個“is-a(是)”關系,因為我們可以說“圓形是一個形體”。對繼承的一種測試方法就是看我們是否可以說這些類有“is-a”關系,而且還有意義。

但是,有時需要向一個派生類型添加新的接口元素,這樣就擴展了接口。這個新類型和基類不完全相同了,而且這些新接口元素不能從基類訪問。這可以描述為“is-like-a(像)”關系;新類型有老類型的接口,但還包含其他函數,所以不能說它們完全相同[3]。

同時,繼承雖然可以復用基類的方法/屬性,但是很多時候的濫用導致的問題太多,比如覆蓋基類后,子類默認覆蓋相同名字的父類方法。繼承是中非必要的話就不需要覆蓋了,是一定必要的時候明確指出來,Kotlin語言中繼承基類后,要明確指出覆蓋的方法。

繼承的缺點[4]:
a.破壞封裝,子類與父類之間緊密耦合,子類依賴于父類的實現,子類缺乏獨立性
b.支持擴展,但是往往以增加系統結構的復雜度為代價
...

繼承使用原則:

A.繼承樹的層次不可太多,盡量保持在2-3層,首先過多的繼承會導致對象模型的機構太復雜,難以理解,增加了開發和設計的難度,如果子類和父類之間還有頻繁的方法和屬性覆蓋,更增加了多態機制的難度。其次影響系統的可擴展性,繼承樹的層次越多在繼承樹上增加一個新的繼承分支就需要創建更多的類。

B.使用繼承樹上的類時應該盡可能把引用變量聲明為繼承樹的上層類型,首先上層類型定義了下層子類都擁有的屬性和方法并且盡可能為多數方法提供默認實現從而提高代碼的可重用性。其次上層類型代表一種服務接口描述系統所能提供的服務,父類不一定實現這個服務,提高系統的松耦合及系統本身的可維護性。

JAVA為什么是單繼承結構?
在單繼承中,所有對象都具有一個共同的接口,所以他們歸根到底屬于同一基本類型。而多繼承(C++)是無法保證所有對象都屬于同一基本類型。對象的創建和參數的傳遞相對來說變得簡單,而且使得垃圾回收器的實現變得容易很多,由于所有對象有其類型的基本信息,因此不會出現無法確認對象類型而陷入僵局[5](通俗理解就是我系統運行后,不知道哪個類型的對象在work)。

特性3:多態

不同對象以自己的方式響應相同的消息的能力叫做多態。多態性(polymorphisn)允許你將父對象設置成為和一個或更多的他的子對象相等的技術,賦值之后,父對象就可以根據當前賦值給它的子對象的特性以不同的方式運作。簡單的說,就是一句話:允許將子類類型的指針賦值給父類類型的指針。
與多態相關的具體是覆蓋,重載。
覆蓋,是指子類重寫父類的函數。
重載,是指允許存在多個同名函數,而這些函數的參數表不同(或許參數個數不同,或許參數類型不同,或許兩者都不同)。

區分前期綁定和后期綁定
前期綁定,在程序執行前根據編譯時類型綁定,調用開銷較小,如C語言只有前期綁定這種方法調用。
后期綁定,是指在運行時根據對象的類型進行綁定,又叫動態綁定或運行時綁定。實現后期綁定,需要某種機制支持,以便在運行時能判斷對象的類型,調用開銷比前期綁定大。
Java中的static方法和final方法(private屬于final方法,詳細的解釋見《Java編程思想》)屬于前期綁定,子類無法重寫final方法,成員變量(包括靜態及非靜態)也屬于前期綁定。除了static方法和final方法(private屬于final方法)之外的其他方法屬于后期綁定,運行時能判斷對象的類型進行綁定[6,7].

4. 對象之間的交流

那么為了能讓對象之間有交互行為,能相互發送消息和接受消息,該如何做呢?一般來說有兩種方法:1)方法調用,A對象調用B對象的方法,這種方法最常用最直接,但是缺點是會導致A依賴于B。這個問題我們往往會通過面向接口編程在一定程度上消除這種依賴關系;2)事件消息模式,生產者-消費者模式,即采用觸發事件響應事件的模式;通過這種方式,A對象就不是直接調用B對象的方法了,而是觸發一個事件,然后B對象去響應這個事件,或者如果采用消息總線的方式的話,就是A對象通知消息總線發布某個事件,然后消息總線發布這個事件,然后B對象響應這個事件[8].

參考資料
[1]博客: http://www.cnblogs.com/seesea...
[2]書籍: think in java (4 edition), page 1-4
[3]博客:http://book.51cto.com/art/201...
[4]博客:http://www.cnblogs.com/nuaalf...
[5]書籍: think in java (4 edition), page 11
[6]博客:http://www.cnblogs.com/NotOnl...
[7]博客:http://droidyue.com/blog/2014...
[8]博客:http://www.cnblogs.com/netfoc...

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/66041.html

相關文章

  • 什么是面向對象

    摘要:第一章面向對象小白是一門完全面向對象的編程語言嗯什么是面向過程什么又是面向對象呢大佬在我們正式進入學習這部分前,了解一下面向過程和面向對象這兩個概念,對于我們接下來的學習有很大的好處。這一部分我們會在面向對象學習結束后進行系統的整理和總結。 showImg(https://segmentfault.com/img/remote/1460000019303357); 第一章 面向對象 小...

    DirtyMind 評論0 收藏0
  • java 面向對象程序設計入門

    摘要:一學習資料今天入門了一門新的編程語言,主要對照清華大學出版社教材語言與面向對象程序設計,附帶在上寫了一個實例。重要的概念,如對象,屬性,方法等。因此需要在實操中強化操作技能,加深對概念的鞏固。輔以靈活引用已有的代碼庫,加速以及項目的進展。 一、學習資料:今天入門了一門新的編程語言,主要對照清華大學出版社教材《Java 語言與面向對象程序設計》,附帶在eclipse 上寫了一個實例。 二...

    Profeel 評論0 收藏0
  • 理解JavaScript核心知識點:原型

    摘要:首先,需要來理清一些基礎的計算機編程概念編程哲學與設計模式計算機編程理念源自于對現實抽象的哲學思考,面向對象編程是其一種思維方式,與它并駕齊驅的是另外兩種思路過程式和函數式編程。 JavaScript 中的原型機制一直以來都被眾多開發者(包括本人)低估甚至忽視了,這是因為絕大多數人沒有想要深刻理解這個機制的內涵,以及越來越多的開發者缺乏計算機編程相關的基礎知識。對于這樣的開發者來說 J...

    iKcamp 評論0 收藏0
  • 一道面試題引發思考

    摘要:下面我們來使用面向對象類圖這里就不再畫了首先面試題中所提到的我們都可以看成類,比如停車場是一個類吧,它里面的車位是一個類吧,攝像頭,屏幕。。。 以下是某場的一道面試題(大概): 1、一個停車場,車輛入場時,攝像頭記錄下車輛信息2、屏幕上顯示所接收的車輛的信息情況(車牌號)以及各層車位的車位余量3、停車場一共四層車位,其中的三層都為普通車位,還有一層為特殊車位(體現在停車計費價格上面的不...

    Apollo 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<