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