ο? alt=)
面向過程和面向?qū)ο蟮膮^(qū)別面向過程主要關(guān)注的是實(shí)現(xiàn)的具體的過程因果關(guān)系優(yōu)點(diǎn)對于業(yè)務(wù)邏輯比較簡單的程序可以達(dá)到快速開發(fā)前期投入成本較低缺點(diǎn)采用面向過程的方式開發(fā)很難解決非常復(fù)雜的業(yè)務(wù)邏輯而且也很難關(guān)注到每個(gè)點(diǎn)的細(xì)節(jié)軟件耦合度高軟件拓展力差組件代碼復(fù)用性差面向?qū)ο笾饕P(guān)注的是對象【獨(dú)立體】的能完成那些功能。優(yōu)點(diǎn)耦合度低擴(kuò)展力強(qiáng)。組件復(fù)用性強(qiáng)缺點(diǎn)前期投入成本高需要進(jìn)行獨(dú)立抽象大量的系統(tǒng)分析和設(shè)計(jì)。面向?qū)ο蟮娜齻€(gè)生命周期OOA - 面向?qū)ο蠓治鯫OD - 面向?qū)ο笤O(shè)計(jì)OOP - 面向?qū)ο缶幊填惻c對象要想使用OOP一定要清楚對象的三個(gè)主要特性:對象的行為(behavior): 可以對對象施加哪些操作或可以對對象施加哪些方法?對象的狀態(tài)(state): 當(dāng)施加那些方法時(shí)對象如何響應(yīng)?對象標(biāo)識(identity)如何辨別具有相同行為與狀態(tài)的不同對象?對象的狀態(tài)改變不是自發(fā)的必須通過調(diào)用方法來改變。如果是自發(fā)改變只能說明封裝遭到了破壞。作為一個(gè)類的實(shí)例每個(gè)對象的標(biāo)識永遠(yuǎn)是不同的狀態(tài)常常也存在著差異。類的定義類是對一個(gè)集合的抽象、是對事物分析結(jié)構(gòu)后抽象出來的模板。現(xiàn)實(shí)世界中事物A和事物B之間具有共同的特征進(jìn)行抽象總結(jié)出的一個(gè)模板這個(gè)模板被稱為類。語法結(jié)構(gòu)[修飾符列表] class 類名{ //屬性(對事物狀態(tài)信息的抽象) 屬性的類型為java所有的數(shù)據(jù)類型 [屬性修飾符] 數(shù)據(jù)類型 變量名; //這里也可以直接賦值初始化 //方法 [屬性修飾符] 返回值類型 方法名(參數(shù)列表){ //方法體 } }java中所有的類都是引用類型識別類的簡單規(guī)則是在分析問題的過程中尋找名詞而方法對應(yīng)著動(dòng)詞。例如在訂單處理系統(tǒng)中有這樣一些名詞:商品(Item)訂單(Order)送貨地址(Shipping address )付款(Payment)賬戶(Account)這些名詞很可能成為類Item、Order等。接下來查看動(dòng)詞:商品被添加到訂單中訂單被發(fā)送或取消訂單貨款被支付。對于每一個(gè)動(dòng)詞如:“添加”、“發(fā)送”、“取消”以及“支付”都要標(biāo)識出主要負(fù)責(zé)完成相應(yīng)動(dòng)作的對象。例如當(dāng)一個(gè)新的商品添加到訂單中時(shí)那個(gè)訂單對象就是被指定的對象因?yàn)樗廊绾未鎯?chǔ)商品以及如何對商品進(jìn)行排序。也就是說add應(yīng)該是Order類的一個(gè)方法而Item對象是一個(gè)參數(shù)。對象對象是實(shí)際存在的個(gè)體是從類中創(chuàng)建出來的實(shí)例。類與對象的關(guān)系類-----實(shí)例化------對象對象又被稱類的為實(shí)例instance對象—抽象----類類描述的是對象的共同特征這些特征包括類的狀態(tài)—對事物**狀態(tài)信息(啥樣子)的抽象—類的屬性類的動(dòng)作信息—對事物能力能干啥**的抽象 —一個(gè)類的方法不同對象對應(yīng)的狀態(tài)的數(shù)值和動(dòng)作的結(jié)果是可能不一樣的對象的創(chuàng)建和使用靜態(tài)變量可以通過類直接訪問, 用static 修飾存儲(chǔ)在方法區(qū)內(nèi)存當(dāng)中。實(shí)例變量成員變量、域不能通過類直接訪問的類的變量不創(chuàng)建對象這個(gè)實(shí)例變量在JVM中堆內(nèi)存中不會(huì)在內(nèi)存中分配區(qū)域。如果沒有手動(dòng)賦值系統(tǒng)賦默認(rèn)值。數(shù)據(jù)類型 默認(rèn)值--------------------------------------------byte,short,int,long0double,float0.0booleanfalsechar\u0000 引用數(shù)據(jù)類型null(空值)對象的創(chuàng)建一個(gè)類可以實(shí)例化N個(gè)對象實(shí)例化是通過new關(guān)鍵字去創(chuàng)建的,語法為:引用數(shù)據(jù)類型 變量名new方法名(實(shí)參數(shù)列表...);//這里的這個(gè)變量名 稱之為對象的引用所以叫做對象引用變量。 方法名成和類名一致。方法區(qū): 字節(jié)碼文件class文件在類加載時(shí)候?qū)⑵浞旁趦?nèi)存的方法區(qū)當(dāng)中只存一份棧區(qū)方法代碼執(zhí)行的時(shí)候會(huì)給該方法分配內(nèi)存空間在??臻g壓棧。主要用來存儲(chǔ)方法的局部變量。堆區(qū)new對象在堆內(nèi)存中存儲(chǔ)。new操作符的返回值也是一個(gè)引用。下列語句:Date deadline new Date();有兩個(gè)部分。表達(dá)式new Date()構(gòu)造了一個(gè)Date類型的對象并且它的值是對新創(chuàng)建對象的引用這個(gè)引用存儲(chǔ)在變量deadline中。局部變量不會(huì)自動(dòng)地初始化為null而必須通過調(diào)用new或?qū)⑺鼈冊O(shè)置為null進(jìn)行初始化。代碼內(nèi)存分析1TestObj1.java里的代碼publicclassTestObj1{publicstaticvoidmain(String[]args){inti10;//i 局部變量//這里 s 是局部變量StudentsnewStudent();s.noi;//再次創(chuàng)建變量StudentstunewStudent();System.out.println(s.no);System.out.println(stu.no);}}Student.java里的代碼publicclassStudent{intno;intage;booleansex;Stringaddr;}內(nèi)存分析圖總結(jié)對象的實(shí)質(zhì)是通過new運(yùn)算符在堆內(nèi)存中開辟的內(nèi)存空間這塊內(nèi)存空間的地址邏輯地址賦給一個(gè)變量這個(gè)變量稱之為引用變量。類的成員變量實(shí)例變量隨著類被實(shí)例化后在堆內(nèi)存中對應(yīng)的實(shí)例對象中存儲(chǔ)。每個(gè)new出來的對象對應(yīng)內(nèi)存中的一份內(nèi)存。java語言中沒有指針程序員不能直接操作堆內(nèi)存。程序員只能通過“引用”去訪問堆內(nèi)存當(dāng)中的實(shí)例的變量。訪問變量格式去讀數(shù)據(jù)對象引用變量.對象變量名 修改數(shù)據(jù)對象引用變量.對象變量名 值;代碼內(nèi)存分析2TestObj2.java里的代碼publicclassTestObj2{publicstaticvoidmain(String[]args){//定義一個(gè)局部變量u數(shù)據(jù)類型為User的引用。UserunewUser();System.out.println(u.no);System.out.println(u.name);System.out.println(u.addr);u.no110;// jack是一個(gè)String對象u指向的對象(new出來的User的對象)的屬性name中存儲(chǔ)的是jack的內(nèi)存地址也就是說這個(gè)對象的name屬性也是個(gè)引用u.namejack;u.addrnewAddress();System.out.println(u.name居住在哪個(gè)城市u.addr.city);System.out.println(u.name居住在哪個(gè)街道u.addr.street);System.out.println(u.name郵編是u.addr.zipcode);u.addr.city北京;u.addr.street朝陽街道區(qū);u.addr.zipcode11111111;System.out.println(u.name居住在哪個(gè)城市u.addr.city);System.out.println(u.name居住在哪個(gè)街道u.addr.street);System.out.println(u.name郵編是u.addr.zipcode);Addressau.addr;a.city西安;System.out.println(u.addr.city);System.out.println(a.city);}}classUser{//類的屬性的類型可以為java的所有數(shù)據(jù)類型intno;//String 是一個(gè)對象引用類型Stringname;//這里表示這個(gè)User類的屬性name是一個(gè)String的引用。//addr 是一個(gè)Address對象的引用類型Addressaddr;//這里表示這個(gè)User類的屬性addr是一個(gè)Address的引用類型}classAddress{Stringcity;Stringstreet;Stringzipcode;}內(nèi)存分析圖JVM內(nèi)存總結(jié):jvm主要包括三塊內(nèi)存空間分別為堆空間棧空間方法區(qū)。堆和方法區(qū)空間都各存在一份而??臻g是一個(gè)線程一個(gè)??臻g。當(dāng)方法調(diào)用的時(shí)候該方法所需要的空間在??臻g內(nèi)存中分配稱為壓棧。方法執(zhí)行結(jié)束之后該方法所屬的內(nèi)存空間釋放稱之為彈棧。在棧空間主要存儲(chǔ)方法的局部變量。當(dāng)程序開始運(yùn)行時(shí)方法的代碼片段以及整個(gè)類代碼片段都會(huì)存儲(chǔ)到方法區(qū)當(dāng)中在類加載的時(shí)候這些代碼片段會(huì)載入。在程序執(zhí)行的過程中使用new運(yùn)算符創(chuàng)建的對象會(huì)存儲(chǔ)在堆內(nèi)存中主要存儲(chǔ)的是對象的實(shí)例變量。類的靜態(tài)變量存儲(chǔ)在方法區(qū)當(dāng)中。當(dāng)堆內(nèi)存中java對象沒有更多的引用指向它或者此對象無法訪問時(shí)會(huì)被垃圾回收器回收??罩羔槷惓?找迷L問“實(shí)例”相關(guān)的數(shù)據(jù)時(shí)候會(huì)發(fā)生空指針異常publicclassTestObj3{publicstaticvoidmain(String[]args){UserunewUser();System.out.println(u.no);//0unull;//會(huì)拋出異常: java.lang.NullPointerException//空引用訪問“實(shí)例”先關(guān)的數(shù)據(jù)時(shí)候會(huì)發(fā)生空指針異常System.out.println(u.no);//0}}總結(jié):對象使用new運(yùn)算符在堆內(nèi)存中開辟的內(nèi)存空間。引用是一個(gè)變量保存了指向堆內(nèi)存中的對象的內(nèi)存地址。創(chuàng)建一個(gè)對象沒有用變量接受稱之為匿名對象。如new Test().add()。匿名對象只能使用一次使用完后立即被銷毀。構(gòu)造方法構(gòu)造方法/構(gòu)造器/Constructor構(gòu)造方法語法結(jié)構(gòu)[修飾符列表]構(gòu)造方法名(形式參數(shù)列表){//方法體}使用細(xì)節(jié)構(gòu)造方法沒有返回值。構(gòu)造方法名稱和類名必須保持一致。當(dāng)我們在類中沒有寫構(gòu)造器使這種情況下,編譯器在編譯的時(shí)候會(huì)默認(rèn)加上一個(gè)無參且方法體為空的構(gòu)造方法。但是,如果類的構(gòu)造函數(shù)被重寫了(類中有有參構(gòu)造方法), 這時(shí)編譯器就不會(huì)再給它默認(rèn)加上一個(gè)無參且方法體為空的構(gòu)造函數(shù).可以理解為無參的構(gòu)造方法被覆蓋了。如果類中提供了至少一個(gè)構(gòu)造器但是沒有提供無參數(shù)的構(gòu)造器則在構(gòu)造對象時(shí)如果沒有提供參數(shù)就會(huì)被視為不合法。new無參構(gòu)造器創(chuàng)建對象會(huì)報(bào)錯(cuò)。建議開發(fā)中手動(dòng)為當(dāng)前類創(chuàng)建無參構(gòu)造方法因?yàn)闊o參構(gòu)造方法太常用了。構(gòu)造方法不能被static、final、synchronized、abstract和native修飾構(gòu)造方法支持重載機(jī)制。使用this(形參)可以調(diào)用其他構(gòu)造方法必須放在構(gòu)造方法第一行。構(gòu)造方法的作用初始化實(shí)例變量的內(nèi)存空間給實(shí)例變量賦值。publicclassAccount{//賬號privateStringaccount;//余額privatedoublebalance;publicAccount(){//無參構(gòu)造方法初始化實(shí)質(zhì)//account null;//balance 0.0;}publicAccount(Stringaccount){this.accountaccount;}publicAccount(Stringaccount,doublebalance){this.accountaccount;this.balancebalance;}}在執(zhí)行構(gòu)造器之前先執(zhí)行賦值操作。當(dāng)一個(gè)類的所有構(gòu)造器都希望把相同的值賦予某個(gè)特定的實(shí)例域時(shí)這種方式特別有用。初始化實(shí)例域時(shí)初始值不一定是常量值也有可能是一個(gè)代碼塊方法。this關(guān)鍵字this可以翻譯為“當(dāng)前對象”其實(shí)代表當(dāng)前正在執(zhí)行這個(gè)行為/動(dòng)作的對象。this的內(nèi)存分析this是一個(gè)引用是一個(gè)變量this變量中保存了內(nèi)存地址指向了自身對象this 存儲(chǔ)在JVM堆內(nèi)存對象內(nèi)部。每一個(gè)對象的內(nèi)存中都有this且不相同。為什么要使用this變量在代碼運(yùn)行時(shí)候當(dāng)某個(gè)對象執(zhí)行某個(gè)實(shí)例方法(執(zhí)行動(dòng)作)過程中想訪問當(dāng)前對象一些屬性或別的實(shí)例方法。我們一般采用的方式引用.xxx。但是這個(gè)引用在不同對象訪問這個(gè)實(shí)例方法必須代表對應(yīng)的對象(比如多態(tài))new 出來的對象無法滿足。 所以this關(guān)鍵字誕生了。所以this代表當(dāng)前正在執(zhí)行這個(gè)行為/動(dòng)作的對象。在每一個(gè)方法中使用this關(guān)鍵字接受隱式參數(shù)。this 是可以省略的, 什么時(shí)候不能省略用來區(qū)分局部變量和實(shí)例變量的時(shí)候“this.”不能省略。this可以用在哪里可以使用在實(shí)例方法當(dāng)中代表當(dāng)前對象【語法格式this.】可以使用在構(gòu)造方法當(dāng)中通過當(dāng)前的構(gòu)造方法調(diào)用其他構(gòu)造方法【語法格式this(實(shí)參)】this()只能出現(xiàn)在構(gòu)造函數(shù)第一行。publicclassThisTest2{publicstaticvoidmain(String[]args){ThisTest2.doSome();ThisTest2t2newThisTest2();t2.doSome();t2null;//帶有static的方法其實(shí)既可以采用類名方式訪問也可采用引用方式訪問。但是即使采用引用方式的訪問實(shí)際上執(zhí)行的時(shí)候//和引用指向的對象無關(guān)。t2.doSome();//這里不會(huì)出現(xiàn)空指針異常。}publicstaticvoiddoSome(){System.out.println(do some);}}