Java面向物件思想
Java面向物件思想
面向物件程式設計(Object-Oriented Programming , OOP)
以類的方式組織程式碼,以物件的組織(封裝)資料。
類:一類事物共同特徵的抽象描述。
物件:類的具體例項。
四種訪問修飾符:
- public:公共--可以在任意類任意包中訪問
- private:私有--只允許在本類中訪問
- protected:受保護的--允許在本類,本包,子類中訪問
- 預設的--允許在本類,本包中訪問
super:
- 在子類的方法中通過super呼叫父類的屬性以及方法。
- 在子類的構造方法中呼叫父類的構造方法,必須寫在第一行。
- private 只能被本類訪問,super也無法訪問。
- super和this不能同時呼叫構造方法。
this:可用來引用當前類的例項變數,作為引數在建構函式呼叫中傳遞,從方法返回當前類的例項。
static:
- 靜態區和程式一起載入。
- 靜態變數可以用類名.訪問。
- 靜態方法直接呼叫。
方法
Java方法是語句的集合,它們在一起執行一個功能。
- 方法是解決一類問題的程式碼塊。
- 方法包含於類或物件中
構造方法
系統會給所有的類提供一個預設的無參構造方法,該方法是隱藏的,如果顯式的寫了自定義構造方法,那麼系統預設的無引數構造方法就會銷燬。
構造方法沒有返回值(void都沒有),並且方法名必須和類名一致。
- 用來建立物件,也就是物件在建立之前必須要執行構造方法。
修飾符 className(引數列表){
方法體;
}
定義
方法包含一個方法頭和一個方法體
修飾符 返回值型別 方法名(引數型別 引數名){
方法體
return 返回值;
}
修飾符(可選):告訴編譯器如何呼叫該方法,定義了該方法的訪問型別。
返回值型別:方法可能會返回值,void方法沒有返回值。
方法名:方法的實際名稱,方法名和引數表共同構成方法簽名。
引數型別:引數像是一個佔位符,當方法被呼叫時傳遞值給引數,這個值被稱為實參或變數。引數列表是指方法的引數型別、順序和引數的個數。引數是可選的,方法可以不包含任何引數。
方法體:方法體包含具體的語句,定義該方法的功能。
形式引數:在方法被呼叫時用於接收外界輸入的資料。
實際引數:呼叫方法時實際傳給方法的資料。
呼叫
物件名.方法名(實參列表)
方法重寫
重寫需要有繼承關係,子類重寫父類的方法。
當子類繼承至父類的方法不滿足子類的業務邏輯時需要重寫子類繼承的該方法。
重寫是方法的重寫,和屬性無關。
@Override:有功能的註釋。
-
方法名必須相同
-
引數列表必須相同
-
修飾符:範圍可以擴大但不能縮小
public>protected>default>private
-
丟擲的異常:範圍可以被縮小但不能擴大。
方法過載
過載就是在一個類中,有相同的函式名稱,但形參不同的函式。
方法過載的規則:
- 方法名稱必須相同
- 引數列表必須不同(個數不同,型別不同,引數排列順序不同等)
- 方法的返回型別可以相同或不同
- 返回型別不同不足以稱為方法的過載
方法名稱相同時,編譯器會根據呼叫方法的引數個數、引數型別等逐個匹配,選擇對應的方法,匹配失敗編譯器會報錯。
可變引數
在方法宣告中,在指定引數型別後加一個省略號(...)
JDK1.5開始,Java支援傳遞同類型的可變引數給一個方法
一個方法中只能指定一個可變引數,它必須是方法的最後一個引數,任何普通的引數必須在它之前宣告
//排序
public class Test {
public static void main(String[] args) {
printMax(34,3,5,9,7,6);
printMax(new double[]{1,2,3});
}
//輸出最大值,不確定傳遞幾個數
public static void printMax(double... numbers){
if (numbers.length == 0){
System.out.println("No argument passed");
return;//終止方法
}
double result = numbers[0];
//排序
for(int i = 1;i < numbers.length;i++){
if (numbers[i] > result){
result = numbers[i];
}
}
System.out.println("The max value is "+ result);
}
}
遞迴
方法呼叫方法,自己呼叫自己
利用遞迴可以用簡單的程式來解決一些複雜的問題。把一個大型複雜的問題層層轉化為一個與原問題相似的規模較小的問題來求解,用少量的程式描述出解題過程所需要的多次重複計算,大大地減少了程式的程式碼量。
//階乘
public class Test {
public static void main(String[] args) {
System.out.println(f(5));
}
public static int f(int n){
if (n == 1){
return 1;//結束方法,結束遞迴
}else{
//n*n-1 的階乘
return n*f(n-1);
}
}
}
屬性
全域性屬性:直接定義在類中的屬性。
區域性屬性:定義在方法內的屬性。
區別:
-
全域性屬性在使用前如果不賦值,系統會賦預設值,區域性屬性在使用前必須賦值。
-
區域性變數的名字可以和全域性變數一致,但是使用時預設使用區域性變數,不建議名字一致。
-
全域性變數的作用域是整個類,區域性變數作用域在方法內。
引數:方法在執行之前需要動態的給定一些資料,那麼這些資料就通過引數的方式傳遞到方法內部。
-
在呼叫該方法時傳遞的引數型別以及順序必須和定義時一致。
-
如果方法有返回值在定義方法的必須把void替換成對應型別返回值,方法執行完後必須在最後使用return返回對應型別的結果。
封裝
- 所有屬性必須私有化,根據需求提供get/set方法
- 屬性:私有化屬性,並且給每個屬性提供get/set方法對其訪問
- 方法:把相同的功能程式碼集中寫在方法中,方法一般是public
繼承
繼承是從已有的類中派生出新的類,新的類能吸收已有類的資料屬性和行為,並能擴充套件新的能力。在程式設計中可以通過繼承來刪減同一類事物的相同程式碼。降低類之間的耦合。
instanceof:判斷有無父子關係
- 子類繼承父類非私有屬性和方法。
- 子類無法繼承父類的構造方法。但是子類在建立物件之前必先建立父類物件(在子類的構造方法中會預設呼叫父類的無參構造方法)。
- Java只能單繼承,一個類只能有一個直接父類。
- 如果子類重寫了父類中的方法,不管怎麼呼叫全部執行的是子類重寫後的方法。
- 在Java中(除了8種基本資料型別),所有的類全部直接或間接的繼承Object方法。
多型
多型是方法的多型,屬性沒有多型性。
同一方法可以根據傳送物件的不同而採用多種不同的行為方式。
一個物件的實際型別是確定的,但可以指向物件的引用的型別很多。
多型存在的條件:
- 有繼承關係。
- 子類重寫父類方法。
- 父類引用指向子類物件。
三種方法無法被重寫,所以沒有多型
- static 方法
- final常量
- private方法
包機制
為了更好的組織類,Java提供了包機制,用於區別類名的名稱空間。
為了能夠使用某一個包的成員,需要在程式中匯入該包。
package ... //使用該包下的所有物件
import ... //匯入該包下的所有物件
抽象類
abstract修飾符可以用來修飾方法也可以修飾類,如果修飾方法,那麼該方法就是抽象方法,如果修飾類,那麼該類就是抽象類。
-
抽象類中可以沒有抽象方法,但是有抽象方法的類一定要宣告為抽象類。
-
抽象類,不能使用new關鍵字來建立物件,它是用來讓子類繼承的。
-
抽象方法,只有方法的宣告,沒有方法的實現,它是用來讓子類實現的。
-
子類繼承抽象類,那麼就必須要實現抽象類沒有實現的抽象方法,否則該子類也要宣告為抽象類。
-
抽象類就是來實現封裝,多型的,增強程式碼的可擴充套件性。
介面
宣告介面的關鍵字是interface
Java中的類只能單繼承,但介面可以多繼承。
介面:只有規範!自己無法寫方法專業的約束!約束和實現分離:面向介面程式設計
介面不能被例項化,介面中沒有構造方法
類可以實現介面 implements介面,實現介面的類,就需要重寫介面中的方法。
內部類
內部類就是在一個類的內部再定義一個類。
-
成員內部類
-
靜態內部類
-
區域性內部類
-
匿名內部類
一個Java類中可以有多個class類,但是隻能有一個public class