141、繼承(inheritance)的優(yōu)缺點是什么?
● 優(yōu)點:
新的實現(xiàn)很容易,因為大部分是繼承而來的。很容易修改和擴展已有的實現(xiàn)。
● 缺點:
打破了封裝,因為基類向子類暴露了實現(xiàn)細節(jié),白盒重用,因為基類的內(nèi)部細節(jié)通常對子類是可見的,當(dāng)父類的實現(xiàn)改變時可能要相應(yīng)的對子類做出改變,不能在運行時改變由父類繼承來的實現(xiàn)。由此可見,組合比繼承具有更大的靈活性和更穩(wěn)定的結(jié)構(gòu),一般情況下應(yīng)該優(yōu)先考慮組合。只有當(dāng)下列條件滿足時才考慮使用繼承:子類是一種特殊的類型,而不只是父類的一個角色,子類的實例不需要變成另一個類的對象子類擴展,而不是覆蓋或者使父類的功能失效。
Java接口和Java抽象類代表的就是抽象類型,就是我們需要提出的抽象層的具體表現(xiàn)。OOP面向?qū)ο蟮木幊蹋绻岣叱绦虻膹?fù)用率,增加程序的可維護性,可擴展性,就必須是面向接口的編程,面向抽象的編程。
● Java接口和Java抽象類最大的一個區(qū)別,就在于Java抽象類可以提供某些方法的部分實現(xiàn),而Java接口不可以,這大概就是Java抽象類唯一的優(yōu)點吧,但這個優(yōu)點非常有用。 如果向一個抽象類里加入一個新的具體方法時,那么它所有的子類都一下子得到了這個新方法,而Java接口做不到這一點,如果向一個Java接口里加入一個新方法,所有實現(xiàn)這個接口的類就無法成功通過編譯了,因為你必須讓每一個類都再實現(xiàn)這個方法才行。
● 一個抽象類的實現(xiàn)只能由這個抽象類的子類給出,也就是說,這個實現(xiàn)處在抽象類所定義出的繼承的等級結(jié)構(gòu)中,而由于Java語言的單繼承性,所以抽象類作為類型定義工具的效能大打折扣。在這一點上,Java接口的優(yōu)勢就出來了,任何實現(xiàn)了一個Java接口所規(guī)定的方法的類都可以具有這個接口的類型,而一個類可以實現(xiàn)任意多個Java接口,從而這個類就有了多種類型。Java接口是定義混合類型的理想工具,混合類表明一個類不僅僅具有某個主類型的行為,而且具有其他的次要行為。
● 結(jié)合以上描述中抽象類和Java接口的各自優(yōu)勢,精典的設(shè)計模式就出來了:聲明類型的工作仍然由Java接口承擔(dān),但是同時給出一個Java抽象類,且實現(xiàn)了這個接口,而其他同屬于這個抽象類型的具體類可以選擇實現(xiàn)這個Java接口,也可以選擇繼承這個抽象類,也就是說在層次結(jié)構(gòu)中,Java接口在最上面,然后緊跟著抽象類。這下兩個的最大優(yōu)點都能發(fā)揮到極至了。這個模式就是“缺省適配模式”。在Java語言API中用了這種模式,而且全都遵循一定的命名規(guī)范:Abstract+接口名。
Java接口和Java抽象類的存在就是為了用于具體類的實現(xiàn)和繼承的,如果你準備寫一個具體類去繼承另一個具體類的話,那你的設(shè)計就有很大問題了。Java抽象類就是為了繼承而存在的,它的抽象方法就是為了強制子類必須去實現(xiàn)的。
使用Java接口和抽象Java類進行變量的類型聲明、參數(shù)的類型聲明、方法的返回類型說明,以及數(shù)據(jù)類型的轉(zhuǎn)換等。而不要用具體Java類進行變量的類型聲明、參數(shù)類型聲明、方法的返回類型說明,以及數(shù)據(jù)類型的轉(zhuǎn)換等。如果你寫的代碼里面連一個接口和抽象類都沒有的話,也許我可以說你根本沒有用到任何設(shè)計模式,任何一個設(shè)計模式都是和抽象分不開的,而抽象與Java接口和抽象Java類又是分不開的。
接口的作用,就是標(biāo)識類的類別。把不同類型的類歸于不同的接口,可以更好的管理他們。把一組看如不相關(guān)的類歸為一個接口去調(diào)用。可以用一個接口型的變量來引用一個對象。
持久化的對象,是已經(jīng)存儲到數(shù)據(jù)庫或保存到本地硬盤中的對象,我們稱之為持久化對象。為了保存在內(nèi)存中的各種對象的狀態(tài)(也就是實例變量,不是方法),并且可以把保存的對象狀態(tài)再讀出來。我們可以使用Java提供的序列化機制。
簡單說對象序列化是將對象狀態(tài)轉(zhuǎn)換為可保持或傳輸?shù)母袷降倪^程。什么情況下需要序列化:
● 當(dāng)你想把的內(nèi)存中的對象狀態(tài)保存到一個文件中或者數(shù)據(jù)庫中時候;
● 當(dāng)你想用套接字在網(wǎng)絡(luò)上傳送對象的時候;
● 當(dāng)你想通過RMI傳輸對象的時候;
對象要實現(xiàn)序列化,是非常簡單的,只需要實現(xiàn)Serializable接口就可以了。
● javascript的優(yōu)點:
javascript 減少網(wǎng)絡(luò)傳輸:在javascript這樣的用戶端腳本語言出現(xiàn)之前,傳統(tǒng)的數(shù)據(jù)提交和驗證工作均由用戶端瀏覽器通過網(wǎng)絡(luò)傳輸?shù)椒?wù)器開發(fā)上進行。如果數(shù)據(jù)量很大,這對于網(wǎng)絡(luò)和服務(wù)器開發(fā)的資源來說實在是一種無形的浪費。而使用javascript就可以在客戶端進行數(shù)據(jù)驗證。
javascript方便操縱html對象:javascript可以方便地操縱各種頁面中的對象,用戶可以使用javascript來控制頁面中各個元素的外觀、狀態(tài)甚至運行方式,javascript可以根據(jù)用戶的需要“定制”瀏覽器,從而使網(wǎng)頁更加友好。
javascript支持分布式應(yīng)用運算:javascript可以使多種任務(wù)僅在用戶端就可以完成,而不需要網(wǎng)絡(luò)和服務(wù)器開發(fā)的參與,從而支持分布式應(yīng)用的運算和處理。
● javascript的局限性:
各瀏覽器廠商對javascript支持程度不同:目前在互聯(lián)網(wǎng)上有很多瀏覽器,如firefox、internet explorer、opera等,但每種瀏覽器支持javascript的程度是不一樣的,不同的瀏覽器在瀏覽一個帶有javascript腳本的主頁時,由于對javascript的支持稍有不同,其效果會有一定的差距,有時甚至?xí)@示不出來。
“web 安全性”對javascript一些功能犧牲:當(dāng)把javascript的一個設(shè)計目標(biāo)設(shè)定為“web安全性”時,就需要犧牲javascript的一些功能。因此,純粹的javascript將不能打開、讀寫和保存用戶計算機上的文件。其有權(quán)訪問的唯一信息就是該javascript所嵌入開發(fā)的那個web主頁中的信息,簡言之,javascript將只存在于它自己的小小世界—web主頁里。
JSP(Java Server Pages)是由Sun Microsystems公司倡導(dǎo)、許多公司參與一起建立的一種動態(tài)網(wǎng)頁技術(shù)標(biāo)準
JSP 技術(shù)是用JAVA語言作為腳本語言的,JSP網(wǎng)頁為整個服務(wù)器端的JAVA庫單元提供了一個接口來服務(wù)于HTTP的應(yīng)用程序。
在傳統(tǒng)的網(wǎng)頁HTML文件(*.htm,*.html)中加入Java程序片段(Scriptlet)和JSP標(biāo)記(tag),就構(gòu)成了JSP網(wǎng)頁(*.jsp)。Web服務(wù)器在遇到訪問JSP網(wǎng)頁的請求時,首先執(zhí)行其中的程序片段,然后將執(zhí)行結(jié)果以HTML格式返回給客戶。程序片段可以操作數(shù)據(jù)庫、重新定向網(wǎng)頁以及發(fā)送email等等,這就是建立動態(tài)網(wǎng)站所需要的功能。所有程序操作都在服務(wù)器端執(zhí)行,網(wǎng)絡(luò)上傳送給客戶端的僅是得到的結(jié)果,對客戶瀏覽器的要求最低,可以實現(xiàn)無Plugin,無ActiveX,無 Java Applet,甚至無Frame。
● JSP 的優(yōu)點:
對于用戶界面的更新,其實就是由Web Server進行的,所以給人的感覺更新很快。
所有的應(yīng)用都是基于服務(wù)器的,所以它們可以時刻保持最新版本。
客戶端的接口不是很繁瑣,對于各種應(yīng)用易于部署、維護和修改。
臟數(shù)據(jù)在臨時更新(臟讀)中產(chǎn)生。事務(wù)A更新了某個數(shù)據(jù)項X,但是由于某種原因,事務(wù)A出現(xiàn)了問題,于是要把A回滾。但是在回滾之前,另一個事務(wù)B讀取了數(shù)據(jù)項X的值(A 更新后),A回滾了事務(wù),數(shù)據(jù)項恢復(fù)了原值。事務(wù)B讀取的就是數(shù)據(jù)項X的就是一個“臨時”的值,就是臟數(shù)據(jù)。
臟讀就是指當(dāng)一個事務(wù)正在訪問數(shù)據(jù),并且對數(shù)據(jù)進行了修改,而這種修改還沒有提交到數(shù)據(jù)庫中,這時,另外一個事務(wù)也訪問這個數(shù)據(jù),然后使用了這個數(shù)據(jù)。因為這個數(shù)據(jù)是還沒有提交的數(shù)據(jù),那么另外一個事務(wù)讀到的這個數(shù)據(jù)是臟數(shù)據(jù),依據(jù)臟數(shù)據(jù)所做的操作可能是不正確的。