繁体   English   中英

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

[英]why is reference type can be different from object type in 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

我在下面无法完全理解: Animal ah = new Horse(); //引用类型为Animal,对象为Horse
我总是保持引用类型与对象相同
我想知道用未相同的参考type.Please告诉我一些情况,它是更适合使用它的原因

这在几种情况下都有效,一个简单的例子就是如果您需要一系列动物:

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
.

因此,您可以将Animal或Horse中的任何一种用作“ ab”类型。 在这种特殊情况下,按动物类型引用对象的有用之处在于,在以后的阶段中,当您想让ah指向其他动物对象说“狗”(实现了动物接口)时,在其他代码位置您将不会需要在代码中的其他动物类型上进行更改。 因此,通过接口类型引用对象引用可以自由地动态更改实际的实现实例,并且也将实现类隐藏在外部世界中。

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

经典案例是:

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

编译器将拒绝例如myList.ensureCapacity(100),因为sureCapacity不是List方法。 只有List方法可以用于myList。 如果在程序运行并经过测量之后,发现使用LinkedList可以使程序运行更快,则仅构造函数调用会更改。 myList无法完成任何List无法使用的工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM