1.多態性的理解:可以理解為一個事物的多種形態。
2.何為多態性:
對象的多態性:父類的引用指向子類的對象(或子類的對象賦給父類的引用)
舉例:
Person p = new Man();
Object obj = new Date();
3.多態性的使用:虛擬方法調用
有了對象的多態性以后,我們在編譯期,只能調用父類中聲明的方法,但在運行期,我們實際執行的是子類重寫父類的方法。
總結:編譯,看左邊;運行,看右邊。
4.多態性的使用前提:
① 類的繼承關系 ② 方法的重寫
5.多態性的應用舉例:
舉例一:
public void func(Animal animal){//Animal animal = new Dog();
animal.eat();
animal.shout();
}
舉例二:
public void method(Object obj){
}
舉例三:
class Driver{
public void doData(Connection conn){//conn = new MySQlConnection(); / conn = new OracleConnection();//規范的步驟去操作數據
// conn.method1();
// conn.method2();
// conn.method3();
}
}
6.多態性使用的注意點:
對象的多態性,只適用于方法,不適用于屬性(編譯和運行都看左邊)
7.關于向上轉型與向下轉型:
7.1 向上轉型:多態
7.2 向下轉型:
7.2.1 為什么使用向下轉型:
有了對象的多態性以后,內存中實際上是加載了子類特有的屬性和方法的,但是由于變量聲明為父類類型,導致編譯時,只能調用父類中聲明的屬性和方法。子類特有的屬性和方法不能調用。如何才能調用子類特的屬性和方法?使用向下轉型。
7.2.2 如何實現向下轉型:
使用強制類型轉換符:()
7.2.3 使用時的注意點:
① 使用強轉時,可能出現ClassCastException的異常。
② 為了避免在向下轉型時出現ClassCastException的異常,我們在向下轉型之前,先進行instanceof的判斷,一旦返回true,就進行向下轉型。如果返回false,不進行向下轉型。
7.2.4 instanceof的使用:
① a instanceof A:判斷對象a是否是類A的實例。如果是,返回true;如果不是,返回false。
② 如果 a instanceof A返回true,則 a instanceof B也返回true.其中,類B是類A的父類。
③ 要求a所屬的類與類A必須是子類和父類的關系,否則編譯錯誤。
7.2.5 圖示:
8. 面試題:
8.1 談談你對多態性的理解?
① 實現代碼的通用性。
② Object類中定義的public boolean equals(Object obj){ }
JDBC:使用java程序操作(獲取數據庫連接、CRUD)數據庫(MySQL、Oracle、DB2、SQL Server)
③ 抽象類、接口的使用肯定體現了多態性。(抽象類、接口不能實例化)
8.2 多態是編譯時行為還是運行時行為?
1.java.lang.Object類的說明:
- 1.Object類是所Java類的根父類
- 2.如果在類的聲明中未使用extends關鍵字指明其父類,則默認父類為java.lang.Object類
- 3.Object類中的功能(屬性、方法)就具通用性。
- 屬性:無
- 方法:equals() / toString() / getClass() /hashCode() / clone() / finalize()
-
wait() 、 notify()、notifyAll()
-
- Object類只聲明了一個空參的構造器
2.equals()方法
2.1 equals()的使用:
- 是一個方法,而非運算符
-
- 只能適用于引用數據類型
-
- Object類中equals()的定義:
- public boolean equals(Object obj) {
return (this == obj);
} - 說明:Object類中定義的equals()和==的作用是相同的:比較兩個對象的地址值是否相同.即兩個引用是否指向同一個對象實體
-
- 像String、Date、File、包裝類等都重寫了Object類中的equals()方法。重寫以后,比較的不是
- 兩個引用的地址是否相同,而是比較兩個對象的"實體內容"是否相同。
-
- 通常情況下,我們自定義的類如果使用equals()的話,也通常是比較兩個對象的"實體內容"是否相同。那么,我們
- 就需要對Object類中的equals()進行重寫.
- 重寫的原則:比較兩個對象的實體內容是否相同.
2.2 如何重寫equals()
2.2.1 手動重寫舉例:
class User{
String name;
int age;
//重寫其equals()方法
public boolean equals(Object obj){
if(obj == this){
return true;
}
if(obj instanceof User){
User u = (User)obj;
return this.age == u.age && this.name.equals(u.name);
}
return false;
}
}
2.2.2 開發中如何實現:自動生成的
2.3 回顧 == 運算符的使用: - == :運算符
-
- 可以使用在基本數據類型變量和引用數據類型變量中
-
- 如果比較的是基本數據類型變量:比較兩個變量保存的數據是否相等。(不一定類型要相同)
- 如果比較的是引用數據類型變量:比較兩個對象的地址值是否相同.即兩個引用是否指向同一個對象實體
- 補充: == 符號使用時,必須保證符號左右兩邊的變量類型一致。
3. toString()方法
3.1 toString()的使用:
- 當我們輸出一個對象的引用時,實際上就是調用當前對象的toString()
-
- Object類中toString()的定義:
- public String toString() {
return getClass().getName() + “@” + Integer.toHexString(hashCode());
} -
- 像String、Date、File、包裝類等都重寫了Object類中的toString()方法。
- 使得在調用對象的toString()時,返回"實體內容"信息
-
- 自定義類也可以重寫toString()方法,當調用此方法時,返回對象的"實體內容"
3.2 如何重寫toString()
舉例:
//自動實現
@Override
public String toString() {
return “Customer [name=” + name + “, age=” + age + “]”;
}
- 自定義類也可以重寫toString()方法,當調用此方法時,返回對象的"實體內容"
4.面試題:
① final、finally、finalize的區別?
② == 和 equals() 區別
* Java中的JUnit單元測試
- 步驟:
- 1.中當前工程 - 右鍵擇:build path - add libraries - JUnit 4 - 下一步
- 2.創建Java類,進行單元測試。
- 此時的Java類要求:① 此類是public的 ②此類提供公共的無參的構造器
- 3.此類中聲明單元測試方法。
- 此時的單元測試方法:方法的權限是public,沒返回值,沒形參
- 4.此單元測試方法上需要聲明注解:@Test,并在單元測試類中導入:import org.junit.Test;
- 5.聲明好單元測試方法以后,就可以在方法體內測試相關的代碼。
- 6.寫完代碼以后,左鍵雙擊單元測試方法名,右鍵:run as - JUnit Test
- 說明:
- 1.如果執行結果沒任何異常:綠條
- 2.如果執行結果出現異常:紅條
1.為什么要有包裝類(或封裝類)
為了使基本數據類型的變量具有類的特征,引入包裝類。
2.基本數據類型與對應的包裝類:
3.需要掌握的類型間的轉換:(基本數據類型、包裝類、String)
簡易版:
基本數據類型<—>包裝類:JDK 5.0 新特性:自動裝箱 與自動拆箱
基本數據類型、包裝類—>String:調用String重載的valueOf(Xxx xxx)
String—>基本數據類型、包裝類:調用包裝類的parseXxx(String s)
注意:轉換時,可能會報NumberFormatException
應用場景舉例:
① Vector類中關于添加元素,只定義了形參為Object類型的方法:
v.addElement(Object obj); //基本數據類型 —>包裝類 —>使用多態