2012-04-13 58 views
2

對於將實例聲明爲特定類型的目的,我有點困惑。例如,將某個實例轉換爲某種類型有什麼意義?

Integer intOb1 = new Integer(3); 
Object intOb2 = new Integer(4); 

我知道intOb1類型是Integer,並intOb2類型爲Object,但到底是什麼宣稱intOb2Object允許一個呢?使用方法Object?你不能已經使用這些方法作爲Integer?或者主要目的是爲了能夠將「intOb2」視爲對象?

正如你所看到的,我很困惑。

回答

2

這個實際不叫鑄造這是一個多態性的例子。它允許變量根據與其他類的繼承關係採用不同的類型。

例如,假設您正在編寫程序來模擬動物園。你將有一個名爲Zoo的班級和一個名爲Animal的班級。還有幾個類別從Animal類延伸:LionZebraElephant

這將是非常有用的,以保持所有這些對象在一個列表中組合在一起的,但因爲它們是不同類型的,即:LionZebraElephant,你不能把它們存儲在一個單獨的列表,你將不得不保持一個單獨的名單每個類型的動物。這是多態性發揮作用的地方。

由於每個班LionZebra,並Elephant全部來自Animal類,我們可以簡單地將它們存儲在Animal類型的列表擴展。

代碼示例:

public class Zoo 
{ 
    private List<Animal> animals; 

    public Zoo() 
    { 
     this.animals = new ArrayList<>(); 
    } 

    //notice this method takes an Animal object as a parameter 
    public void add(Animal a) 
    { 
     this.animals.add(a); 
    } 
} 

public abstract class Animal 
{ 
    private String name; 
    private String type; 

    public Animal(String name, String type) 
    { 
     this.name = name; 
     this.type = type; 
    } 

    //all subclasses must implement this method 
    public abstract void speak(); 
} 

public class Lion extends Animal 
{ 
    private String animalType = "Lion"; 

    public Lion(String name) 
    { 
     super(name, animalType); 
    } 

    public void speak() 
    { 
     System.out.println("ROAR"); 
    } 
} 

//....etc for the other two animals 

public class TestZoo 
{ 
    public static void main(String[] args) 
    { 
     Zoo myZoo = new Zoo(); 
     Lion l  = new Lion("Larry"); 
     Elephant e = new Elephant("Eli"); 
     Zebra z = new Zebra("Zayne"); 

     myZoo.add(l); //<-- note that here I don't pass Animal objects to the 
     myZoo.add(e); // add method but subclasses of Animal 
     myZoo.add(z); 
    } 
} 

希望這有助於,即使有一個愚蠢的例子。

+0

好吧,這是有道理的,但在主要方法,如果我反而寫 '動物l =新獅子(「拉里」); 動物e =新象(「Eli」); 動物z =新斑馬(「Zayne」);' 什麼新功能會給? – 2012-04-13 03:48:07

+0

@Hubrid它提供的功能是可以將所有對象存儲在同一個列表或容器中,即使它們都具有不同的類型。 – 2012-04-13 03:49:41

+0

我知道這是一種創建動物物體的有效方法,我只是爲什麼'動物l =新獅子(「拉里」);'永遠是首選/不是首選的獅子l =新獅子(「拉里「);'。 – 2012-04-13 03:50:53

2

當涉及到Object時,你永遠不會得到任何有用的東西,因爲它是一種通用類型,對任何地方都沒有幫助。

不過想想不同的情況:

List<String> list = new ArrayList<String>(); 

這意味着一些具體的事情:listArrayList並宣佈它只是一般的List集合強制執行的事實,整個代碼,你不會使用任何ArrayList具體方法。

這可以有效地表明您不會依賴任何特定的實現,您將在稍後被允許將ArrayList<String>()切換到例如LinkedList<String>()而不必修改其他任何內容。

+0

好的 - 這很有道理,謝謝。 – 2012-04-13 03:31:54

+0

我認爲@亨特的觀點很重要。 OP在這裏所做的並不是(明確的)演員。 – 2012-04-13 03:46:25

+0

我不確定究竟是什麼叫它,對不起。 – 2012-04-13 03:47:11

0

您可以隨時使用「對象」類的方法,從任何類型的類的對象,因爲所有的類都是「對象」

取而代之的子類,你要明白這究竟是爲什麼人創建類型Object類的對象:

當您想要編寫某些方法/功能並且您不確定哪種類型的對象可能作爲輸入時,通常需要進行類型轉換。 JDK中最常見的例子之一是比較器中的等式方法或比較方法。

// Object equals method - written for such generic use. 
boolean  equals(Object obj) { 
    //Here you might want to check which is other type of object. 
    if (!obj instanceof CurrentClass) { 
     return false; 
    } 
    //Additional logic required to check equality of object. 
} 

類似的情況也出現在早期的集合庫(JDK 1.4)中,但是JDK 1.5引入了一個名爲generic的新特性。

相關問題