为什么引用类型可以与java中的对象类型不同

时间:2012-11-28 03:15:08

标签: java

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

我无法完全理解以下内容: 动物啊=新马(); //引用类型是动物,对象是马
我始终保持参考类型与对象
相同 我想知道使用 not-same 引用类型的原因。请告诉我一些使用它更合适的条件

3 个答案:

答案 0 :(得分:1)

这可以用于多种情况,一个简单的例子就是如果你需要一系列动物:

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

您可以拥有一些已定义的泛型方法,或者为每个扩展的类指定它们。

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
.

答案 1 :(得分:0)

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

答案 2 :(得分:0)

除了能够在程序执行期间使用相同的变量引用不同类的对象之外,通常还要保持编码选项的打开。

经典案例是:

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

编译器会拒绝,例如myList.ensureCapacity(100)因为ensureCapacity不是List方法。只有List方法可用于myList。如果在程序运行并且已经测量之后,事实证明使用LinkedList会使程序更快,只有构造函数调用更改。 myList没有任何功能可以用于任何List。