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 引用类型的原因。请告诉我一些使用它更合适的条件
答案 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。