2012-04-13 68 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的新特性。

相关问题