C語言中文網 目錄

Java對象類型轉換和強制對象類型轉換

< 上一頁Java super關鍵字 Java方法重載下一頁 >

Java 語言允許某個類型的引用變量引用子類的實例,而且可以對這個引用變量進行類型轉換。如果把引用類型轉換為子類類型,則稱為向下轉型;如果把引用類型轉換為父類類型,則稱為向上轉型。

例如,Creature 類表示生物類,Animal 類表示動物類,該類對應的子類有 Dog 類,使用對象類型表示如下:
Animal animal=new Dog();
Dogdog=(Dog)animal;    //向下轉型,把Animal類型轉換為Dog類型
Creature creature=animal;    //向上轉型,把Animal類型轉換為Creature類型

例 1

下面通過具體的示例演示對象類型的轉換。例如,父類 Animal 和子類 Cat 中都定義了實例變量 name、靜態變量 staticName、實例方法 eat() 和靜態方法 staticEat()。此外,子類 Cat 中還定義了實例變量 str 和實例方法 dogMethod()。

父類 Animal 的代碼如下:
public class Animal
{
    public String name="Animal:動物";
    public static String staticName="Animal:可愛的動物";
    public void eat()
    {
        System.out.println("Animal:吃飯");
    }
    public static void staticEat()
    {
        System.out.println("Animal:動物在吃飯");
    }
}

子類 Cat 的代碼如下:
public class Cat extends Animal
{
    public String name="Cat:貓";
    public String str="Cat:可愛的小貓";
    public static String staticName="Dog:我是喵星人";
    public void eat()
    {
        System.out.println("Cat:吃飯");
    }
    public static void staticEat()
    {
        System.out.println("Cat:貓在吃飯");
    }
    public void eatMethod()
    {
        System.out.println("Cat:貓喜歡吃魚");
    }
    public static void main(String[] args)
    {
        Animal animal=new Cat();
        Cat cat=(Cat)animal;    //向下轉型
        System.out.println(animal.name);    //輸出Animal類的name變量
        System.out.println(animal.staticName);    // 輸出Animal類的staticName變量
        animal.eat();    //輸出Cat類的eat()方法
        animal.staticEat();    //輸出Animal類的staticEat()方法
        System.out.println(cat.str);    //調用Cat類的str變量
        cat.eatMethod();    //調用Cat類的eatMethod()方法
    }
}

通過引用類型變量來訪問所引用對象的屬性和方法時,Java 虛擬機將采用以下綁定規則:
  • 實例方法與引用變量實際引用的對象的方法進行綁定,這種綁定屬于動態綁定,因為是在運行時由 Java 虛擬機動態決定的。例如,animal.eat() 是將 eat() 方法與 Cat 類綁定。
  • 靜態方法與引用變量所聲明的類型的方法綁定,這種綁定屬于靜態綁定,因為是在編譯階段已經做了綁定。例如,animal.staticEat() 是將 staticEat() 方法與 Animal 類進行綁定。
  • 成員變量(包括靜態變量和實例變量)與引用變量所聲明的類型的成員變量綁定,這種綁定屬于靜態綁定,因為在編譯階段已經做了綁定。例如, animal.name 和 animal.staticName 都是與 Animal 類進行綁定。

對于 Cat 類,運行時將會輸出如下結果:
Animal:動物
Animal:可愛的動物
Cat:吃飯
Animal:動物在吃飯
Cat:可愛的小貓
Cat:貓喜歡吃魚

強制對象類型轉換

Java 編譯器允許在具有直接或間接繼承關系的類之間進行類型轉換。對于向下轉型,必須進行強制類型轉換;對于向上轉型,不必使用強制類型轉換。

例如,對于一個引用類型的變量,Java 編譯器按照它聲明的類型來處理。如果使用 animal 調用 str 和 eatMethod() 方法將會出錯,如下:
animal.str="";    //編譯出錯,提示Animal類中沒有str屬性
animal.eatMethod();    //編譯出錯,提示Animal類中沒有eatMethod()方法

如果要訪問 Cat 類的成員,必須通過強制類型轉換,如下:
((Cat)animal).str="";    //編譯成功
((Cat)animal).eatMethod();    //編譯成功

把 Animal 對象類型強制轉換為 Cat 對象類型,這時上面兩句編譯成功。對于如下語句,由于使用了強制類型轉換,所以也會編譯成功,例如:
Cat cat=(Cat)animal;    //編譯成功,將Animal對象類型強制轉換為Cat對象類型

子類的對象可以轉換成父類類型,而父類的對象實際上無法轉換為子類類型。因為通俗地講,父類擁有的成員子類肯定也有,而子類擁有的成員,父類不一定有。因此,對于向上轉型,不必使用強制類型轉換。例如:
Cat cat=new Cat();
Animal animal=cat;    //向上轉型,不必使用強制類型轉換

如果兩種類型之間沒有繼承關系,那么將不允許進行類型轉換。例如:
Dog dog=new Dog();
Cat cat=(Cat)dog;    //編譯出錯,不允許把Dog對象類型轉換為Cat對象類型
< 上一頁Java super關鍵字 Java方法重載下一頁 >

精美而實用的網站,提供C語言、C++、STL、Linux、Shell、Java、Go語言等教程,以及socket、GCC、vi、Swing、設計模式、JSP等專題。

Copyright ?2011-2018 biancheng.net, 陜ICP備15000209號

底部Logo
极速pk10开户