Java基礎知識回顧之多型性
阿新 • • 發佈:2018-12-08
Java基礎知識回顧之封裝性
Java基礎知識回顧之繼承性
Java基礎知識回顧之多型性
簡介
多型的核心就是型別的一致性。物件上的每一個引用和靜態的型別檢查器都要確認這樣的依附(多個子類繼承一個父類)。
多型性嚴格來講有兩種描述形式
-
方法的多型性
- 方法的過載:同一個方法名稱,會根據傳入引數的型別以及個數不同執行不同的方法體。
- 方法的覆寫:同一個方法,會根據子類的不同實現,實現不同的功能。
-
物件的多型性:指的是發生在繼承關係類之中,子類和父類之間的轉換問題。
- 向上轉型(自動完成):
父類 父類物件 = 子類例項;
- 向下轉型(強制轉換):
子類 子類物件 = (子類)父類例項;
- 向上轉型(自動完成):
例項說明
向上轉型
class A{
public void print() {
System.out.println("A、public void print()");
}
}
class B extends A{
@Override
public void print() {
System.out.println("B、public void print()");
}
}
public class TestDemo {
public static void main (String[] args) {
// 使用向上轉型
A a = new B();
a.print(); // 輸出結果: B、public void print()
}
}
向下轉型
public class TestDemo {
public static void main(String[] args) {
// 使用向上轉型
A a = new B();
a.print(); // 輸出結果: B、public void print()
// 向下轉型,強制轉換
B b = (B) a; // 輸出結果: B、public void print()
}
}
說明
向上轉型:由於所有的子類物件例項都可以自動的向上轉型,所以在於引數的統一上。即:同一個方法針對於不同的子類可以有不同的實現。
class A{
public void print() {
System.out.println("A、public void print()");
}
}
class B extends A{
@Override
public void print() {
System.out.println("B、public void print()");
}
}
class C extends A{
@Override
public void print() {
System.out.println("C、public void print()");
}
}
public class TestDemo {
public static void main(String[] args) {
// 只要是A類的子類都可以使用向上轉型,由A類接收
// 同一個方法針對於不同的子類可以有不同的實現
A a1 = new B();
A a2 = new B();
a1.print(); // 輸出結果: B、public void print()
a2.print(); // 輸出結果: C、public void print()
}
}
向下轉型:指的是父類要呼叫子類自己特殊的方法;所有的父類只能呼叫到在父類中定義了的資訊,對於子類擴充的方法,是呼叫不到的,對於這個情況,就需要向下轉型,獲取子類的特殊方法。
class A{
public void print() {
System.out.println("A、public void print()");
}
}
class B extends A{
@Override
public void print() {
System.out.println("B、public void print()");
}
public void funB() {
System.out.println("B 中擴充的方法");
}
}
public class TestDemo {
public static void main(String[] args) {
// 通過向上轉型獲取到 A 物件
A a = new B();
// a.funB(); 此時這段是會報錯的,因為 a 類中沒有 funB方法。
// 如果需要呼叫,就需要使用向下轉型
B b = (B) a;
b.funB(); // 此時就可以呼叫 funB方法
}
}