面向?qū)ο笾械木幊贪踩玙第1頁(yè)
面向?qū)ο笾械木幊贪踩玙第2頁(yè)
面向?qū)ο笾械木幊贪踩玙第3頁(yè)
面向?qū)ο笾械木幊贪踩玙第4頁(yè)
面向?qū)ο笾械木幊贪踩玙第5頁(yè)
已閱讀5頁(yè),還剩26頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

面向?qū)ο笾械木幊贪踩嫦驅(qū)ο?ObjectOriented,OO)是目前最流行的軟件開發(fā)方法之一,也是當(dāng)前計(jì)算機(jī)軟件工程界關(guān)心的重點(diǎn),從90年代開始,它就慢慢變成了軟件開發(fā)方法的主流。目前,面向?qū)ο蟮母拍詈蛻?yīng)用,已經(jīng)不僅僅集中于程序設(shè)計(jì)和軟件開發(fā),而是擴(kuò)充到計(jì)算機(jī)應(yīng)用的其他應(yīng)用場(chǎng)合,如數(shù)據(jù)庫(kù)系統(tǒng)、交互式界面、應(yīng)用結(jié)構(gòu)、應(yīng)用平臺(tái)、分布式系統(tǒng)、網(wǎng)絡(luò)管理結(jié)構(gòu)、CAD技術(shù)、人工智能等領(lǐng)域。面向?qū)ο髲?qiáng)調(diào)人類在日常的思維邏輯中經(jīng)常采用的思維方法與原則,其中的重要概念如抽象、分類、繼承、聚合、多態(tài)等,都和我們的生活息息相關(guān),這也成為面向?qū)ο笏枷肓餍械脑?。本章主要介紹面向?qū)ο笾械陌踩幊?。涉及面向?qū)ο螅瑑?nèi)存的分配與釋放,靜態(tài)成員安全等幾個(gè)方面。第2頁(yè),共31頁(yè),2024年2月25日,星期天7.1面向?qū)ο蟾攀龅?頁(yè),共31頁(yè),2024年2月25日,星期天7.1.1面向?qū)ο蠡驹砻嫦驅(qū)ο螅梢哉f(shuō)是目前最流行的軟件開發(fā)方法之一,目前大多數(shù)的高級(jí)語(yǔ)言都支持面向?qū)ο?,該思想也是用日常生活中的現(xiàn)象開模擬軟件開發(fā)的過(guò)程。面向?qū)ο蟀▋蓚€(gè)方面的范疇:面向?qū)ο蠓椒▽W(xué);面向?qū)ο蟪绦蜷_發(fā)技術(shù)。其中,面向?qū)ο蠓椒▽W(xué)是面向?qū)ο蟪绦蜷_發(fā)技術(shù)的理論基礎(chǔ)。從面向?qū)ο蠓椒▽W(xué)的理論,可以設(shè)計(jì)出類似人類思維方式和手段的面向?qū)ο蟪绦蛟O(shè)計(jì)語(yǔ)言,從而延伸出面向?qū)ο蟪绦蜷_發(fā)技術(shù),使得程序開發(fā)過(guò)程非常類似于人類的認(rèn)知。通過(guò)面向?qū)ο蟮姆椒▽W(xué)和面向?qū)ο蟮某绦蜷_發(fā)技術(shù)開發(fā)出的軟件,具有模塊化特色突出、可讀性強(qiáng)、易維護(hù)性強(qiáng)等優(yōu)點(diǎn)。第4頁(yè),共31頁(yè),2024年2月25日,星期天在面向?qū)ο蟮姆椒▽W(xué)中,基于人類對(duì)客觀世界的認(rèn)知規(guī)律、思維方式和方法,提取出針對(duì)軟件開發(fā)的如下抽象認(rèn)識(shí):客觀世界由各種各樣的實(shí)體組成,各自發(fā)揮作用,相互進(jìn)行通信,這些實(shí)體稱為對(duì)象;每個(gè)對(duì)象都保存了各自的內(nèi)部狀態(tài),具有一定的功能動(dòng)作;由于外界其他對(duì)象或者外部環(huán)境的影響,對(duì)象本身依據(jù)通信機(jī)制,根據(jù)具體情況作出不同的反應(yīng);多個(gè)相似對(duì)象,如果屬性和功能動(dòng)作性質(zhì)類似,可以將其劃分為一類;類與類之間可以有繼承關(guān)系;復(fù)雜的對(duì)象可以由相對(duì)簡(jiǎn)單的對(duì)象通過(guò)一定的方式組合而成;對(duì)象之間可以通過(guò)各種方法進(jìn)行通信;等等??偠灾?,一系列簡(jiǎn)單或復(fù)雜的對(duì)象進(jìn)行組合,其問(wèn)的相互作用和通信,構(gòu)成了各種系統(tǒng),構(gòu)成了人們所面對(duì)的客觀世界。第5頁(yè),共31頁(yè),2024年2月25日,星期天7.1.2面向?qū)ο蟮幕靖拍畈还苁裁礃拥恼Z(yǔ)言,只要支持面向?qū)ο?,?shí)際上是利用了面向?qū)ο蠡舅枷耄渲?,最基本的概念有以下幾個(gè):1:對(duì)象(Object)。對(duì)象構(gòu)成客觀世界的一個(gè)個(gè)實(shí)體,從最簡(jiǎn)單的字符串到復(fù)雜的軟件系統(tǒng)等,均可看作對(duì)象,廣義上,對(duì)象不僅能表示具體的實(shí)體,還能表示抽象的規(guī)則或事件等。對(duì)象具有兩個(gè)方面的特點(diǎn):能夠保存一定的狀態(tài),由“屬性(attribute)”來(lái)表達(dá);能執(zhí)行一定的動(dòng)作,“方法(method)”來(lái)表達(dá)。2:類(class)。類是用于描述同一類型的對(duì)象的一個(gè)抽象的概念,類中定義了這一類對(duì)象所應(yīng)具有的屬性和方法。多個(gè)對(duì)象的抽象成為類,類的具體化就是對(duì)象,通常的說(shuō)法,創(chuàng)建一個(gè)對(duì)象實(shí)際上就是將類實(shí)例化。3:消息和方法。消息是指對(duì)象之間進(jìn)行通信的數(shù)據(jù)或者數(shù)據(jù)結(jié)構(gòu)。在通信的過(guò)程中,一個(gè)消息發(fā)送給某個(gè)對(duì)象,實(shí)際上相當(dāng)于調(diào)用另一個(gè)對(duì)象的方法,消息可以是這個(gè)方法的參數(shù)。第6頁(yè),共31頁(yè),2024年2月25日,星期天4:繼承(Inheritance)。繼承性是指子類自動(dòng)共享父類屬性和方法的機(jī)制。繼承的思想來(lái)源于:在定義和實(shí)現(xiàn)一個(gè)新的類時(shí),可以將一個(gè)已經(jīng)存在的類作為父類,新類的定義在這個(gè)父類的基礎(chǔ)之上進(jìn)行,把這個(gè)父類中的屬性和方法作為自己的屬性和方法,并可加入若干新的屬性和方法。繼承性是面向?qū)ο蟪绦蛟O(shè)計(jì)語(yǔ)言不同于其它語(yǔ)言的重要特點(diǎn),是其他語(yǔ)言所沒(méi)有的。在類的繼承中,如果子類只繼承一個(gè)父類的屬性和方法,稱為單重繼承;如果子類繼承了多個(gè)父類的屬性和方法,稱為多重繼承。有些語(yǔ)言(如C++)支持多重繼承,有些語(yǔ)言(如Java)不支持多重繼承。在軟件開發(fā)的過(guò)程中,類和類之間的繼承,對(duì)于信息的組織與分類,非常有用,它簡(jiǎn)化了對(duì)象、類的創(chuàng)建,增加了代碼的可用重性,使建立的軟件具有良好的可擴(kuò)充性和可維護(hù)性。第7頁(yè),共31頁(yè),2024年2月25日,星期天5:多態(tài)(Polymorphism)。多態(tài),是指不同類型對(duì)象,收到同一消息(調(diào)用同一個(gè)函數(shù)等),根據(jù)其類型,可以產(chǎn)生不同的結(jié)果。在面向?qū)ο笳Z(yǔ)言中,一般具有兩種形式的多態(tài):靜態(tài)多態(tài),一般指函數(shù)重載;動(dòng)態(tài)多態(tài),一般利用繼承和函數(shù)覆蓋。有了多態(tài)性,不同對(duì)象可以以適合自身的方式,去響應(yīng)相同的消息,增強(qiáng)了軟件的可擴(kuò)展性和和重用性。6:封裝(Encapsulation)。封裝,保證了軟件的每個(gè)組成部分具有優(yōu)良的模塊性,通過(guò)定義外部接口使模塊之間的耦合性達(dá)到最小。在面向?qū)ο蟮恼Z(yǔ)言中,對(duì)象是封裝的最基本單位,增加了程序結(jié)構(gòu)的清晰性,防止了程序相互依賴性而帶來(lái)的變動(dòng)影響。第8頁(yè),共31頁(yè),2024年2月25日,星期天7.2對(duì)象內(nèi)存分配與釋放第9頁(yè),共31頁(yè),2024年2月25日,星期天7.2.1對(duì)象分配內(nèi)存對(duì)象分配內(nèi)存,一般叫做對(duì)象的實(shí)例化。在分配內(nèi)存之前,必須已經(jīng)編寫了一個(gè)類。假設(shè)有以下類:如Java語(yǔ)言中,聲明一個(gè)對(duì)象的語(yǔ)法是:但是,對(duì)象是引用數(shù)據(jù)類型,定義一個(gè)對(duì)象引用,相當(dāng)于聲明一個(gè)對(duì)象,聲明不同于創(chuàng)建,聲明對(duì)象,只分配了存儲(chǔ)地址的存儲(chǔ)器位置,還沒(méi)有為其分配內(nèi)存。只是在內(nèi)存中定義了一個(gè)名字叫做cus的引用,類似于C++中的指針,此時(shí)指向空(null)值,或者說(shuō)引用為空。Customercus; classCustomer{ privateStringaccount; privateStringpassword; privateStringcname;} 第10頁(yè),共31頁(yè),2024年2月25日,星期天一般情況下,調(diào)用new方法才能創(chuàng)建一個(gè)對(duì)象。如果聲明的對(duì)象引用不指向任何對(duì)象,這樣的引用為“空引用(nullreference或nullpointer)”;如果聲明的對(duì)象引用存儲(chǔ)了一個(gè)實(shí)際對(duì)象的地址,則稱“引用指向一個(gè)對(duì)象”。給對(duì)象分配內(nèi)存也稱為實(shí)例化對(duì)象,在Java中可以用以下方式來(lái)進(jìn)行:這樣,就為對(duì)象分配了內(nèi)存。在內(nèi)存里面,其基本結(jié)構(gòu)如下:cus里面存儲(chǔ)了實(shí)際對(duì)象的地址,可以通過(guò)cus來(lái)訪問(wèn)各個(gè)成員。因此,在為對(duì)象分配內(nèi)存時(shí),一定要注意引用是否為null。Customercus=newCustomer(); 第11頁(yè),共31頁(yè),2024年2月25日,星期天7.2.2對(duì)象內(nèi)存釋放對(duì)象的生成比較簡(jiǎn)單,涉及的安全考慮也不多;與此相對(duì)應(yīng),對(duì)象的內(nèi)存也有釋放的過(guò)程,但是和生成相比,它與系統(tǒng)安全性的關(guān)系更大一些?,F(xiàn)在以C++為例,來(lái)闡述對(duì)象在內(nèi)存中的存儲(chǔ)和釋放情況。對(duì)象通常存放在三個(gè)內(nèi)存區(qū)域:1:全局/靜態(tài)數(shù)據(jù)區(qū):主要存放全局對(duì)象和靜態(tài)對(duì)象,在該內(nèi)存區(qū)的對(duì)象或成員,直到進(jìn)程結(jié)束,才會(huì)釋放內(nèi)存。2:堆:存在于堆中的數(shù)據(jù),分配內(nèi)存的方法一般是:new/malloc,釋放內(nèi)存的方法是:delete/free。對(duì)于這種對(duì)象,我們可以進(jìn)行創(chuàng)建和銷毀進(jìn)行精確控制。堆對(duì)象在c++中的使用非常廣泛,也得到了廣泛的應(yīng)用,不過(guò),用這種方法分配或釋放內(nèi)存,也有一些缺點(diǎn):需要程序員手工管理其創(chuàng)建和釋放,如果忘記釋放的話,可能會(huì)造成內(nèi)存泄露;在時(shí)間效率和空間效率上,堆對(duì)象的沒(méi)有棧對(duì)象高;在程序中,如果頻繁使用new來(lái)創(chuàng)建堆對(duì)象或者用delete來(lái)釋放堆對(duì)象,會(huì)造成大量的內(nèi)存碎片,內(nèi)存得不到充分的使用。3:棧:棧中一般保存的是局部對(duì)象或者局部變量,使用棧對(duì)象效率較高,程序員無(wú)需對(duì)其生存周期進(jìn)行管理。第12頁(yè),共31頁(yè),2024年2月25日,星期天C++中,和對(duì)象釋放內(nèi)存相關(guān)的,一般是析構(gòu)函數(shù)。析構(gòu)函數(shù)的作用是釋放對(duì)象申請(qǐng)的資源。如代碼Customer.cpp。生成exe文件,運(yùn)行,效果為:提示析構(gòu)函數(shù)的調(diào)用中,cus1是一個(gè)指針,必須經(jīng)過(guò)delete才能讓其調(diào)用;而另一種情況下,對(duì)象生命周期結(jié)束時(shí)即可調(diào)用。第13頁(yè),共31頁(yè),2024年2月25日,星期天因此,析構(gòu)函數(shù)通常由系統(tǒng)自動(dòng)調(diào)用,在以下幾種情況下系統(tǒng)會(huì)調(diào)用析構(gòu)函數(shù):全局對(duì)象在進(jìn)程結(jié)束時(shí);堆中對(duì)象進(jìn)行delete/free操作時(shí);棧中對(duì)象生命周期結(jié)束時(shí):包括離開作用域、函數(shù)正常正常跳出或者拋出異常等。在使用析構(gòu)函數(shù)時(shí),可以充分利用它的性質(zhì)進(jìn)行一些操作,特別對(duì)于棧中對(duì)象,由于析構(gòu)函數(shù)調(diào)用是由系統(tǒng)自動(dòng)完成的,所以可以利用這一特性,將一些需要隨著對(duì)象銷毀而必須釋放的資源封裝在析構(gòu)函數(shù)里由系統(tǒng)自動(dòng)完成銷毀或釋放,這些工作的典型案例如:某些資源的釋放;多線程解鎖;關(guān)閉文件;等等。這樣,利用棧對(duì)象的這一特性進(jìn)行自動(dòng)管理,可以避免由于編程時(shí)的遺漏而忘記進(jìn)行某種操作。第14頁(yè),共31頁(yè),2024年2月25日,星期天這樣,利用棧對(duì)象的這一特性進(jìn)行自動(dòng)管理,可以避免由于編程時(shí)的遺漏而忘記進(jìn)行某種操作。在Java語(yǔ)言中,對(duì)象的釋放相對(duì)簡(jiǎn)單一些。許多方面,Java類似于C++。但是,Java去除了析構(gòu)函數(shù),取而代之的是:finalize()方法。finalize()與C++析構(gòu)函數(shù)有什么區(qū)別呢?實(shí)際上,finalize()是Java為所有類定義的一個(gè)特殊的方法,它提供了類似于C++析構(gòu)函數(shù)的一些功能。但是,finalize()與C++的析構(gòu)函數(shù)并不完全一樣,finalize()方法的調(diào)用并不是在對(duì)象的作用域結(jié)束之后馬上進(jìn)行,而是與Java的垃圾回收器緊密相關(guān)。

