第六章、面向对象(oop)
目錄
一、面向?qū)ο蟾攀?/p>
二、設(shè)計(jì)對(duì)象并使用
1、類是什么?
2、如何創(chuàng)建類?
三、對(duì)象在內(nèi)存中的運(yùn)行機(jī)制
1、多個(gè)對(duì)象的內(nèi)存圖
?2、兩個(gè)變量指向同一個(gè)對(duì)象內(nèi)存圖
?補(bǔ)充:垃圾回收
四、模擬購(gòu)物車
五、構(gòu)造器
1、學(xué)習(xí)構(gòu)造器的目的
2、構(gòu)造器的基本知識(shí)
?3、構(gòu)造器的注意事項(xiàng)
六、this關(guān)鍵字
1、this關(guān)鍵字是什么
2、this關(guān)鍵字的作用
七、封裝
1、封裝的基本思想
2、如何更好的封裝
八、標(biāo)準(zhǔn)javaBean
?九、面向?qū)ο蠡A(chǔ)案例
案例過(guò)程解析:
十、 成員變量和局部變量的區(qū)別
一、面向?qū)ο蟾攀?/h1>
面向?qū)ο笮g(shù)語(yǔ):
OOA 面向?qū)ο蠓治?/p>
OOD 面向?qū)ο笤O(shè)計(jì)
OOP 面向?qū)ο缶幊?/p>
完成一個(gè)軟件的過(guò)程:分析、設(shè)計(jì)、編程。
PM 指項(xiàng)目經(jīng)理
什么是面向?qū)ο?#xff1f;
面向?qū)ο缶褪菍懗绦虻奶茁贰?/p>
面向可以理解為找、拿;對(duì)象可以理解為東西;面向?qū)ο缶幊?#xff1a;找\拿 東西過(guò)來(lái)編程。
為什么用面向編程?
面向?qū)ο缶幊膛c日常生活中解決問(wèn)題的方法相一致,例如掃地,必須先找一個(gè)掃把或者去某個(gè)地方,就必須找輛車,因此寫程序解決問(wèn)題同樣需要找一個(gè)"東西"來(lái)幫助我們實(shí)現(xiàn),這樣寫程序更符合人類的思維習(xí)慣,使編程更簡(jiǎn)單、更好理解。
面向?qū)ο髮W(xué)什么?
通過(guò)面向?qū)ο蟮恼Z(yǔ)法學(xué)會(huì)自己設(shè)計(jì)對(duì)象并使用。例如生活中要擰一顆螺絲就要設(shè)計(jì)一個(gè)螺絲刀來(lái)解決問(wèn)題。
二、設(shè)計(jì)對(duì)象并使用
1、類是什么?
例如日常生活中造房子就需要設(shè)計(jì)圖,通過(guò)設(shè)計(jì)圖來(lái)建造,而這個(gè)設(shè)計(jì)圖就相當(dāng)于是類。
是對(duì)象共同特征的描述。
對(duì)象:是真實(shí)存在的具體實(shí)例。 所以對(duì)象就是實(shí)例,實(shí)例就是對(duì)象。
因此,在java中必須先設(shè)計(jì)類,才能創(chuàng)建對(duì)象并使用。
2、如何創(chuàng)建類?
2、創(chuàng)建類注意事項(xiàng)
- 類名首字母建議大寫,滿足駝峰模式,不能使用關(guān)鍵字,必須是合法的標(biāo)識(shí)符
- 一個(gè)java文件中可以定義多個(gè)class類,但只能一個(gè)類是public修飾,而且public修飾的類名必須成為代碼文件名,建議一個(gè)代碼文件只定義一個(gè)類。
- 成員變量(屬性)的完整定義格式:修飾符 數(shù)據(jù)類型 變量名稱 = 初始化值;一般無(wú)需指定初始化值,存在默認(rèn)值。
修飾符? 數(shù)據(jù)類型 變量名稱 = 初始化值
public ?????? int ??????????? a ????? =?????? 0;
/* 初始化 默認(rèn)值規(guī)則 byte short int long 0 double float 0.0 boolean false String等引用類型 null*/三、對(duì)象在內(nèi)存中的運(yùn)行機(jī)制
1、多個(gè)對(duì)象的內(nèi)存圖
先將.class文件加載到方法區(qū),然后將main方法提到棧內(nèi)存中執(zhí)行,執(zhí)行第一句,將Car類的.class文件加載到方法區(qū),(等號(hào)左邊)定義了一個(gè)引用類型的變量c1作為對(duì)象名,是一個(gè)局部變量,因此,在棧內(nèi)存中的main方法內(nèi)分配一塊區(qū)域存儲(chǔ)Car 類型變量 c1,接著執(zhí)行等號(hào)右邊,在堆內(nèi)存中開(kāi)辟一塊內(nèi)存空間,代表一個(gè)Car對(duì)象,在對(duì)象中開(kāi)辟區(qū)域存放他相應(yīng)的屬性信息,并給他們附默認(rèn)值,由于對(duì)象的方法可能會(huì)很多,會(huì)極大占據(jù)堆內(nèi)存空間,因此在堆內(nèi)存中只會(huì)存放這些方法的地址(引用地址),通過(guò)這個(gè)地址去引用方法區(qū)的方法,這樣堆內(nèi)存中的對(duì)象就表示出來(lái)了。對(duì)象實(shí)際就是一塊內(nèi)存空間
?接著將這塊內(nèi)存空間的地址賦值給左邊的c1變量,由c1變量指向這個(gè)對(duì)象,因此c1中存放的就是對(duì)象在堆內(nèi)存中的地址,然后執(zhí)行第二行代碼,通過(guò)c1變量中的地址,找到這個(gè)對(duì)象,再將這個(gè)對(duì)象中的name成員變量改成 "奔馳" ,price成員變量改為 39.78,訪問(wèn)c1變量指向?qū)ο笾械膎ame和price,再執(zhí)行輸出語(yǔ)句,緊接著通過(guò)c1調(diào)用start()方法,調(diào)用方法的原理就是通過(guò)c1中存儲(chǔ)的地址找到這個(gè)對(duì)象,然后通過(guò)對(duì)象中的方法引用的地址找到start()方法,并將start()方法提取到棧內(nèi)存中執(zhí)行,由于這個(gè)start()方法知道是c1調(diào)用的,因此它自然會(huì)訪問(wèn)c1中的name信息和price信息,執(zhí)行start()方法,打印 "奔馳啟動(dòng)了",run()方法同理
?在創(chuàng)建一個(gè)新的對(duì)象名為c2,在棧內(nèi)存中的main方法內(nèi)分配一塊區(qū)域,在堆內(nèi)存中開(kāi)辟一塊區(qū)域代表一個(gè)對(duì)象,并在該區(qū)域內(nèi)開(kāi)辟空間存放其屬性信息,再將這個(gè)對(duì)象的地址賦給c2,通過(guò)c2中的地址找到這個(gè)對(duì)象,將這個(gè)對(duì)象中的name修改為 "寶馬" ,price修改為 "38.98",執(zhí)行輸出語(yǔ)句,再通過(guò)c2指向?qū)ο笾械姆椒ㄒ谜业絪tart()方法的地址,執(zhí)行這個(gè)方法。
?2、兩個(gè)變量指向同一個(gè)對(duì)象內(nèi)存圖
?先將.class文件提到方法區(qū),再將main方法加載到棧內(nèi)存,開(kāi)始執(zhí)行第一行代碼,將Student類的.class文件提到方法區(qū),在棧內(nèi)存中的main方法內(nèi)開(kāi)辟一塊區(qū)域存儲(chǔ)Student引用類型變量s1,并在堆內(nèi)存中的main方法內(nèi)分配一塊區(qū)域代表一個(gè)Student對(duì)象,在對(duì)象中開(kāi)辟區(qū)域存放其相應(yīng)的屬性信息,將對(duì)象在堆內(nèi)存中的地址賦給s1存儲(chǔ),通過(guò)s1中存儲(chǔ)的地址,找到其對(duì)應(yīng)的對(duì)象,修改他的屬性信息,最后通過(guò)對(duì)象中的方法引用找到study()方法并調(diào)用,(重點(diǎn))再在棧內(nèi)存中開(kāi)辟一塊區(qū)域存放變量s2,將s1中存儲(chǔ)的地址賦給s2,使s2也指向堆內(nèi)存中的對(duì)象,再通過(guò)s2變量修改其屬性值。
?補(bǔ)充:垃圾回收
當(dāng)堆內(nèi)存中的對(duì)象,沒(méi)有被任何變量引用(指向)時(shí),就會(huì)判定為內(nèi)存中的"垃圾",在java中有自動(dòng)垃圾回收器,會(huì)定期進(jìn)行清理。
java虛擬機(jī)提供了一個(gè)系統(tǒng)級(jí)的垃圾回收器線程,它負(fù)責(zé)自動(dòng)回收那些無(wú)用對(duì)象占用的內(nèi)存,這種內(nèi)存回收的過(guò)程稱為垃圾回收。
四、模擬購(gòu)物車
見(jiàn)案例補(bǔ)充購(gòu)物車的實(shí)現(xiàn)。
五、構(gòu)造器
1、學(xué)習(xí)構(gòu)造器的目的
- 真正知道對(duì)象具體是通過(guò)調(diào)用什么代碼得到的
- 能夠掌握為對(duì)象賦值的其他簡(jiǎn)便寫法
- 為以后學(xué)習(xí)面向?qū)ο缶幊痰钠渌麅?nèi)容做支撐
2、構(gòu)造器的基本知識(shí)
new出來(lái)的東西就相當(dāng)于一個(gè)構(gòu)造器
?3、構(gòu)造器的注意事項(xiàng)
- 任何類定義出來(lái),默認(rèn)就自帶了無(wú)參數(shù)構(gòu)造器,寫不寫都有。Car c = new Car()
- 一旦定義了有參數(shù)構(gòu)造器,那么無(wú)參數(shù)構(gòu)造器就沒(méi)有了,如果還想用無(wú)參數(shù)構(gòu)造器,此時(shí)就需要自己手寫一個(gè)無(wú)參數(shù)構(gòu)造器
六、this關(guān)鍵字
1、this關(guān)鍵字是什么
- this代表當(dāng)前對(duì)象的地址
- 具體用在在構(gòu)造器、方法中
這個(gè)this會(huì)輸出當(dāng)前對(duì)象的地址。
2、this關(guān)鍵字的作用
可以用于指定訪問(wèn)當(dāng)前對(duì)象的成員變量、成員方法。
- 當(dāng)this出現(xiàn)在有參數(shù)構(gòu)造器
?因此改進(jìn)的有參數(shù)構(gòu)造器為:
public class Car {String name;double price;//有參數(shù)構(gòu)造器//傳入?yún)?shù)見(jiàn)名知義public Car(String name , double price) {System.out.println("有參數(shù)構(gòu)造器被調(diào)用");//而如果這樣進(jìn)行傳參并不能為當(dāng)前對(duì)象的 name和price進(jìn)行賦值//因?yàn)樾螀⒔邮艿絺魅氲臄?shù)據(jù)會(huì)就近傳入給局部的形參name,不會(huì)賦給當(dāng)前對(duì)象的name//name = name;//price = price;//所以要通過(guò)this獲取當(dāng)前對(duì)象的屬性進(jìn)行賦值this.name = name;this.price = price;} }- 當(dāng)this出現(xiàn)在成員方法中的用法
?區(qū)分當(dāng)前對(duì)象的屬性和當(dāng)前的傳入?yún)?shù)。
七、封裝
1、封裝的基本思想
面向?qū)ο蟮娜筇匦?#xff1a;封裝、繼承、多態(tài)
封裝的基本思想:決定屬性和行為歸屬誰(shuí)的問(wèn)題。
封裝的作用: 告訴我們,如何正確設(shè)計(jì)對(duì)象的屬性和方法。
封裝的原則:對(duì)象代表什么,就得封裝對(duì)應(yīng)的數(shù)據(jù),并提供數(shù)據(jù)對(duì)應(yīng)的行為。
封裝思想舉例:
1、人畫圓
定義一個(gè)人對(duì)象、一個(gè)圓對(duì)象和一個(gè)畫圓方法,畫圓這個(gè)方法就要封裝在圓對(duì)象中,因?yàn)槿水媹A,這個(gè)圓是圓對(duì)象自己畫的,人只是調(diào)用圓對(duì)象中的畫圓方法。
2、人關(guān)門
?定義一個(gè)門對(duì)象、人對(duì)象和一個(gè)關(guān)門方法,關(guān)門方法就要封裝在門對(duì)象中,門是自己關(guān)的,因?yàn)槿酥皇钦{(diào)用了門對(duì)象中封裝的關(guān)門方法使門自己關(guān)上。
2、如何更好的封裝
public class Student {//類私有屬性 age 對(duì)外不能直接訪問(wèn)它private int age;public int getAge() {return age;}public void setAge(int age) {//設(shè)置年齡條件 0 - 200 歲if (age >= 0 && age <= 200) {this.age = age;}else {System.out.println("您輸入的年齡有誤");}} } public class Test {public static void main(String[] args) {Student s = new Student();//由于age被私有 所以要通過(guò)setter方法對(duì)age進(jìn)行賦值// s.age;s.setAge(23);//通過(guò)getter方法 獲取age值System.out.println(s.getAge());} }一般會(huì)把成員變量使用private隱藏起來(lái),對(duì)外就不能直接訪問(wèn)
提供public修飾的getter和setter方法暴露其取值和賦值
八、標(biāo)準(zhǔn)javaBean
javaBean也可以稱為實(shí)體類(在現(xiàn)實(shí)生活中有對(duì)應(yīng)個(gè)體),其對(duì)象可以用于在程序中封裝數(shù)據(jù)。
一個(gè)標(biāo)準(zhǔn)的javaBean須滿足如下書(shū)寫要求:
- 成員變量使用public修飾。
- 提供成員變量對(duì)應(yīng)的setXxx() / getXxx()方法。
- 必須提供一個(gè)無(wú)參構(gòu)造器;有參構(gòu)造器可寫可不寫。
?九、面向?qū)ο蠡A(chǔ)案例
public class MovieTest {public static void main(String[] args) {//1、設(shè)計(jì)電影類//2、創(chuàng)建三個(gè)電影對(duì)象,封裝電影信息//3、定義一個(gè)電影類型的數(shù)組存儲(chǔ)3部電影,簡(jiǎn)化寫法2、3Movie[] movies = new Movie[3];movies[0] = new Movie("《長(zhǎng)津湖》",9.5,"吳京");movies[1] = new Movie("《我和我的父輩》",9.0,"吳京");movies[2] = new Movie("《撲水少年》",8.0,"王川");for (int i = 0; i < movies.length; i++) {//將索引結(jié)果暫存在m中,再通過(guò)m調(diào)用方法獲取信息Movie m = movies[i];System.out.println("----------------------------");System.out.println("電影名:" + m.getName());System.out.println("評(píng)分:" + m.getScore());System.out.println("主演:" + m.getActor());System.out.println("----------------------------");}} } public class Movie {//電影類private String name;private Double score;private String actor;//alt + Ins public String getName() {return name;}public void setName(String name) {this.name = name;}public Double getScore() {return score;}public void setScore(Double score) {this.score = score;}public String getActor() {return actor;}public void setActor(String actor) {this.actor = actor;}public Movie() {//無(wú)參數(shù)構(gòu)造器}public Movie(String name, Double score, String actor) {//有參數(shù)構(gòu)造器this.name = name;this.score = score;this.actor = actor;} }案例過(guò)程解析:
?首先執(zhí)行main方法,將main方法提到棧內(nèi)存中,開(kāi)始執(zhí)行第一行代碼,在main方法中開(kāi)辟一塊區(qū)域給變量movies,并在堆內(nèi)存中開(kāi)辟一塊區(qū)域存放Movie類型的數(shù)組對(duì)象,將數(shù)組對(duì)象的地址賦給變量movies存儲(chǔ),使變量指向?qū)ο笤诙褍?nèi)存中的地址,再在堆內(nèi)存中依次創(chuàng)建三個(gè)新的對(duì)象,并將地址依次賦給數(shù)組對(duì)象中存儲(chǔ),使數(shù)組對(duì)象依次指向三個(gè)新對(duì)象
十、 成員變量和局部變量的區(qū)別
成員變量是類中的成員屬性,局部變量是方法中定義的變量,比如main方法。
public class Movie {//成員變量private String name;private Double score;private String actor; }總結(jié)
以上是生活随笔為你收集整理的第六章、面向对象(oop)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: pci-e串口卡linux 驱动下载,P
- 下一篇: 感谢蜂窝教育,四个月的学习,让我改变了