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