0

假设Horse该类是类的子Animal类。

  • Horsea 和 c 在类中都使用方法和实例变量

  • c 也可以使用Animal类中的方法。那么这两个参考变量之间有什么区别吗?

感谢您的任何回复

4

6 回答 6

10

错误的。
a不能只在Horse类中使用方法,因为a没有声明为Horse.

于 2012-05-07T16:05:02.077 回答
2

其中一个是编程到接口,另一个是编程到实例。

与第一个:

Animal a = new Horse();

您可以在需要动物实例的任何地方使用此对象,可以是任何种类的动物。

Animal d = new Dog();

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

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

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

首选接口编程。

于 2012-05-07T16:06:07.290 回答
1

一般来说,您应该始终选择与其用法兼容的最不具体的变量类型,只是为了使其更易于阅读。在实践中,如果您使用Listvar 而不是ArrayList,则很明显您不需要ArrayList代码中的任何特定内容。

于 2012-05-07T16:06:38.617 回答
0

该对象a不能引用方法/变量,Horse除非它是类型转换的。

于 2012-05-07T16:07:12.767 回答
0

马是从动物那里继承来的吗?

如果是这样的话,你调用 Super.[a Method from animal] 和 Horse.[a Method from horse only]

Horse 可以访问 animal 的所有方法,因为它们是继承的,但 animal 不能访问 horse 的方法,因为它们仅适用于 horse。

于 2012-05-07T16:12:23.177 回答
0

这里有两个重要的概念需要了解:引用的静态类型;这是它被声明的那个;以及引用的运行时类型;这是引用在运行时指向的真实类型。

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

因此,即使它们都引用Horse实例,c您也只能通过调用Horse特定方法(无需强制转换或使用反射a)。

于 2012-05-07T16:25:00.280 回答