首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 物件型別轉換:向上轉型、向下轉型與 instanceof 實戰

     編輯:Java 相關知識

核心概念

Java 物件轉換分為兩類:

  1. 向上轉型:子類別物件賦值給父類別參考。無需強制轉型,編譯器自動完成,安全無風險。
  2. 向下轉型:父類別參考轉為子類別參考。必須強制轉型,且僅在「該物件實際為子類別實例」時安全,否則拋出 ClassCastException。

實戰範例:動物類別體系


public class TestObject {
    public static void main(String[] args) {
        Animal a = new Animal();           // 父類別實例
        Dog d = new Dog("黃色");           // 子類別實例
        d.setName("大黃");
        
        System.out.println(a.print(d));    // 傳入 Dog 實例
        System.out.println(a.print(a));    // 傳入 Animal 實例
    }
}

class Animal {
    String name;
    public void setName(String n) { this.name = n; }
    public String getName() { return this.name; }
    
    // 核心方法:根據實際型別輸出不同資訊
    public String print(Animal a) {
        String result = "";
        if (a instanceof Dog) {
            Dog d = (Dog) a;               // 向下轉型
            result = "名稱:" + a.getName() + "\n毛色:" + d.getFurColor();
        } else if (a instanceof Cat) {
            Cat c = (Cat) a;               // 向下轉型
            result = "名稱:" + a.getName() + "\n瞳色:" + c.getEyeColor();
        } else {
            result = "名稱:" + a.getName(); // 純 Animal 實例
        }
        return result;
    }
}

class Cat extends Animal {
    String eyeColor;
    public Cat(String e) { this.eyeColor = e; }
    public void setEyeColor(String e) { this.eyeColor = e; }
    public String getEyeColor() { return this.eyeColor; }
}

class Dog extends Animal {
    String furColor;
    public Dog(String f) { this.furColor = f; }
    public void setFurColor(String f) { this.furColor = f; }
    public String getFurColor() { return this.furColor; }
}

執行結果解析


// 第一次呼叫 a.print(d) - 傳入 Dog 實例
名稱:大黃
毛色:黃色

// 第二次呼叫 a.print(a) - 傳入 Animal 實例
名稱:null

instanceof 運算子在向下轉型前檢查實際型別,避免 ClassCastException。此模式常用於:

  • 訪客模式
  • 序列化/反序列化時的型別判斷
  • 處理異構集合中的元素

進階技巧:多態替代條件判斷

上述 if-else instanceof 鏈雖然可行,但違反開閉原則。更優雅的做法是利用多態:


abstract class Animal {
    String name;
    public abstract String detail(); // 子類別自行實現
    
    public String print() {
        return "名稱:" + name + "\n" + detail();
    }
}

class Dog extends Animal {
    String furColor;
    public Dog(String color) { this.furColor = color; }
    @Override public String detail() { return "毛色:" + furColor; }
}

class Cat extends Animal {
    String eyeColor;
    public Cat(String color) { this.eyeColor = color; }
    @Override public String detail() { return "瞳色:" + eyeColor; }
}

// 使用時
Animal a = new Dog("黃色");
a.setName("大黃");
System.out.println(a.print()); // 自動調用 Dog.detail()

避坑指南

錯誤場景後果正確做法
父類別實例強制轉子類別ClassCastException先用 instanceof 判斷
轉型後調用子類別獨有方法編譯錯誤或運行異常確認轉型成功後再調用
忽略 null 檢查NullPointerExceptionif (obj != null && obj instanceof Dog)

總結

  • 向上轉型:隱式、安全、賦值給父類別參考/介面。
  • 向下轉型:顯式、需 instanceof 守護、僅用於存取子類別特有成員。
  • 設計建議:盡量透過多態、介面隔離避免頻繁向下轉型,提升程式碼彈性與可維護性。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved