一、程序導向 & 物件導向
1.程序導向
- 步驟清晰簡單,第一步做什麼,第二步做什麼等等
- 面對過程適合處理一些較為簡單的問題
2.面對物件思想
- 物以類聚,分類的思維模式。(分類細分解決問題)
- 思考問題首先會解決問題需要哪些分類
- 然後對這些分類進行單獨思考
- 最後,對某個分類下的細節進行程序導向的思索
- 物件導向適合處理複雜的問題,適合處理需要多人協作的問題
注意:對於描述複雜的事物,為了從宏觀上把握、從整體上合理分析,我們需要使用物件導向的思路來分析整個系統。但是,具體到微觀操作,仍然需要程序導向的思路去處理。
二、什麼是物件導向
- 物件導向程式設計(Object-Oriented Programming,OOP)
- 物件導向程式設計的本質是:以類的方式組織程式碼,以物件的組織(封裝)資料
- 從認識論的角度是先有物件後有類
- 物件:具體事物
- 類:抽象的,是對物件的抽象
- 從程式碼執行角度是先有類後有物件
- 類是物件的模板
三大特性:
- 封裝:比如將一個東西裝起來只留一個進出的口
- 繼承:父子關係
- 多型:比如,不同的人使用一種方法會產生不同的效果
三、類與物件的關係
- 類是一種抽象的資料型別,它是對某一類事物整體描述/定義,但並不代表某一個具體的事物
-
一個類中只有屬性和方法
-
比如:動物、植物、手機、電腦....都是一種抽象的型別
-
Person類、Pet類、Car類,這些都是同來描述/定義某一類具體的事物應該具備的特點和行為
- 物件是抽象概念的具體事例
- 張三就是人的一個具體事例,張三家裡的旺財就是狗的一個具體事例
- 能夠體現出特點,展現出功能的是具體的事例,而不是一個抽象的概念
四、建立與初始化物件
使用new關鍵字建立物件
- 使用new關鍵字建立的時候,除了分配記憶體空間之外,還會給建立好的物件進行初始化賦值以及對類中構造器的呼叫
- 類中的構造器也稱為構造方法,是在進行建立物件時必須要呼叫的,並且構造器有以下兩個特點
- 必須和類的名字相同
- 必須沒有返回型別,也不能寫void
- 注意:構造器必須掌握
舉例:
注意:以類的方式組織程式碼,以物件的方式封裝資料
- 建立一個Student類,作為模板
//學生類
//以類的方式組織程式碼
public class Student {
String name;//屬性1:姓名,預設值為null
int age;//屬性2:年齡,預設值為0
//方法
public void study(){
System.out.println(this.name+"在學習");
}
}
- 再建立一個類,用於編寫具體程式碼
public class Appliance {
public static void main(String[] args) {
//類:抽象的,需要例項化
//類例項化後會返回一個自己的物件
//xiaoming、xiaohong就是Student類的具體事例
Student xiaoming = new Student();
Student xiaohong = new Student();
//賦值
//以物件的方式封裝資料
xiaoming.name = "小明";
xiaoming.age = 18;
xiaohong.name = "小紅";
xiaohong.age = 17;
//輸出
System.out.println(xiaoming.name+"\t"+xiaoming.age+"歲");//輸出 小明 18歲
System.out.println(xiaohong.name+"\t"+xiaohong.age+"歲");//輸出 小紅 17歲
}
}
五、構造器(必須掌握)
構造器的作用:
-
使用new關鍵字,本質是在呼叫構造器
-
用來初始化值
舉例:
- 建立一個Person類
public class Person {
String name;//name屬性
//構造器的作用:
// 1.使用new關鍵字,本質是在呼叫構造器
// 2.用來初始化值
//預設構造器
//無參構造:預設不顯示
public Person(){
this.name = "Lisi";
}
//過載構造器
//有參構造:一旦定義了有參構造,無參構造就必須顯示定義
public Person(String name){
//this.name中的name是指上面的name屬性
//等號右邊的name是指有參構造中的引數name
this.name = name;
}
}
注意:
- 無參構造器是預設不顯示的(不顯示但存在,同class檔案可以看到),所有當一個類中什麼都沒有的時候,在main方法中也可以例項化一個物件
- 定義了有參構造器時,無參構造就必須顯示定義(即手動定義),否則無法例項化物件
- 建立另外一個Appliance類,並加上main方法
public class Appliance {
public static void main(String[] args) {
//new 例項化了一個物件
Person person = new Person();//呼叫的是無參構造器,預設值為null,但無參構造器中初始化了,則輸出初始化的值
Person person1 = new Person("Zhangsan");//呼叫的是有參構造器
System.out.println(person.name);//輸出Lisi
System.out.println(person1.name);//輸出Zhangsan
}
}
生成構造器的快捷鍵:
- Alt+Insert:自動生成構造器(膝上型電腦沒有反應則按:Fn+Alt+Insert)
- 點選Constructor
- 選擇有參無參即可
六、建立物件記憶體分析
建立了一個Pet類如下:
public class Pet {
//屬性
String name;
int age;
//方法
public void shout(){
System.out.println("叫了一聲!");
}
}
再建立一個包含main方法的類進行具體操作如下:
public class Appliance {
public static void main(String[] args) {
//物件1
Pet dog = new Pet();
dog.name = "旺財";
dog.age = 3;
dog.shout();
//物件2
Pet cat = new Pet();
}
}
對以上程式碼進行記憶體分析
簡易記憶體描述如下:
- new了一個dog物件後記憶體變化如下:
Pet dog = new Pet();
- 給dog物件賦值後,變化如下:
dog.name = "旺財";
dog.age = 3;
dog.shout();
- new了一個cat物件後記憶體變化如下:
Pet cat = new Pet();
七、小結
- 類與物件:
- 類是一個模板,是抽象的
- 物件是一個具體事例
- 物件的應用:
- 引用型別:八大基本型別
- 物件是透過引用來操作的:棧-->堆
- 屬性:欄位Field 成員變數
- 預設初始化:
- 數字:0 或 0.0
- char:u0000
- boolean:false
- 引用:null
- 物件的建立與使用
- 必須使用new 關鍵字創造物件
- 必須掌握構造器
- 物件的屬性:物件.屬性名;
- 物件的方法:物件.方法名();
- 類:
- 靜態的屬性:屬性
- 動態的行為:方法