假设Horse
该类是类的子Animal
类。
Horse
a 和 c 在类中都使用方法和实例变量c 也可以使用
Animal
类中的方法。那么这两个参考变量之间有什么区别吗?
感谢您的任何回复
假设Horse
该类是类的子Animal
类。
Horse
a 和 c 在类中都使用方法和实例变量
c 也可以使用Animal
类中的方法。那么这两个参考变量之间有什么区别吗?
感谢您的任何回复
错误的。
a
不能只在Horse
类中使用方法,因为a
没有声明为Horse
.
其中一个是编程到接口,另一个是编程到实例。
与第一个:
Animal a = new Horse();
您可以在需要动物实例的任何地方使用此对象,可以是任何种类的动物。
Animal d = new Dog();
public void MakeSound(Animal a)
{
a.makeSound();
}
在这种情况下,如果您的 Animal 类是抽象类(如果方法是抽象的)或接口,则必须实现该方法。
虽然您在 Horse 类上有方法,但只有在使用时才能使用这些方法Horse h = new Horse();
首选接口编程。
一般来说,您应该始终选择与其用法兼容的最不具体的变量类型,只是为了使其更易于阅读。在实践中,如果您使用List
var 而不是ArrayList
,则很明显您不需要ArrayList
代码中的任何特定内容。
该对象a
不能引用方法/变量,Horse
除非它是类型转换的。
马是从动物那里继承来的吗?
如果是这样的话,你调用 Super.[a Method from animal] 和 Horse.[a Method from horse only]
Horse 可以访问 animal 的所有方法,因为它们是继承的,但 animal 不能访问 horse 的方法,因为它们仅适用于 horse。
这里有两个重要的概念需要了解:引用的静态类型;这是它被声明的那个;以及引用的运行时类型;这是引用在运行时指向的真实类型。
在您的示例中,两个变量都具有运行时类型Horse
,但a
具有静态类型Animal
。这会影响您在代码中处理这两个变量的方式,其中它们的静态类型由编译器强制执行;无论它们的运行时类型如何。
因此,即使它们都引用Horse
实例,c
您也只能通过调用Horse
特定方法(无需强制转换或使用反射a
)。