Object類
Object類是類層次結構的根類。每個類都使用 Object 作爲超類。所有對象(包括數組)都實現這個類的方法。
簡單來說就是,Object類是所有類的父類,包括我們所寫的類,我們在使用類的時候就會利用Object類中的方法
Object類常用方法
publi final native class<?>getClass() //返回此Obect運行時的類
public native int hashCode() //返回對象的哈希碼
public boolean equals(Object obj) //判斷其他對象與此對象是否相等
protected native Object clone()throes CloneNotSupportedException //創建並返回此對象的一個副本
public String toString() //返回對象的字符串表示
public final native void notify() //喚醒在此對象監視器上等待的單個線程
public final native void notifyAll() //喚醒在此對象監視器上等待的所有線程
public final native void wait(long timeout) throws InterruptedException //使當前對象的線程等待timeout時長
public final void wait(long timeout, int nanos) throws InterruptedException //使當前對象的線程等待timeout時長,或其他線程中斷當前線程
public final void wait() throws InterruptedException //使當前對象的線程等待
protected void finalize() throws Throwable{} //垃圾回收時調用該方法
強制類型轉換
基本數據類型轉換規則
以下例子展示瞭如何進行類型強轉
public class Haha{
public static void main(String args[]){
float a = 3.14f;
double b = a; //float類型的自動轉換爲double
int c = (int)a; //float類型強制轉換爲int
int d = (int)e; //double類型的強制轉換爲int
繼承
在 Java 中,一個類可以由其他類派生。如果你要創建一個類,而且已經存在一個類具有你所需要的屬性或方法,那麼你可以將新創建的類繼承該類。
利用繼承的方法,可以重用已存在類的方法和屬性,而不用重寫這些代碼。被繼承的類稱爲超類(super class),派生類稱爲子類(subclass)。
繼承的語法規則如下:
[修飾符] class 子類名 extends 父類名
封裝
在面向對象程式設計方法中,封裝是指一種將抽象性函式接口的實現細節部分包裝、隱藏起來的方法。
封裝可以被認爲是一個保護屏障,防止該類的代碼和數據被外部類定義的代碼隨機訪問。
要訪問該類的代碼和數據,必須通過嚴格的接口控制。
封裝最主要的功能在於我們能修改自己的實現代碼,而不用修改那些調用我們代碼的程序片段。
適當的封裝可以讓程式碼更容易理解與維護,也加強了程式碼的安全性。
封裝的優點
-
- 良好的封裝能夠減少耦合。
-
- 類內部的結構可以自由修改。
-
- 可以對成員變量進行更精確的控制。
-
- 隱藏信息,實現細節。
實現Java封裝的步驟
1… 修改屬性的可見性來限制對屬性的訪問(一般限制爲private),例如:
public class Student{
private String name;
private int score;
}
//這段代碼中name和score的屬性是私有的,只有本類可以訪問
- 對每個值屬性提供對外的公共方法訪問,也就是創建一對賦取值方法,用於對私有屬性的訪問,例如:
public calss Student{
private String name;
private int score;
public int getScore(){
return score;
}
public String getName(){
return name;
}
public void setScore(int score){
this.score = score;
}
public void setName(String name){
this.name = name;
}
}
以上實例中public方法是外部類訪問該類成員變量的入口。通常情況下,這些方法被稱爲getter和setter方法。
通過如下的例子說明Student類的變量怎樣被訪問:
public class Haha{
public static void main(String args[]){
Student stu = new Student();
stu.setScore(100);
stu.setName("Jake");
System.out.print("Name : " + stu.getName()+
" Score : "+ stu.getScore());
}
}
//運行結果:Name:Jake Score:100
多態
多態是同一個行爲具有多個不同表現形式或形態的能力。
多態就是同一個接口,使用不同的實例而執行不同操作。
多態存在的三個條件
1.存在繼承關係
2.子類要重寫父類的方法
3.父類數據類型的引用指向子類對象
Animal a = new Cat(); //向上轉型
//此操作後,其他類訪問子類對象的成員屬性,訪問到的是父類的成員屬性
//訪問子類對象的非靜態成員方法,訪問到的是子類
多態的弊端
不能使用子類特有的成員屬性和子類特有的成員方法。
使用子類中特有方法或特有屬性:使用類型強轉。
Cat b = (Cat) a; //向下轉型
抽象(Abstract )
抽象類
一個類中沒有包含足夠的信息來描繪一個具體的對象,這樣的類就是抽象類。
抽象類除了不能實例化對象之外,類的其它功能依然存在,成員變量、成員方法和構造方法的訪問方式和普通類一樣。
由於抽象類不能實例化對象,所以抽象類必須被繼承,才能被使用。
父類包含了子類集合的常見的方法,但是由於父類本身是抽象的,所以不能使用這些方法。
在Java中抽象類表示的是一種繼承關係,一個類只能繼承一個抽象類,而一個類卻可以實現多個接口。
抽象方法
抽象方法只包含一個方法名,而沒有方法體。
public abstract int computPay();
- 如果一個類包含抽象方法,那麼該類必須是抽象類。
- 任何子類必須重寫父類的抽象方法,或者聲明自身爲抽象類。
注意:
1、 抽象類中不一定包含抽象方法,但是有抽象方法的類必定是抽象類。
2、構造方法,類方法(用 static 修飾的方法)不能聲明爲抽象方法。
重寫
重寫是子類對父類的允許訪問的方法的實現過程進行重新編寫, 返回值和形參都不能改變。即外殼不變,核心重寫。
重寫方法不能拋出新的檢查異常或者比被重寫方法申明更加寬泛的異常。
規則
1、參數列表必須完全與被重寫方法的相同。
2、返回類型與被重寫方法的返回類型可以不相同,但是必須是父類返回值的派生類。
3、訪問權限不能比父類中被重寫的方法的訪問權限更低。
訪問權限:指是本類的成員變量、成員方法和內部類對其他類的可見性。
Java一共有四種訪問權限,按照權限由大到小分別爲public、protected、default和private,如果省略了訪問修飾符,那訪問權限就是defualt。
4、父類的成員方法只能被它的子類重寫。
5、聲明爲 final 的方法不能被重寫。
6、聲明爲 static 的方法不能被重寫,但是能夠被再次聲明。
7、子類和父類在同一個包中,那麼子類可以重寫父類所有方法,除了聲明爲 private 和 final 的方法。
8、子類和父類不在同一個包中,那麼子類只能夠重寫父類的聲明爲 public 和 protected 的非 final 方法。
9、重寫的方法能夠拋出任何非強制異常,無論被重寫的方法是否拋出異常。但是,重寫的方法不能拋出新的強制性異常,或者比被重寫方法聲明的更廣泛的強制性異常,反之則可以。
10、構造方法不能被重寫。
11、如果不能繼承一個方法,則不能重寫這個方法。
*****當需要在子類中調用父類的被重寫方法時,要使用 super 關鍵字。 *****
重載
重載是在一個類裏面,方法名字相同,而參數不同。返回類型可以相同也可以不同。
重載規則:
- 被重載的方法必須改變參數列表(參數個數或類型不一樣);
- 被重載的方法可以改變返回類型;
- 被重載的方法可以改變訪問修飾符;
- 被重載的方法可以聲明新的或更廣的檢查異常;
- 方法能夠在同一個類中或者在一個子類中被重載。
- 無法以返回值類型作爲重載函數的區分標準。
以下例子演示方法的重載
運行結果
重寫和重載的區別
區別點 | 重載方法 | 重寫方法 |
---|---|---|
參數列表 | 必須修改 | 一定不能修改 |
返回類型 | 可以修改 | 一定不能修改 |
異常 | 可以修改 | 可以減少或刪除,一定不能拋出新的或者更廣的異常 |
訪問 | 可以修改 | 一定不能做更嚴格的限制(可以降低限制) |
覆蓋
如果在子類中定義一個方法,其名稱、返回類型及參數簽名正好與父類中某個方法的名稱、返回類型及參數簽名相匹配,那麼可以說,子類的方法覆蓋了父類的方法。
注意
1、子類方法的權限必須不小於父類方法的權限。
2、子類方法只能拋出父類方法聲明拋出的異常或異常子類。
3、子類方法不能覆蓋父類中聲明爲final或static的方法。
4、子類方法必須覆蓋父類中聲明爲abstract的方法(接口或抽象類)。
以下例子演示:
運行結果:
裝箱拆箱
八種基本數據類型 byte ,short,int,long,char,float,double,boolean 都不具備對象的特性,沒有方法可以調用。因此每種基本數據類型有對應的類,稱之爲包裝類。
基本數據類型對應的包裝類
基本數據類型 | 包裝類 |
---|---|
byte | Byte |
short | Short |
int | Integer |
long | Long |
char | Character |
float | Float |
double | Double |
boolean | Boolean |
自動拆箱裝箱
裝箱就是自動將基本數據類型轉換爲包裝器類型;拆箱就是自動將包裝器類型轉換爲基本數據類型。
//自動裝箱
Integer i = 99;
//自動拆箱
int j = i;