面向對象編程(OOP) 屬性+方法=類 面向過程 步驟清晰簡單, 第一步做什麼, 第二步做什麼... 適用於處理簡單的問題 面向對象 物以類聚和分類的思想模式 思考解決問題需要做出哪些分類, 然後對這些分類進行單獨思考和研究 最後,將分類下的細節進行了面向過程的研究 面向對象適用於複雜問題, 適合處 ...
面向對象編程(OOP)
屬性+方法=類
面向過程
- 步驟清晰簡單, 第一步做什麼, 第二步做什麼...
- 適用於處理簡單的問題
面向對象
- 物以類聚和分類的思想模式
- 思考解決問題需要做出哪些分類, 然後對這些分類進行單獨思考和研究
- 最後,將分類下的細節進行了面向過程的研究
- 面向對象適用於複雜問題, 適合處理多人協作的問題
區別
-
面向對象其實就是將一個大問題,將其分類發配,對分類後的問題進行面向過程的處理
-
如: 建一棟大廈, 需要分類, 建材採購; 外觀設計; 外圍建築; 室內設計...等等模塊, 最後構建成大廈, 而分類的問題就是面向過程的研究
-
對於複雜事物, 從巨集觀上、從整體上分析, 需要使用面向對象的思路來分析整個大系統(將大廈分類成建材採購; 外觀設計; 外圍建築; 室內設計...) 但是, 具體到微觀操作後, 需要使用面向過程的思想(具體建材採購; 外觀設計; 外圍建築; 室內設計...該如何執行)
-
面向過程是自己把每個方面步驟都寫一遍。面向對象是把別人寫的步驟作為基礎指令再編寫步驟實現更複雜的功能。
-
面向對象就是框架, 面向過程就是對象內的具體執行
什麼是面向對象
-
面向對象編程(Object-Oriented Programming, OOP)
-
本質: 以類的方式組織代碼, 以對象的組織封裝數據
-
抽象
-
三大特性
- 封裝: 一個存錢罐, 對外留一個小口取錢
- 繼承: 兒子會繼承父親的所有東西. 兒子有了父親的所有特性和東西
- 多態: 同樣是學習, 但你我學到的東西都是不同的(同一事物表現出的多種形態)
-
從認識論角度考慮是先有對象後有類
- 對象是具體事物; 類是抽象,對對象的抽象: (教師是一個抽象的類; 張老師就是一個具體的對象)
-
從代碼運行角度考慮是先有類後有對象(類其實用C語言來說類似結構體)
- 類是對象的模板(人民幣的屬性和模樣就是類, 而對象就是根據類創建一張一張5元,100元等)(人都是有名字,性別,年齡等屬性構成類即模板, 而具體的張三,男,22就是一個類的對象)
方法的回顧
- 修飾符: public static / public void等(static/void可不寫)
- 返回類型: 基本數據類型和數組
- **break和return區別: **
- **break是跳出switch和結束迴圈; **
- return是用於方法的結束, 方法內,return語句後都不無效
- 方法名: 駝峰規則和見名知意
- 參數列表: (參數類型 參數名); (int a) (int[] x)等
- 遞歸的return: 每次的return是返回到上次調用的方法的時候
方法的一些原則
-
遵循一個原則:被static修飾的內容會跟隨類的載入而載入,所以靜態化的內容可以不用實例化就直接調用,同時兩個靜態方法之間也可以互相調用
-
兩個非靜態可以互相調用是因為它們的類實例化後兩個一起被創建
-
非靜態方法都是在創建一個對象後產生的,所以它們互相知道存在
-
實際參數和形式參數的數據類型需要對應
參數的傳遞
-
值傳遞:複製一份;
-
引用傳遞:新建一個快捷方式(用的時候是同一個地址)/(本質是值傳遞)
-
值傳遞:實參和形參在記憶體上是獨立的兩個變數。
-
public class TestNum { public static void main(String[] args) { int num = 3; System.out.println("修改前的num值:"+num); changeValue(num); System.out.println("修改後的num值:"+num); } private static void changeValue(int num) { num = 5; System.out.println("形參num值:"+num); } } /* 字元串修改前:zhangsan 字元串修改後:zhangsan */
-
引用傳遞:實參和形參在記憶體上指向的是同一個地址
-
user是對象的引用,為實參,然後創建一個副本temp,把它傳遞給形參user1。但是,他們實際操作的都是堆記憶體中的同一個User對象。因此,對象內容的修改也會體現到實參user上。
-
類和對象的關係
類
-
類是一種抽象的數據類型, 它是對某一類事物的整體描述/定義, 但並不代表某一具體事物
- 動物、植物、手機、人...
- Person類、Animal類、Car類等, 這些類都是用於描述/定義某一類具體事物應具有的特點和行為
-
package ObjectDemo; //學生類 public class Students { //屬性:欄位 //String name = 小明; //可以這麼寫但沒用,學生是一個抽象概念,並不是所有學生叫小明 String name;// 未賦值,預設null int age;//未賦值,預設0 //方法 public void study() { System.out.println(this.name + "在學習"); //this代表當前這個類的name //this是實例本身,哪個實例調用,this就是哪個實例 } }
對象
-
對象是抽象類型的具體實例
- 張三就是人(類)的一個具體實例; 家裡的旺財就是狗(類)的一個具體實例
- 能夠體現出特點, 展現出功能是具體的實例, 而不是一個抽象概念
-
以下代碼就是根據上述類(模塊)的抽象概念, 進行實例化對象
-
package ObjectDemo; //一個程式應只有一個main方法 public class Application { public static void main(String[] args) { // 類是抽象的; 需要實例化 // 實例化後會返回一個對象; idea的功能,你按住alt+enter就行了 //stu_1就是對象的變數或者盒子, stu_1就是一個根據Students類的具體實例 //以下代碼產生了兩個個不同對象; 類可以產生很多對象(這些對象都有共同屬性, 如名字,年齡等) //根據學生類(模板)創建兩個具體的學生對象 Students stu_1 = new Students();//實例化變數stu_1(可以理解一個叫stu_1的空殼/地址(指針),但還未對其進行添加屬性,如還沒給stu_1軀體的姓名,年齡等) //stu_1對象添加屬性的賦值 stu_1.name = "WoOD"; stu_1.age = 18; System.out.println(stu_1.name); System.out.println(stu_1.age); System.out.println("============================="); Students xMing = new Students();//實例化變數xMing(可以理解一個叫xMing的空殼/地址(指針),但還未對其進行添加屬性,如還沒給xMing軀體的姓名,年齡等) //對象添加屬性的賦值 xMing.name = "小紅"; xMing.age = 17; System.out.println(xMing.name); System.out.println(xMing.age); } }
類是對象的抽象概念,對象是類的具體實例
- 上述代碼的實例化的stu_1和xMing可以理解為就是剛出世的嬰兒, 嬰兒剛出世沒有名字沒有年齡等, 但遇到嬰兒,我們本能都會叫其小寶寶等代號, 而stu_1就是代號(對象)而已
- 更可以理解為是類的抽象概念代號; 類的stu_1其實就是一個對象空殼(未添加屬性值的空殼/地址;), 我們是可以對這個空殼進行增加屬性值
- 換一種說法, 女盆友這個抽象概念, 當實例化對象時可以是未來女友、現女友、前女友、前前女友等對象(未來女友、現女友、前女友都是new出來的對象變數名,只是沒給""女友們"添加屬性值)(也可以理解寵物類, 貓、狗、熊貓等就是實例化的對象名,但未賦屬性值,就像貓貓的name還沒有叫咪咪)
- 對象名: 前女友、現女友等, 其實存放地址/指針而已, 就是這些對象名是會指向一個存放實體名字或年齡等屬性(名字或年齡如果我們沒有進行添加就是預設null) (想象成: 一個"女友"類, 根據"女友"類的模板創建了"前女友、現女友等"對象名, 而對象名(地址的變數名)就是存放/指向了name和age等屬性的地址)
- 當"現女友"的name=沈小婷,age=23, 就是對"現女友"這個對象添加了屬性值(記住預設值是null/0)
- 當 前女友 的name=白知憲,age=19, 就是對前女友這個對象添加了屬性值(記住預設值是null/0)
- 當"前前女友"的name=宋河英,age=25, 就是對"前前女友"這個對象添加了屬性值(記住預設值是null/0)
- "未來女友"這個對象, 由於我還沒有"未來女友", 所以我不知道, 但由於我根據類(模塊)創建了一個叫"未來女友"的對象, 因此當輸出"未來女友"這個對象的屬性name和age都會採用預設值null/0
- "未來女友"對象的name=李Luda, age=25(最近又被顏值吸引了)
創建與初始化對象
new
- 用new創建對象時, 除了分配記憶體空間之外, 還會給創建好的對象進行預設值初始化和類中構造器的調用
- 類種構造器也稱為構造方法, 是在進行創建對象的時候必須要調用的, 並且構造器有以下特點
- 必須和類名相同
- 必須沒有返回類型, 也不能寫void
- 構造器要掌握哦
構造器
- 一個類即使啥都沒寫也會生成一個構造器(記住在最右邊Application文件運行一次, 中間的class文件才有;不運行最右邊的文件一次, class文件不會有"無顯"構造器)
-
new的本質就是調用構造方法(類似調用方法)
-
初始化屬性的值
-
有參構造一旦定義, 上面的無參構造必須寫出來
-
代碼整合
package ObjectDemo; //java文件 ---> class文件 public class PersonDemo { //一個類即使啥都沒寫也會有存在一個構造器 //顯示定義構造器 String name;//這兩個變數就是類/構造器中會用到的屬性變數 int age; public PersonDemo() {//無參構造 this.name = "WoOD";//當使用構造器時都是有參構造時, 無參構造 內 可以不寫,無參構造的框架還是要寫的 //當對象調用的是無參構造的話,這個無參構造器會直接對其name屬性值進行WoOD的初始化,不會像之前取null } public PersonDemo(String name) {//有參構造 //有參構造一旦定義, 上面的無參構造必須寫出來 //沒有 有參構造, 上面的無參構造可以不寫, 在一開始的class文件中會看到自動添加了預設了Person構造(Java文件沒寫哦) //1無參2有參,就會分別調用互不影響 //就是方法重載 this.name = name; } public PersonDemo(String name, int age) { this.name = name;//name就是形參, 記住是當前對象的name this.age = age; } //alt + insert //會自動生成構造器(可以選擇生成有參或無參) //可以把上面的代碼刪除試試 } /*Test package ObjectDemo; //一個程式應只有一個main方法 public class Application { public static void main(String[] args) { //下述person_1對象是無參數的,所以會自動跳轉到無參數的Person PersonDemo person = new PersonDemo(); System.out.println(person.name); //針對PersonDemo文件的有參構造 //類似於方法重載 //下述person_1對象是有參數的,所以會自動跳轉到有參數的Person PersonDemo person_1 = new PersonDemo("WoOD_1", 22); System.out.println(person_1.name + " " + person_1.age); } } */
創建對象的記憶體分析
-
因為"旺財"是字元串,String預設就是final修飾的,也就是常量。
-
你聲明的dog對象賦值了Pet的模板,這個模板里有變數比如名字,年齡,所以這個dog也是變數,你得給他賦值,而賦的值存放在堆里,dog就是指向存放值的地方
-
直接看視頻吧, 真的不難理解, 不要被憨批彈幕的給騙了, 多看兩遍, 我有時候都是重覆左方向鍵一直返回看的(還有視頻中的shout是方法,不是構造器)
小結
本文來自博客園,作者:Wo_OD,轉載請註明原文鏈接:https://www.cnblogs.com/WoOD-outPut/p/17054581.html