2012-07-30 35 views
5

我遇到了一些代碼,並不能理解它的某個方面,雖然我已經做了一些廣泛的搜索!爲什麼在Java中的類名周圍使用括號?

我的問題是:爲什麼類有時會在括號內聲明,如下面的代碼?

public class Animal { 

    public static void hide() { 
     System.out.println("The hide method in Animal."); 
    } 

    public void override() { 
     System.out.println("The override method in Animal."); 
    } 
} 

public class Cat extends Animal { 

    public static void hide() { 
     System.out.println("The hide method in Cat."); 
    } 

    public void override() { 
     System.out.println("The override method in Cat."); 
    } 

    public static void main(String[] args) { 
     Cat myCat = new Cat(); 
     Animal myAnimal = (Animal)myCat; 
     myAnimal.hide(); 
     myAnimal.override(); 
    } 
} 

在我的重點是這行代碼具體爲:

  Animal myAnimal = (Animal)myCat; 

我相信這事做的事實,一個類擴展另一個但我不確定括號內定義什麼類表示。

對此的任何幫助表示讚賞。先謝謝你。

+0

這是一個類型轉換,但在這種情況下,類型轉換不是必須的 - 因爲'Cat'是Animal的一個子類型。當您想要將超級類型分配給子類型時,類型轉換是必要的,例如,貓貓=(貓)一些動物;'。如果你這樣做,你必須確保在變量中包含一個'Cat'或者一個子類型'Cat',例如,使用'instanceof'。否則,Java會拋出一個'ClassCastException'。 – 2012-07-30 19:43:57

+0

在這個特殊情況下,因爲Cat擴展了Animal並且myAnimal已經是Animal,所以你不需要將myCat投射到Animal上。所以,Animal myAnimal = myCat;會工作。 – Shark 2012-07-30 19:52:37

+0

括號'[]' - 大括號'{}' - 圓括號'()' - 「尖括號」<>' – 2012-07-30 21:20:05

回答

8

你看到的是一個演員,告訴編譯器可以將貓分配給動物。

轉換是針對編譯器無法安全地將一種類型轉換爲另一種類型的情況,或者是因爲它不知道涉及的類型是什麼,或者因爲轉換會丟失信息(例如,如果您有雙精度型你想存儲一個float類型的變量)。在你的例子中,演員是完全沒必要的,因爲貓擴展了動物;因爲所有的貓都是動物,所以編譯器不需要明確的轉換來告訴它它可以將貓分配給動物。

7

這是一個演員 - myCat類型爲Cat的變量正投射到基類Animal

這意味着它可以被認爲是一個Animal

這是Java中的inheritance的基本功能。


作爲@Sebastian Koppehelcommented,不需要在這種情況下,鑄造 - 的myAnimal變量(Animal類型的)可以接受實現Animal任何類型。

+1

這種繼承的基本特徵意味着在這種情況下轉換是*不必要的*。當你知道某個對象是某個類時,你需要強制轉換,但是由於某種原因,編譯器無法知道。在這種情況下,編譯器知道它並且演員只是語法糖。 – 2012-07-30 19:41:58

+0

所以'貓'擴展'動物'的事實使得鑄造毫無意義?即做同樣的工作? – Sidz 2012-07-30 19:46:52

+0

@ Sadiq_S86 - 基本上,是的。演員不需要。 – Oded 2012-07-30 19:47:40

0

您明確地保證編譯器/運行時您所傳遞的cat引用類型是Animal的類型。在Java中,它被稱爲鑄造

運行時如果這個合同沒有兌現(這意味着貓和動物之間沒有定義關係),你將得到ClassCastException

1

即使代碼生成正確的輸出,但如果必須將對象轉換爲父類並調用父類的靜態方法,則可能需要以更好的方式設計類。 Java中的繼承應該提供對常用方法和字段的訪問。如果需要在父類中編寫一個靜態方法並使用子類的對象調用它,那麼父類和子類之間的關係就不是明確的切割。

相關問題