1. 程式人生 > 其它 >Java學習筆記68——多型向下轉型

Java學習筆記68——多型向下轉型

多型向下轉型

多型的前提

​ 1、要有繼承的關係
​ 2、子類要重寫父類中的方法
​ 3、要有父類的引用指向子類物件

多型的弊端:

​ 多型無法使用子類特有的方法

class Father1{
    public void fun(){
        System.out.println("這是父類中的fun方法");
    }
}

class Son1 extends Father1{
    public void fun(){
        System.out.println("這是子類中的fun方法");
    }

    public void show(){
        System.out.println("這是子類中特有的show方法");
    }
}

public class PolymorphicDemo1 {
    public static void main(String[] args) {
        //多型建立子類物件
        Father1 f = new Son1();
        f.fun();//這是子類中的fun方法(多型與成員方法的關係:編譯看左,執行看右)

        //需求:現在我想呼叫子類中特有的方法,咋辦
        //f.show();
    }
}

需求:現在我想呼叫子類中特有的方法,咋辦
f.show();

多型的弊端:
多型無法使用子類特有的方法

我就想使用子類特有的功能,能否使用? 能

使用子類特有功能的方法

1、建立對應的子類並呼叫方法

​ 可以,但是不推薦,很多時候會佔用堆記憶體空間

class Father2 {
    public void fun() {
        System.out.println("這是父類的fun方法");
    }
}

class Son2 extends Father2 {
    public void fun() {
        System.out.println("這是子類的fun方法");
    }

    public void show() {
        System.out.println("這是子類的show方法");
    }
}


public class PolymorphicDemo2 {
    public static void main(String[] args) {
        Son2 son2 = new Son2();
        son2.show();

2、java提我們考慮到了這一點,提供了一個技術給我們使用:向下轉型

​ 把父類的引用強制轉換成子類的引用
​ 子類類名 變數名 = (子類類名)父類的引用

class Father2 {
    public void fun() {
        System.out.println("這是父類的fun方法");
    }
}

class Son2 extends Father2 {
    public void fun() {
        System.out.println("這是子類的fun方法");
    }

    public void show() {
        System.out.println("這是子類的show方法");
    }
}


public class PolymorphicDemo2 {
    public static void main(String[] args) {

        //多型建立子類物件(向上轉型)
        Father2 f = new Son2();
        f.fun();

        //多型中的向下轉型
        Son2 s = (Son2) f;
        s.show();
    }
}

物件之間轉型的問題:

​ 1、向上轉型
​ 其實就是多型建立物件的寫法
​ Fu f = new Son();

​ 2、向下轉型
​ Son s = (Son)f;

基本資料型別之間的強轉:

​ int a = 10;
​ byte b = (byte)a;

向下轉型的注意事項:

​ 要求必須是存在繼承關係的

class Father2 {
    public void fun() {
        System.out.println("這是父類的fun方法");
    }
}

class Son2 extends Father2 {
    public void fun() {
        System.out.println("這是子類的fun方法");
    }

    public void show() {
        System.out.println("這是子類的show方法");
    }
}

class Demo{

}

public class PolymorphicDemo2 {
    public static void main(String[] args) {
        Father2 f = new Son2();
        
        Demo d = (Demo) f;//報錯。Demo類與Father2類不存在繼承的關係

    }
}