假设Horse
类是Animal
类的子类。
a和c都使用Horse
class
c也可以使用Animal
类中的方法。
那么这两个参考变量之间是否存在差异。
感谢您的回复
答案 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>