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

下面我不能完全理解: Animal ah = new Horse();// 引用类型是 Animal 对象是 Horse
我总是保持引用类型与对象相同
我想知道使用not-same的原因引用类型。请告诉我一些使用它更合适的条件

4

3 回答 3

2

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

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");
    }
}

在 Animal 中你不知道该做什么,所以你可以使用类似的东西

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

问题是,如果你遍历数组中的每一个动物,它会使用为它定义的方法。

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

会输出:

HEEEHREHE
MOO
.
于 2012-11-28T03:28:59.070 回答
1

除了在程序执行期间能够让相同的变量引用不同类的对象外,通常这样做是为了保持编码选项的开放。

经典案例是:

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

编译器会拒绝例如 myList.ensureCapacity(100) 因为 ensureCapacity 不是 List 方法。myList 只能使用 List 方法。如果在程序运行并被测量之后,结果证明使用 LinkedList 会使程序更快,那么只有构造函数调用会发生变化。没有对 myList 做任何对任何 List 都不起作用的事情。

于 2012-11-28T03:45:54.843 回答
0

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

于 2012-11-28T03:22:36.830 回答