有人可以解释这三个声明之间的差异。
Animal var = new Dog()
Dog var = new Dog()
Dog var = new Animal()
第二个声明最常用,但我不明白左派对正确的班级有什么作用,或者当你使用其中一个对比时。
假设是Dog extends Animal。
答案 0 :(得分:1)
右边的"类型" ([Authorize]
)是正在创建的实例的实际类型。
它必须是真正的类(不是接口)。
这个类定义了真实的,实现的行为"新对象。
左边的"类型" (Dog
)是用于存储对正在创建的实例的引用的变量的类型。
左边的"类型"必须是右边"类的祖先类/接口" (否则你必须做一个演员表)。
使用此变量(没有强制转换),您只能访问Animal
的属性/方法(没有Animal
的其他属性/方法),并且您可以假设 {的合同已实现{1}} ,但不知道任何细节,如果类型为Dog
,您就会知道这些细节。
这是非常基本的多态性,请阅读相关教程/书籍以获得更多见解。
这是一个小例子:
Animal
请按以下步骤查看:所有Dog
都是Animal a1 = new Animal(); // works
Animal a2 = new Dog(); // works, Dog a subtype of animal
Dog d1 = new Animal(); // does not work, Animal not a subtype of Dog
a1 = a2; // works
d1 = a1; // doesn't work
// If Dog has a function "bark" and Animal has a function "breathe"
a1.breathe(); // works
d1.breathe(); // works
d1.bark(); // works
a1.bark(); // does not compile, Animal not always a Dog
s,因此您可以为Dog
变量分配Animal
值。但并非所有Dog
都是Animal
,因此您无法将所有Animal
分配给Dog
类型的变量。
答案 1 :(得分:0)
狗是一种特殊的动物。所以你可以叫狗动物。
当然,狗是狗。
动物可能不是狗,可能是猫,老鼠等。所以你不能用这种方式。