2012-11-28 61 views
0
class Animal { 

} 

class Horse extends Animal { 

} 

public class Test { 
    public static void main(){ 
     Animal a = new Horse();//mark1 
    } 
} 


Animal ah = new Horse();// reference type is Animal and object is Horse 

我不能完全理解此下面: 动物啊=新马(); //引用类型是动物和物体是马
我始终保持引用类型相同的同
我想知道使用未同参考type.Please告诉我一些情况,它是更适合使用它为什么是引用类型可以用Java从对象类型不同

+5

http://docs.oracle.com/javase/tutorial/java/IandI/polymorphism.html – jrajav

+0

这是因为,一匹马“是一只动物”。如果一个方法说“我需要一只动物做我的工作”,并且你给它一匹马,那么你必须做正确的事情,因为一匹马“是一只动物”。 –

回答

1

这适用于多个场合,如果你需要的动物的数组一个简单的例子是。

public class Cow extends Animal { 
    public void sound() { 
     System.out.println("MOO"); 
    } 
} 

public class Horse extends Animal { 
    public void sound() { 
     System.out.println("HEEEHREHE"); 
    } 
} 

虽然动物,你可以不知道的事,所以你可以使用的财产以后像

public class Animal { 
    public void sound() { 
     System.out.println("."); 
    } 
} 

的事情是,如果你去通过量每一种动物的数组中会使用的方法为它定义。

for (int i = 0; i < 3; i++) { 
    array[i].sound(); 
} 

将输出:

HEEEHREHE 
MOO 
. 
+2

理想情况下,您将使'Animal'类(及其''声音'函数)摘要。但是,那是另一天的话题。 :) – cHao

0

因此,你可以的原因对象使用任何Animal或Horse作为'ab'类型。在这种特殊情况下,通过动物类型引用对象的实用性在于,在后期当您想要指向某个其他动物对象时,请指出Dog(实现动物接口),然后在其他代码中您不会需要在其他动物类型的代码中进行修改。因此,通过接口类型引用对象引用可以自由地动态更改实际实现实例,并且它也可以从外部世界隐藏实现类。

Animal array[] = new Animal[3]; 
array[0] = new Horse(); 
array[1] = new Cow(); 
array[2] = new Animal(); 

你可以有一些定义的通用方法,或让他们在指定的每个扩展类:

0

除了能够有一个程序执行期间的同一个变量是指不同类的对象,它往往是做,以保持编码选项打开。

经典的例子是:

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

,编译器将例如拒绝因为ensureCapacity不是List方法,所以myList.ensureCapacity(100)。只有List方法可以用于myList。如果在程序运行并经过测量后发现使用LinkedList会使程序更快,只有构造函数调用发生变化。 myList没有任何功能可以处理任何List。

相关问题