第六章、面向对象(oop)
目錄
一、面向對象概述
二、設計對象并使用
1、類是什么?
2、如何創建類?
三、對象在內存中的運行機制
1、多個對象的內存圖
?2、兩個變量指向同一個對象內存圖
?補充:垃圾回收
四、模擬購物車
五、構造器
1、學習構造器的目的
2、構造器的基本知識
?3、構造器的注意事項
六、this關鍵字
1、this關鍵字是什么
2、this關鍵字的作用
七、封裝
1、封裝的基本思想
2、如何更好的封裝
八、標準javaBean
?九、面向對象基礎案例
案例過程解析:
十、 成員變量和局部變量的區別
一、面向對象概述
面向對象術語:
OOA 面向對象分析
OOD 面向對象設計
OOP 面向對象編程
完成一個軟件的過程:分析、設計、編程。
PM 指項目經理
什么是面向對象?
面向對象就是寫程序的套路。
面向可以理解為找、拿;對象可以理解為東西;面向對象編程:找\拿 東西過來編程。
為什么用面向編程?
面向對象編程與日常生活中解決問題的方法相一致,例如掃地,必須先找一個掃把或者去某個地方,就必須找輛車,因此寫程序解決問題同樣需要找一個"東西"來幫助我們實現,這樣寫程序更符合人類的思維習慣,使編程更簡單、更好理解。
面向對象學什么?
通過面向對象的語法學會自己設計對象并使用。例如生活中要擰一顆螺絲就要設計一個螺絲刀來解決問題。
二、設計對象并使用
1、類是什么?
例如日常生活中造房子就需要設計圖,通過設計圖來建造,而這個設計圖就相當于是類。
是對象共同特征的描述。
對象:是真實存在的具體實例。 所以對象就是實例,實例就是對象。
因此,在java中必須先設計類,才能創建對象并使用。
2、如何創建類?
2、創建類注意事項
- 類名首字母建議大寫,滿足駝峰模式,不能使用關鍵字,必須是合法的標識符
- 一個java文件中可以定義多個class類,但只能一個類是public修飾,而且public修飾的類名必須成為代碼文件名,建議一個代碼文件只定義一個類。
- 成員變量(屬性)的完整定義格式:修飾符 數據類型 變量名稱 = 初始化值;一般無需指定初始化值,存在默認值。
修飾符? 數據類型 變量名稱 = 初始化值
public ?????? int ??????????? a ????? =?????? 0;
/* 初始化 默認值規則 byte short int long 0 double float 0.0 boolean false String等引用類型 null*/三、對象在內存中的運行機制
1、多個對象的內存圖
先將.class文件加載到方法區,然后將main方法提到棧內存中執行,執行第一句,將Car類的.class文件加載到方法區,(等號左邊)定義了一個引用類型的變量c1作為對象名,是一個局部變量,因此,在棧內存中的main方法內分配一塊區域存儲Car 類型變量 c1,接著執行等號右邊,在堆內存中開辟一塊內存空間,代表一個Car對象,在對象中開辟區域存放他相應的屬性信息,并給他們附默認值,由于對象的方法可能會很多,會極大占據堆內存空間,因此在堆內存中只會存放這些方法的地址(引用地址),通過這個地址去引用方法區的方法,這樣堆內存中的對象就表示出來了。對象實際就是一塊內存空間
?接著將這塊內存空間的地址賦值給左邊的c1變量,由c1變量指向這個對象,因此c1中存放的就是對象在堆內存中的地址,然后執行第二行代碼,通過c1變量中的地址,找到這個對象,再將這個對象中的name成員變量改成 "奔馳" ,price成員變量改為 39.78,訪問c1變量指向對象中的name和price,再執行輸出語句,緊接著通過c1調用start()方法,調用方法的原理就是通過c1中存儲的地址找到這個對象,然后通過對象中的方法引用的地址找到start()方法,并將start()方法提取到棧內存中執行,由于這個start()方法知道是c1調用的,因此它自然會訪問c1中的name信息和price信息,執行start()方法,打印 "奔馳啟動了",run()方法同理
?在創建一個新的對象名為c2,在棧內存中的main方法內分配一塊區域,在堆內存中開辟一塊區域代表一個對象,并在該區域內開辟空間存放其屬性信息,再將這個對象的地址賦給c2,通過c2中的地址找到這個對象,將這個對象中的name修改為 "寶馬" ,price修改為 "38.98",執行輸出語句,再通過c2指向對象中的方法引用找到start()方法的地址,執行這個方法。
?2、兩個變量指向同一個對象內存圖
?先將.class文件提到方法區,再將main方法加載到棧內存,開始執行第一行代碼,將Student類的.class文件提到方法區,在棧內存中的main方法內開辟一塊區域存儲Student引用類型變量s1,并在堆內存中的main方法內分配一塊區域代表一個Student對象,在對象中開辟區域存放其相應的屬性信息,將對象在堆內存中的地址賦給s1存儲,通過s1中存儲的地址,找到其對應的對象,修改他的屬性信息,最后通過對象中的方法引用找到study()方法并調用,(重點)再在棧內存中開辟一塊區域存放變量s2,將s1中存儲的地址賦給s2,使s2也指向堆內存中的對象,再通過s2變量修改其屬性值。
?補充:垃圾回收
當堆內存中的對象,沒有被任何變量引用(指向)時,就會判定為內存中的"垃圾",在java中有自動垃圾回收器,會定期進行清理。
java虛擬機提供了一個系統級的垃圾回收器線程,它負責自動回收那些無用對象占用的內存,這種內存回收的過程稱為垃圾回收。
四、模擬購物車
見案例補充購物車的實現。
五、構造器
1、學習構造器的目的
- 真正知道對象具體是通過調用什么代碼得到的
- 能夠掌握為對象賦值的其他簡便寫法
- 為以后學習面向對象編程的其他內容做支撐
2、構造器的基本知識
new出來的東西就相當于一個構造器
?3、構造器的注意事項
- 任何類定義出來,默認就自帶了無參數構造器,寫不寫都有。Car c = new Car()
- 一旦定義了有參數構造器,那么無參數構造器就沒有了,如果還想用無參數構造器,此時就需要自己手寫一個無參數構造器
六、this關鍵字
1、this關鍵字是什么
- this代表當前對象的地址
- 具體用在在構造器、方法中
這個this會輸出當前對象的地址。
2、this關鍵字的作用
可以用于指定訪問當前對象的成員變量、成員方法。
- 當this出現在有參數構造器
?因此改進的有參數構造器為:
public class Car {String name;double price;//有參數構造器//傳入參數見名知義public Car(String name , double price) {System.out.println("有參數構造器被調用");//而如果這樣進行傳參并不能為當前對象的 name和price進行賦值//因為形參接受到傳入的數據會就近傳入給局部的形參name,不會賦給當前對象的name//name = name;//price = price;//所以要通過this獲取當前對象的屬性進行賦值this.name = name;this.price = price;} }- 當this出現在成員方法中的用法
?區分當前對象的屬性和當前的傳入參數。
七、封裝
1、封裝的基本思想
面向對象的三大特性:封裝、繼承、多態
封裝的基本思想:決定屬性和行為歸屬誰的問題。
封裝的作用: 告訴我們,如何正確設計對象的屬性和方法。
封裝的原則:對象代表什么,就得封裝對應的數據,并提供數據對應的行為。
封裝思想舉例:
1、人畫圓
定義一個人對象、一個圓對象和一個畫圓方法,畫圓這個方法就要封裝在圓對象中,因為人畫圓,這個圓是圓對象自己畫的,人只是調用圓對象中的畫圓方法。
2、人關門
?定義一個門對象、人對象和一個關門方法,關門方法就要封裝在門對象中,門是自己關的,因為人只是調用了門對象中封裝的關門方法使門自己關上。
2、如何更好的封裝
public class Student {//類私有屬性 age 對外不能直接訪問它private int age;public int getAge() {return age;}public void setAge(int age) {//設置年齡條件 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被私有 所以要通過setter方法對age進行賦值// s.age;s.setAge(23);//通過getter方法 獲取age值System.out.println(s.getAge());} }一般會把成員變量使用private隱藏起來,對外就不能直接訪問
提供public修飾的getter和setter方法暴露其取值和賦值
八、標準javaBean
javaBean也可以稱為實體類(在現實生活中有對應個體),其對象可以用于在程序中封裝數據。
一個標準的javaBean須滿足如下書寫要求:
- 成員變量使用public修飾。
- 提供成員變量對應的setXxx() / getXxx()方法。
- 必須提供一個無參構造器;有參構造器可寫可不寫。
?九、面向對象基礎案例
public class MovieTest {public static void main(String[] args) {//1、設計電影類//2、創建三個電影對象,封裝電影信息//3、定義一個電影類型的數組存儲3部電影,簡化寫法2、3Movie[] movies = new Movie[3];movies[0] = new Movie("《長津湖》",9.5,"吳京");movies[1] = new Movie("《我和我的父輩》",9.0,"吳京");movies[2] = new Movie("《撲水少年》",8.0,"王川");for (int i = 0; i < movies.length; i++) {//將索引結果暫存在m中,再通過m調用方法獲取信息Movie m = movies[i];System.out.println("----------------------------");System.out.println("電影名:" + m.getName());System.out.println("評分:" + 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() {//無參數構造器}public Movie(String name, Double score, String actor) {//有參數構造器this.name = name;this.score = score;this.actor = actor;} }案例過程解析:
?首先執行main方法,將main方法提到棧內存中,開始執行第一行代碼,在main方法中開辟一塊區域給變量movies,并在堆內存中開辟一塊區域存放Movie類型的數組對象,將數組對象的地址賦給變量movies存儲,使變量指向對象在堆內存中的地址,再在堆內存中依次創建三個新的對象,并將地址依次賦給數組對象中存儲,使數組對象依次指向三個新對象
十、 成員變量和局部變量的區別
成員變量是類中的成員屬性,局部變量是方法中定義的變量,比如main方法。
public class Movie {//成員變量private String name;private Double score;private String actor; }總結
以上是生活随笔為你收集整理的第六章、面向对象(oop)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: pci-e串口卡linux 驱动下载,P
- 下一篇: 感谢蜂窝教育,四个月的学习,让我改变了