面向物件編程(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
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/542040.html
標籤:其他
上一篇:C++|變數