提示:Java語(yǔ)言中,創(chuàng)建一個(gè)對(duì)象時(shí),Java虛擬機(jī)(JVM)為該對(duì)象分配內(nèi)存、調(diào)用構(gòu)造函數(shù)并可使用該對(duì)象。當(dāng)程序發(fā)現(xiàn)對(duì)于某個(gè)對(duì)象沒(méi)有有效的引用時(shí),JVM通過(guò)垃圾回收器將該對(duì)象標(biāo)記為釋放狀態(tài)。垃圾回收器要將一個(gè)對(duì)象的內(nèi)存進(jìn)行釋放時(shí),才自動(dòng)調(diào)用該對(duì)象的finalize()方法。第15頁(yè),共31頁(yè),2024年2月25日,星期天當(dāng)Java虛擬機(jī)已確定尚未終止的任何線程無(wú)法再通過(guò)任何方法訪問(wèn)此對(duì)象時(shí),由對(duì)象的垃圾回收器調(diào)用此方法。對(duì)于任何給定對(duì)象,Java虛擬機(jī)最多只調(diào)用一次finalize()方法。finalize()定義于java.lang.Object中,finalize()方法可以被任何類重寫,并完成類似析構(gòu)函數(shù)的功能,以配置系統(tǒng)資源或執(zhí)行其他清除。不過(guò),事實(shí)上,你可以調(diào)用System.gc()方法強(qiáng)制垃圾回收器來(lái)釋放這些對(duì)象的內(nèi)存。如代碼P07_01.java。注意,因?yàn)槔厥展ぷ骺赡芫哂幸欢ǖ难舆t,而手工用System.gc()來(lái)進(jìn)行強(qiáng)制垃圾回收又可能被忘記,因?yàn)?,很多代碼因?yàn)樵谶@個(gè)問(wèn)題上忽略了,造成了安全隱患。如代碼P07_02.java。運(yùn)行該代碼,沒(méi)有任何的反應(yīng)。垃圾回收機(jī)制也無(wú)法調(diào)用MyObject的finalize()方法。雖然此時(shí)所有的obj都被置空,但是它們沒(méi)有被釋放,因?yàn)樽兞縜l引用了這些對(duì)象。所以,在使用這類功能時(shí)要特別小心。除非將代碼改為P07_02.java。第16頁(yè),共31頁(yè),2024年2月25日,星期天綜上所述,Java的垃圾回收機(jī)制確實(shí)可以減小程序員的工作量,對(duì)于Java回收機(jī)制,可以遵循以下準(zhǔn)則:在不使用某對(duì)象時(shí),顯式地將此對(duì)象賦空,等待垃圾回收;遵循誰(shuí)創(chuàng)建誰(shuí)釋放的原則,讓程序更有條理;可以在合適的場(chǎng)景下使用對(duì)象池技術(shù)以提高系統(tǒng)性能;盡量避免強(qiáng)制系統(tǒng)做垃圾內(nèi)存的回收,增長(zhǎng)系統(tǒng)做垃圾回收的最終時(shí)間;必要時(shí)候,可以調(diào)用System.gc()方法強(qiáng)制垃圾回收。不過(guò),根據(jù)Java語(yǔ)言規(guī)范定義,不同的JVM實(shí)現(xiàn)者可能使用不同的算法管理垃圾收集器,System.gc()函數(shù)不保證JVM的垃圾收集器一定會(huì)馬上執(zhí)行。但通常來(lái)說(shuō),除非在一些特定的場(chǎng)合,如實(shí)時(shí)系統(tǒng),用戶不希望垃圾收集器突然中斷應(yīng)用程序執(zhí)行而進(jìn)行垃圾回收,垃圾收集器的執(zhí)行影響應(yīng)用程序的性能,此時(shí)我們可以調(diào)整垃圾收集器的參數(shù),讓垃圾收集器能夠通過(guò)平緩的方式釋放內(nèi)存。第17頁(yè),共31頁(yè),2024年2月25日,星期天7.2.3對(duì)象線程安全在很多情況下,對(duì)象可能在多線程的環(huán)境下運(yùn)行。一個(gè)對(duì)象在其生命周期內(nèi)可以被多個(gè)線程訪問(wèn),實(shí)際上是多線程通信的一種方式,此種情況就會(huì)出現(xiàn)多種問(wèn)題,其中最重要的就是多線環(huán)境下對(duì)象的狀態(tài)安全訪問(wèn)以及修改。實(shí)際上,很多系統(tǒng)軟件(如服務(wù)器)已經(jīng)在底層實(shí)現(xiàn)了線程安全,因此,隱患主要來(lái)源于:程序員不知道該組件對(duì)象使用線程來(lái)實(shí)現(xiàn),錯(cuò)誤地將一些用非線程機(jī)制情況下的風(fēng)格用進(jìn)去。第18頁(yè),共31頁(yè),2024年2月25日,星期天關(guān)于對(duì)象線程安全,有兩個(gè)方面的問(wèn)題:1:很多框架下都提供了對(duì)象被多個(gè)線程訪問(wèn)的機(jī)制當(dāng)對(duì)象可能被多個(gè)線程來(lái)運(yùn)行時(shí),千萬(wàn)不能在對(duì)象中保存和某個(gè)線程相關(guān)的狀態(tài)。例如:JavaEE中的Servlet,其運(yùn)行模型為:每一個(gè)請(qǐng)求實(shí)際上就是一個(gè)線程,來(lái)運(yùn)行Servlet的某些函數(shù),此時(shí),Servlet中就不宜保存相應(yīng)的狀態(tài)數(shù)據(jù)。2:當(dāng)對(duì)象的可能被多個(gè)線程來(lái)進(jìn)行操作時(shí),應(yīng)該考慮同步問(wèn)題。該問(wèn)題在前面的章節(jié)有所講解,在此省略。第19頁(yè),共31頁(yè),2024年2月25日,星期天7.2.4對(duì)象序列化安全對(duì)象序列化是面向?qū)ο笳Z(yǔ)言中的重要特性之一,在Java系列和.net系列中,都可以使用一定的手段實(shí)現(xiàn)對(duì)象序列化。一般情況下,對(duì)象具有一定的生命周期,隨著生成該對(duì)象的程序作用域結(jié)束而結(jié)束。但是,有時(shí)候,程序可能需要將對(duì)象的狀態(tài)保存下來(lái),或者寫入文件,或者寫入數(shù)據(jù)傳輸流,在需要時(shí)再將對(duì)象讀入之后進(jìn)行恢復(fù),這里面就需要序列化的工作。對(duì)象序列化,就是將對(duì)象的狀態(tài)轉(zhuǎn)換成字節(jié)流(當(dāng)然也可能是字節(jié)流以上的一些包裝流),在使用的時(shí)候,可以通過(guò)讀取流中的內(nèi)容,生成相同狀態(tài)的對(duì)象。序列化(Serialization)過(guò)程的工作一般是:對(duì)象將描述自己狀態(tài)的數(shù)據(jù)寫出到流中,描述自己狀態(tài)的數(shù)據(jù),一般是成員變量,因此,序列化的主要任務(wù)是寫出對(duì)象成員變量的數(shù)值。特殊情況下,如果對(duì)象中,某個(gè)成員變量是另一對(duì)象的引用,則被引用的對(duì)象也要序列化,因此,序列化工作是遞歸的。第20頁(yè),共31頁(yè),2024年2月25日,星期天在很多應(yīng)用中,對(duì)象序列化具有很重要的作用。如數(shù)據(jù)傳輸軟件中,傳輸?shù)臄?shù)據(jù)一般是一個(gè)對(duì)象,這種情況下,該對(duì)象應(yīng)該具備寫入流中的能力,也就是說(shuō)需要被序列化;另外一些情況下,可能需要將對(duì)象寫入持久化存儲(chǔ)(如數(shù)據(jù)庫(kù)和文件),也需要進(jìn)行對(duì)象的序列化。以Java為例,將對(duì)象序列化的方法很簡(jiǎn)單,滿足兩個(gè)條件即可:將該對(duì)象對(duì)應(yīng)的類實(shí)現(xiàn)Serializable接口;該對(duì)象的被序列化成員必須是非靜態(tài)成員變量;其他語(yǔ)言中,序列化過(guò)程類似。不過(guò),對(duì)象序列化只能保存成員變量的值,其他內(nèi)容,如成員函數(shù)、修飾符等,都不能保存。第21頁(yè),共31頁(yè),2024年2月25日,星期天對(duì)象序列化有什么安全問(wèn)題呢?由于對(duì)象序列化之后要在網(wǎng)上傳輸,或者寫入數(shù)據(jù)流,因此,需要關(guān)心的問(wèn)題一般是信息泄密問(wèn)題。對(duì)象被序列化時(shí),使用字節(jié)數(shù)組表示,并且加上了很多控制標(biāo)記,在一定程度上阻止了對(duì)象成員直接被攻擊者識(shí)別。但是還是不能完全阻止對(duì)象內(nèi)容的泄密,對(duì)保存的對(duì)象稍加分析,則可獲取需要的信息。所以,在序列化時(shí),一定要注意不能讓敏感信息(如卡號(hào)密碼)泄密。第22頁(yè),共31頁(yè),2024年2月25日,星期天解決該問(wèn)題的方法有兩種:1:在將對(duì)象實(shí)現(xiàn)序列化時(shí),進(jìn)行一些處理,如加密。該類方法我們將在后面的章節(jié)中詳細(xì)敘述。2:不要將敏感信息序列化??梢酝ㄟ^(guò)一些手段,不將某些成員序列化。如在Java中,可以在成員前面加上transient關(guān)鍵字,在序列化時(shí),系統(tǒng)將會(huì)回避這些字段。第23頁(yè),共31頁(yè),2024年2月25日,星期天提示:實(shí)際上,不將某些信息序列化,還有其他的一些作用,如:網(wǎng)絡(luò)之間傳遞信息時(shí),可以避免一些占用大量字節(jié)數(shù)的對(duì)象進(jìn)行傳輸,減輕網(wǎng)絡(luò)壓力;在對(duì)象中可能有一些成員不是簡(jiǎn)單的變量,而是引用類型,但是這些成員引用沒(méi)有實(shí)現(xiàn)序列化接口,一般情況下會(huì)出現(xiàn)異常,為了避免這種異常,可以將這些成員設(shè)置為“不序列化”的。第24頁(yè),共31頁(yè),2024年2月25日,星期天7.3靜態(tài)成員安全第25頁(yè),共31頁(yè),2024年2月25日,星期天7.3.1靜態(tài)成員的機(jī)理在類中,數(shù)據(jù)成員可以分靜態(tài)成員、非靜態(tài)成員兩種。類中的成員,通常情況下,必須通過(guò)它的類的對(duì)象訪問(wèn),但是可以創(chuàng)建這樣一個(gè)成員,使它的使用完全獨(dú)立于該類的任何對(duì)象,被類的所有對(duì)象共用。在成員的聲明前面加上關(guān)鍵字static(靜態(tài))就能創(chuàng)建這樣的成員,這種成員叫做靜態(tài)成員。如果一個(gè)成員變量被聲明為static,就是靜態(tài)變量,如果一個(gè)成員方法被聲明為static,就是靜態(tài)方法,它們就能夠在它的類的任何對(duì)象創(chuàng)建之前被訪問(wèn),而不必引用任何對(duì)象。靜態(tài)成員變量存儲(chǔ)在全局?jǐn)?shù)據(jù)區(qū),為該類的所有對(duì)象共享,不屬于任何對(duì)象的存儲(chǔ)空間,邏輯上所有對(duì)象都共享這一存儲(chǔ)單元,對(duì)靜態(tài)成員變量的任何的任何操作影響這一存儲(chǔ)單元的所有對(duì)象。第26頁(yè),共31頁(yè),2024年2月25日,星期天如下代碼:調(diào)用:

Customercus1=newCustomer();Customercus2=newCustomer(); classCustomer{privateStringaccount;privateStringpassword;privateStringcname;publicstaticStringbankName;} 第27頁(yè),共31頁(yè),2024年2

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論