Animal a = new Horse()和Horse c = new Horse()之间的区别

时间:2012-05-07 16:03:13

标签: java inheritance

假设Horse类是Animal类的子类。

  • a和c都使用Horse class

  • 中的方法和实例变量
  • c也可以使用Animal类中的方法。 那么这两个参考变量之间是否存在差异。

感谢您的回复

6 个答案:

答案 0 :(得分:10)

错误。
a无法仅在Horse类中使用方法,因为a未声明为Horse

答案 1 :(得分:2)

其中一个是编程到一个界面,另一个是编程到一个实例。

第一个:

Animal a = new Horse();

你可以在任何需要动物实例的地方使用这个物体,可以是任何种类的动物。

Animal d = new Dog();

public void MakeSound(Animal a)
{
 a.makeSound();
}

在这种情况下,如果您的Animal类是抽象类(如果方法是抽象的)或接口,则必须实现该方法。

虽然您在Horse类上有方法,但只有在使用Horse h = new Horse();

时才能使用这些方法

首选编程接口。

答案 2 :(得分:1)

一般来说,您应该始终选择与其用法兼容的最不具体的变量类型,以便更容易阅读。实际上,如果您使用List var而不是ArrayList,则很明显您的代码中不需要ArrayList特定内容。

答案 3 :(得分:0)

对象a无法引用Horse中的方法/变量,除非它是经过类型转换的。

答案 4 :(得分:0)

马是否继承自动物?

如果是这样的话,你可以打电话给Super。[来自动物的方法] 和马。[一种来自马的方法]

马可以从动物身上获取所有方法,因为它们是遗传的, 但是动物不能从马中获取方法,因为它们只适用于马。

答案 5 :(得分:0)

这里有两个重要的概念:参考的静态类型;这是宣布的;和引用的运行时类型;这是引用在运行时指向的实际类型。

在您的示例中,两个变量都具有运行时类型Horse,但a具有静态类型Animal。这会影响您对代码中两个变量的处理方式,其中静态类型由编译器强制执行;无论其运行时类型如何。

因此,即使他们都引用Horse个实例,也只能通过c调用Horse - 特定方法(不在a上投射或使用反射)。< / p>