計(jì)算機(jī)革命起源于機(jī)器右冻,編程語言的產(chǎn)生也始于對(duì)機(jī)器的模仿
但隨著發(fā)展機(jī)器越來越像人腦的一部分滑频,于是編程語言也不斷發(fā)展淳地,在不斷經(jīng)歷抽象過程后怖糊,更類似人類所認(rèn)知的方式 。 面向?qū)ο缶幊瘫闶瞧渲械囊环N重要實(shí)現(xiàn)思想
1.1 抽象過程
所有的編程語言都提供抽象機(jī)制颇象,抽象是指我們使用語言映射或描述什么伍伤,比如匯編語言是對(duì)底層機(jī)器的輕微抽象(用命令語言來描述機(jī)器控制機(jī)器),命令語言 c basic則是對(duì) 匯編語言的抽象 ?實(shí)際上這些語言依然是在基于計(jì)算機(jī)結(jié)構(gòu)來解決遇到的問題 ? 其實(shí)是在使用計(jì)算機(jī)模型來解決生活中的業(yè)務(wù)問題 ?難以理解遣钳,開發(fā)與維護(hù)
oop(object orientd programming) 面向?qū)ο缶幊淌且环N更為有力的抽象 ?它為程序猿提供了 業(yè)務(wù)空間中的元素(對(duì)象)工具扰魂,程序猿可以依據(jù)業(yè)務(wù)空間,來添加新的元素(對(duì)象)以使程序可以解決業(yè)務(wù)問題蕴茴。更加具有靈活性劝评,更易理解。 它根據(jù)問題 來 描述問題倦淀,而不是依據(jù)解決方案的計(jì)算機(jī)來描述問題蒋畜。
面向?qū)ο笳Z言的五個(gè)標(biāo)準(zhǔn)(重要)
1.萬物接對(duì)象 ? 將對(duì)象視為變量 具有存儲(chǔ)數(shù)據(jù)的能力 同時(shí)也擁有自身行為 ,事實(shí)上你所能想到的物品都可以抽象(描述)為程序中的對(duì)象
2.程序是對(duì)象的集合撞叽,他們通過發(fā)送信息來告知彼此所要做的事
3.每個(gè)對(duì)象都有其他對(duì)象作為存儲(chǔ)的元素(對(duì)象屬性可以是對(duì)象)
4.每個(gè)對(duì)象都擁有其類型 ? ?每個(gè)對(duì)象都是某個(gè)類的實(shí)例?
5.某一特定類型的所有對(duì)象都可以接收同樣的消息(多態(tài)) ? ? 圓形 與 方形 都屬于 幾何圖形(類) 他們具有一些相同的行為 可以接收同樣的信息執(zhí)行行為 ? : 圓形.acreage()? ?方形.acreage( )? ?返回面積
對(duì)象:對(duì)象具有狀態(tài)姻成,行為與標(biāo)識(shí) ? ? ? 每個(gè)對(duì)象都具有內(nèi)部數(shù)據(jù)與方法行為,并且每個(gè)對(duì)象在內(nèi)存中對(duì)應(yīng)的地址不同
1.2 每個(gè)對(duì)象都有一個(gè)接口
所有對(duì)象都是唯一的 愿棋,但是他們又具有相同的特性行為 比如 鳥類
類描述了具有相同特性(數(shù)據(jù)元素)與行為(功能)的對(duì)象集合科展,所以一個(gè)類實(shí)際上是一個(gè)數(shù)據(jù)類型,例如浮點(diǎn)型數(shù)是具有相同特性和行為集合糠雨。二者的差異 程序猿通過定義一個(gè)類來適應(yīng)問題辛润,而不再被迫只能使用機(jī)器中的存儲(chǔ)單元的數(shù)據(jù)類型
Light lt = new Light ();
lt.on(); ?//向lt發(fā)送消息 ? 即調(diào)用方法
接口:接口確定了對(duì)某一特定對(duì)象所能發(fā)出的請(qǐng)求(即規(guī)定了特定對(duì)象的行為方法)
1.3 每個(gè)對(duì)象都提供服務(wù)
在解決業(yè)務(wù)問題而設(shè)計(jì)程序時(shí),最好的方法之一就是將對(duì)象視為 服務(wù)的提供者
優(yōu)點(diǎn):提高對(duì)象的內(nèi)聚性 ?
1.4被隱藏的具體實(shí)現(xiàn)
程序猿分為:類創(chuàng)建者(創(chuàng)建類的人) ? 類消費(fèi)者(使用類實(shí)例解決問題的人) ?
在任何交互關(guān)系中,具有關(guān)系所涉及的各方都遵守邊界是十分重要的
類創(chuàng)建者可以隱藏一些類中的屬性與方法 避免使用者直接訪問砂竖,讓類消費(fèi)者無法觸及他們不該觸碰的部分
好處:1. 類創(chuàng)建者可以隨意更改 隱藏部分的代碼 ?而消費(fèi)者無需察覺真椿,不受影響 便于維護(hù)
? ? ? ? ? ?2. 保護(hù)代碼中的脆弱部分的暴露 防止錯(cuò)誤使用出現(xiàn)bug
訪問指定詞:
public : 對(duì)任何元素 方法都可訪問
private: 只允許類自身內(nèi)部使用 ?繼承也無法使用
protected : 允許類自身內(nèi)部使用 同時(shí)也允許繼承使用
默認(rèn)(空): 訪問包權(quán)限 同一個(gè)包內(nèi)可以使用 ?跨包不可使用
1.5 復(fù)用具體實(shí)現(xiàn)
事實(shí)上復(fù)用性并沒有達(dá)到我們想象中的那么理想,需要豐富的經(jīng)驗(yàn)以及敏銳的洞察力
簡單的復(fù)用某個(gè)類的方式(組合):直接使用該類的一個(gè)對(duì)象 ?將一個(gè)類的對(duì)象置于一個(gè)新類中這種方式被稱為組合乎澄,如果組合是動(dòng)態(tài)的 被稱為聚合 ? 組合被視為擁有關(guān)系 ?比如 汽車 和 引擎
在創(chuàng)建新類時(shí)首先因該考慮組合 而不是 集成
1.6 繼承 ?
難道在程序設(shè)計(jì)中只能不停創(chuàng)建新類型突硝,如果一個(gè)類型與另一個(gè)類型具有相同的特性與行為是否還需要新創(chuàng)建一個(gè)類似的類型呢?
繼承:一個(gè)類以一個(gè)現(xiàn)有類為基礎(chǔ)復(fù)制它產(chǎn)生一個(gè)副本置济,然后通過添加修改這個(gè)副本來創(chuàng)建新類 ?java中需要使用關(guān)鍵字extend來實(shí)現(xiàn)
繼承關(guān)系中:基類發(fā)生改變 子類同時(shí)會(huì)反應(yīng)這些改變
? ? ? ? ? ? ? ? ? ? ? ?子類不僅包含了基類中的所有成員(基類中private修飾的除外) 同時(shí)復(fù)制了基類的接口(private修飾的除外)
? ? ? ? ? ? ? ? ? ? ? ? ?子類如果只集成父類不做任何改變 那么繼承將是無意義的 所以使用繼承需要思考 ?是否需要一個(gè)獨(dú)特的子類
?子類與父類異同的方式: 1.在子類中添加父類中沒有的接口 (添加新方法) ? 這種需要反思 父類真的不需要添加這些接口嗎
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?2.覆蓋解恰, 修改子類中繼承父類的接口,改變方法的行為?
是一個(gè)與像一個(gè)
是一個(gè):當(dāng)一個(gè)子類覆蓋父類的所有方法 并沒有增加新的接口浙于,就意味著導(dǎo)出類與基類完全相同的類型护盈。 可以用一個(gè)導(dǎo)出類對(duì)象完全替代一個(gè)基類對(duì)象。這被視為純粹替代 ?又被成為替代原則
像一個(gè):子類(到處類)中添加了新的接口元素羞酗,也就是擴(kuò)展了接口腐宋。新類型依然可以替代基類,但并不完美檀轨,因?yàn)榛悓?duì)象并不能完全替代子類對(duì)象 基類型無法使用新添加的接口(需要考慮基類是否需要接口擴(kuò)展)
如何選擇使用哪種方式 需要具體場(chǎng)景中的思考與使用
1.7伴隨多態(tài)的可互換對(duì)象
多態(tài):編寫不依賴特定類型的代碼胸竞。在處理類型層次結(jié)構(gòu)時(shí),把一個(gè)對(duì)象不當(dāng)作它所屬的特定類型來對(duì)待参萄,而是將其當(dāng)作其基類的對(duì)象來對(duì)待卫枝。我們不關(guān)心對(duì)象是誰,只關(guān)心它的行為
好處:不受添加新類型的影響
疑問:使用多態(tài)構(gòu)建程序時(shí)讹挎,將導(dǎo)出類的對(duì)象泛化為基類對(duì)象校赤,更換新的導(dǎo)出類,編譯器是如何準(zhǔn)確執(zhí)行不同導(dǎo)出類的接口方法筒溃,他是怎么做到的痒谴,而不是執(zhí)行基類的方法(調(diào)用基類)?
這里涉及到一些新的概念:
其實(shí)面向?qū)ο蟪绦蛟O(shè)計(jì)最重要的秘訣:編譯器不是傳統(tǒng)意義上的函數(shù)調(diào)用。
前期綁定:非面向?qū)ο缶幊痰木幾g器的函數(shù)調(diào)用使用前期綁定铡羡,這意味著編譯器將產(chǎn)生對(duì)一個(gè)具體函數(shù)名稱的調(diào)用积蔚,運(yùn)行時(shí)將這個(gè)調(diào)用解析到要被執(zhí)行的代碼的絕對(duì)地址上面。
后期綁定:編譯器在編譯時(shí)并不知道具體調(diào)用那個(gè)函數(shù)烦周,調(diào)用代碼是在運(yùn)行時(shí)才確定的尽爆,實(shí)現(xiàn)方式是 java使用一小段特殊的代碼來替代絕對(duì)地址的調(diào)用。代碼使用 ?在對(duì)象中存儲(chǔ)的信息 來計(jì)算方法的具體地址读慎。根據(jù)這段代碼的內(nèi)容,每個(gè)對(duì)象都可以具有不同的行為表現(xiàn)漱贱。
向上轉(zhuǎn)型:將導(dǎo)出類看做是基類的過程
1.8 單根繼承結(jié)構(gòu)
單根繼承結(jié)構(gòu)中:所有的對(duì)象都具有同一個(gè)共用接口,所有他們都具有共同的基類型 ?
單根繼承的好處:1.所有對(duì)象都具有某些基本功能夭委,所有對(duì)象都可以很容易的在堆上創(chuàng)建刻帚,而參數(shù)傳遞也得到了簡化
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 2.單根繼承結(jié)構(gòu)是垃圾回收器的實(shí)現(xiàn)變的容易
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?3.是有對(duì)象都屬于同樣的類型,使得編程避免了對(duì)象的無法確定類型的僵局
1.9 容器
容器:用來存儲(chǔ)對(duì)象坏平,他不受存儲(chǔ)對(duì)象多少的影響唆迁,能夠?qū)崿F(xiàn)自我擴(kuò)容芹扭,對(duì)編程帶來極大的靈活性,程序猿只需將想要存儲(chǔ)的數(shù)據(jù)放進(jìn)容器即可
Java中容器實(shí)現(xiàn)的具體數(shù)據(jù)結(jié)構(gòu)是不同的 使用起來的效率是有差異性的 比如 ?ArrayList 易于查找 ?LinkList 易于插入 效率是不同的
1.9.1泛型
容器中存儲(chǔ)的是obj類型就可實(shí)現(xiàn)存放任何類型的對(duì)象,但是同時(shí)也會(huì)一些問題,在容器中存放進(jìn)具體的某些類型對(duì)象鸠儿,由于存放是進(jìn)行了向上轉(zhuǎn)型,拿出時(shí)對(duì)象的引用已經(jīng)是obj類型了厕氨,很難明確引用對(duì)象對(duì)的具體類型进每,來使用對(duì)象執(zhí)行特定的行為。這時(shí)泛型就出現(xiàn)了
向下轉(zhuǎn)型:將對(duì)象按照繼承結(jié)構(gòu)命斧,有上層的泛型類型轉(zhuǎn)化為下層的具體類型
泛型的使用:一對(duì)尖括號(hào)田晚,中間包含類信息 通過這些特征可以識(shí)別對(duì)泛型類的使用
ArrayList <Shape> list = new ArrayList();
1.10 對(duì)象的創(chuàng)建和生命周期
每個(gè)對(duì)象創(chuàng)建都需要資源国葬,存活的對(duì)象會(huì)持久的占用資源贤徒,尤其是內(nèi)存,這就是為啥要控制對(duì)象的創(chuàng)建與銷毀因?yàn)橘Y源是有限的
c++控制對(duì)象的生命周期胃惜,要求的是效率泞莉,所以他給程序猿足夠的權(quán)限哪雕,要求程序員控制對(duì)象的生命周期船殉。為了追求最大的執(zhí)行速度,對(duì)象的存儲(chǔ)空間和生命周期可以在編程時(shí)就確定斯嚎,通過將對(duì)象放置在堆棧中或靜態(tài)存儲(chǔ)區(qū)域內(nèi)來實(shí)現(xiàn)利虫。這種方式將存儲(chǔ)空間分配和釋放放置于優(yōu)先考慮的位置。 在編寫程序的時(shí)候 程序員要清楚對(duì)象的確切位置與數(shù)量
java中使用被稱為Heap(堆)的內(nèi)存池中動(dòng)態(tài)的創(chuàng)建對(duì)象堡僻。這種方式中糠惫,直到運(yùn)行時(shí)才知道需要多少對(duì)象。他的生命周期數(shù)量類型只有在程序運(yùn)行到某段代碼時(shí)才能確钉疫。如果要?jiǎng)?chuàng)建一個(gè)新的對(duì)象可以直接在堆中創(chuàng)建硼讽。因?yàn)槭沁\(yùn)行時(shí)動(dòng)態(tài)創(chuàng)建所以,需要在大量時(shí)間在堆中分配存儲(chǔ)空間牲阁,這可能遠(yuǎn)遠(yuǎn)大于堆棧中創(chuàng)建新的空間
動(dòng)態(tài)方式有這么一個(gè)一般性的邏輯:對(duì)象趨于復(fù)雜固阁,所以對(duì)象的查找和釋放存儲(chǔ)空間的開銷不會(huì)對(duì)對(duì)象的創(chuàng)建造成沖擊。
java的垃圾回收器被設(shè)計(jì)用來處理內(nèi)存問題城菊,他可以發(fā)現(xiàn)不在需要使用的對(duì)象备燃,對(duì)對(duì)象資源進(jìn)行回收。
1.11異常處理
java中提供了良好的異常處理凌唬,異常是一個(gè)對(duì)象并齐,在程序出錯(cuò)的位置被拋出,某些錯(cuò)誤被要求必須處理
1.12 并發(fā)編程
計(jì)算機(jī)編程中的一個(gè)基本概念,在同一個(gè)時(shí)刻處理多個(gè)任務(wù)的思想况褪。
最初他的實(shí)現(xiàn)是依靠在程序進(jìn)行時(shí)撕贞,將程序停下來,處理其他問題在返回主線程處理問題窝剖。有許多方法可以實(shí)現(xiàn)這個(gè)目標(biāo)麻掸,但是最初,程序猿使用有關(guān)機(jī)器的底層知識(shí)來實(shí)現(xiàn)這樣的編程赐纱,但是帶來了很多問題脊奋,可移植性很差,不同的機(jī)器無法實(shí)現(xiàn)通用
有時(shí)程序需要中斷疙描,去執(zhí)行其他重要的任務(wù)诚隙,但是對(duì)于大量的其他問題,我們更多的是將問題切割成小塊任務(wù)進(jìn)行處理起胰,從而提高程序的響應(yīng)能力久又。
在程序中,彼此獨(dú)立運(yùn)行的部分稱之為線程
線程的出現(xiàn)是為了提高單核計(jì)算機(jī)的運(yùn)行速度效五。但如果操作系統(tǒng)支持多處理器地消,那么每個(gè)任務(wù)都可以指派不同的處理器,并且他們是在真正的并行執(zhí)行畏妖。所以程序猿不需要操心到底是單核還是多核處理器脉执。只要使用就好,多核處理器不使用其實(shí)速度也會(huì)很快
多線程的隱患:共享資源 比如打印機(jī)戒劫,一個(gè)線程在打印時(shí)半夷,另一個(gè)線程不應(yīng)該同時(shí)進(jìn)行打印操作...java中使用任務(wù)鎖來控制共享資源的使用,當(dāng)一個(gè)線程執(zhí)行打印時(shí)迅细,使用任務(wù)鎖將資源鎖定巫橄,當(dāng)完成任務(wù)時(shí),再打開鎖茵典,釋放共享資源
1.13 java 與 Internet
省略了湘换。。统阿。