![](/img/trans.png)
[英]Why can a variable of type Object hold a reference to an array in 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.