面向物件詳解
面向物件
面向過程 & 面向物件
- 面向過程:第一步做什麼,第二步做什麼...(線性思維)
- 面向過程適合處理一些較為簡單的問題
- 面向物件:分類的思維分類,思考問題首先會解決問題需要哪些分類,然後對這些分類進行單獨思考。最後,才對某個分類下的細節進行面向過程的思索。
- 面向物件適合處理複雜的問題
- 對於描述複雜的事物,為了從巨集觀上把握,從整體上合理分析,我們需要使用面向物件的思路來分析整個系統。但是,具體到微觀操作,仍然需要面向過程的思路去處理。
什麼是面向物件
面向物件程式設計(OOP):面向物件程式設計的本質就是以類的方式組織程式碼,以物件的形式(封裝)資料
三大特性:封裝、繼承、多型
從程式碼執行角度考慮是先有類後有物件。類是物件的模板。
回顧方法及及加深
方法的定義
- 修飾符
- 返回型別
- break:跳出switch,結束迴圈
- 方法名:注意規範,見名知意
- 引數列表:(引數型別,引數名)
- 異常丟擲
方法的呼叫:遞迴
- 靜態方法 static
- 非靜態方法
- 形參和實參(實際引數和形式引數的型別要對應)
- 值傳遞和引用傳遞
- this關鍵字
為什麼一個java原始檔中只能有一個public類
類與物件的關係
- 類是一種抽象的資料型別,它是對某一類事物整體描述/定義,但是並不能代表某一個具體的事物
- 物件是抽象概念的具體例項
創建於初始化物件
使用new關鍵字建立物件
使用new關鍵字建立的時候,除了分配記憶體空間之外,還會給建立好的物件進行預設的初始化以及對類中構造器的呼叫。
構造器必須要掌握
類中的構造器也稱為構造方法,是在進行建立物件的時候必須要呼叫的,並且構造器有以下倆個特點:
-
必須和類的名字相同
-
必須沒有返回型別,也不能寫void
-
一個類即使什麼都不寫,它也會存在一個方法
//無參構造 public class Person{ public Person(){ } } //作用:例項化初始值 //1.使用new關鍵字,本質是在呼叫構造器 //2.構造器用來初始化物件的值
-
有參構造:一旦定義了有參構造,無參構造必須顯示定義才能再次使用
//有參構造 public class Person{ public Person(String name){ this.name = name; } }
-
Alt+Insert是呼叫構造器的快鍵鍵
java記憶體分析
小結
-
類與物件
類是一個模板:抽象,物件是一個具體的例項
-
方法
定義,呼叫
-
物件的引用
引用型別:除了基本型別都是引用型別
基本型別(8個)
-
屬性:欄位
預設初始化:
數字:0、0.0
char: u0000
boolean: false
引用:null
格式: 修飾符 屬性型別 屬性名 = 屬性值;
-
物件的建立和使用
- 必須使用new關鍵字創造物件 Person person = new Person();
- 物件的屬性 person.name
- 物件的方法 person.study()
-
類:
靜態的屬性 屬性
動態的行為 方法
面向物件三大特徵:封裝
程式設計要求“高內聚,低耦合”。高內聚就是類的內部資料操作細節自己完成,不允許外部干涉;低耦合:僅暴露少量的方法給外部使用。
封裝(資料的隱藏):通常應禁止直接訪問一個物件中資料的實際表示,而應通過操作介面來訪問,這稱為資訊隱藏。
屬性私有,get/set
快鍵鍵:Alt+Insert
面向物件三大特徵:繼承
繼承的本質是對某一批類的抽象,從而實現對現實世界更好的建模
extends的意思是“擴充套件”。子類是父類的擴充套件。
java中類只有單繼承,沒有多繼承
繼承是類和類之間的一種關係。除此之外,類和類之間的關係還有依賴、組合、聚合等。
繼承關係的倆個類,一個為子類(派生類),一個為父類(基類)。子類繼承父類,使用關鍵字extends來表示。
子類和父類之間,從意義上講應該具有“is a”的關係。
object類:在java中,所有的類,都預設直接或間接繼承Object類(通過Ctrl+H檢視)
super
super注意點:
- super呼叫父類的構造方法,必須在構造方法的第一個
- super必須只能出現在子類的方法或者構造方法中
- super和this不能同時呼叫構造方法
this vs super:
-
代表的物件不同:
this:本身呼叫者這個物件
super:代表父類物件的引用
-
前提
this:沒有繼承也可以使用
super:只能在繼承條件下才可以使用
-
構造方法
this();本類的構造
super();父類的構造
方法重寫:子類的方法和父類必須一致:方法體不同!
-
需要有繼承關係,子類重寫父類的方法
-
方法名必須相同
-
引數列表必須相同
-
修飾符:範圍可以擴大但不能縮小
public>protected>default>private
-
丟擲的異常:範圍可以被縮小,但不能擴大
為什麼需要重寫?
- 父類的功能,子類不一定需要,或者不一定滿足!(Alt+Insert)
//繼承程式碼
public class Student extends Person(){
private String name = "lvcong";
public void print(){
System.out.println("Person");
}
public void test(String name){
System.out.println(name);
System.out.println(this.name);//lvcong
System.out.println(super.name);//呂聰
}
}
public class Person{
protected String name = "小胖";
public void print(){
System.out.println("Person");
}
}
靜態的方法和非靜態的方法區別很大
靜態方法:方法的呼叫只和左邊,定義的資料型別有關
非靜態方法:重寫
面向物件三大特徵:多型
即同一方法可以根據傳送物件的不同而採用多種不同的行為方式。
一個物件的實際型別是確定的,但可以指向物件的引用的型別有很多
- 子類能呼叫的方法都是自己的或者繼承父類的!
- 父類可以指向子類,但是不能呼叫子類獨有的方法
多型注意事項:
-
多型是方法的多型,屬性沒有多型
-
父類和子類,需有聯絡,否則報型別轉換異常:ClassCastException!
-
多型存在條件:
-
首先要有繼承關係
-
方法需要重寫(子類重寫父類的方法)
-
父類引用指向子類物件
Father f1 = new Son();
-
-
不能重寫和不能實現多型的情況
- static 方法,它屬於類,不屬於例項
- final 常量
- private 方法
instanceof 和 型別轉換之間的關係
instanceof:用來測試一個物件是否為一個類的例項 x instanceof y
//型別之間的轉換:高轉換到低自動轉換
Person obj = new Student();
//但obj不能使用Student類中的方法
//將這個物件轉換為Student型別,我們就可以使用Student型別的方法了
((Student)obj).go();
抽象類
//abstract 抽象類
public abstract class Action {
//抽象方法只有方法名字,沒有方法的實現!
public abstract void doSomething();
//抽象類的特點:
// 1.不能new這個抽象類,只能靠子類去實現它
// 2.抽象類中可以寫普通的方法
// 3.抽象的方法必須在抽象類中
}
public class A extends Action{
@Override
public void doSomething() {
}
}
介面
普通類、抽象類、介面的區別
普通類:只有具體實現
抽象類:具體實現和規範(抽象方法)都有!
介面:只有規範!自己無法寫方法;而且約束和實現分離:面向介面程式設計
介面的本質是契約
宣告介面的關鍵字是interface
介面的作用
- 約束
- 定義一些方法,讓不同的人實現
- 方法:public abstract
- 常量:public static final
- 介面不能被例項化,介面中沒有構造方法
- implements可以實現多個介面
- 必須要重寫介面中的方法
內部類
內部類就是在一個類的內部再定義一個類,比如,A類中定義一個B類,那麼B類相對A類來說就稱為內部類,而A類相對B類來說就是外部類了。
- 成員內部類
- 靜態內部類
- 區域性內部類
- 匿名內部類