使用以下代码:
public class Animal {
....// class stuff here
}
public class Cat extends Animal {
....// class stuff here
}
尝试创建新的Cat对象时,有什么区别?:
Cat myCat = new Cat(); //and
Animal myCat = new Cat();
我之前读过的是你应该在左边声明最通用的列表(即
List<String> = new LinkedList<String>();
)因此,如果您想要更改实现以使用ArrayList,则需要更改的代码更少。
在所有情况下,您是否应始终在laft上声明最通用(最不具体)(在本例中为Animal myCat = new Cat();
)?
答案 0 :(得分:2)
创建的内容没有区别。唯一的区别在于参考类型。如果您引用了Animal,并尝试使用不在Animal中的Cat方法,编译器将给出错误。如果你在Cat中调用一个被覆盖的方法(注意:与重载不同),它将正确调用Cat的方法,即使引用是Animal。
答案 1 :(得分:1)
最具体的相关。否则,所有变量都是Object
。
根据经验,如果您的逻辑需要调用特定于Cat
的方法,那么您应该将变量声明为Cat
。如果没有,那么如果您需要Animal
的任何方法,那么它应该是Animal
,依此类推。
答案 2 :(得分:1)
假设我们有以下代码
public class Animal {
public void doSomething() {
// ...
}
}
public class Cat extends Animal {
public void miau() {
// ...
}
}
差异是
Cat myCat1 = new Cat(); //and
Animal myCat2 = new Cat();
myCat1.miau(); //ok
myCat1.doSomething(); //ok
myCat2.miau(); // doesn't compile
myCat2.doSomething(); // ok
这取决于你应该使用哪一个。一个例子是一个列表。如果你知道你只把Cat放入这个列表中,请将其声明为:
ArrayList<Cat> list = new ArrayList<Cat>();
但如果你知道你把各种各样的动物放在那里,你需要做出如下声明
ArrayList<Animal> list = new ArrayList<Animal>();
您还可以执行以下操作:
ArrayList<Object> list = new ArrayList<Object>();
但这不是好的编码风格。因为如果您想调用miau
之类的方法,首先需要检查要调用它的元素是否为Cat
。然后你甚至需要施展它。
答案 3 :(得分:1)
之间的区别
Cat myCat = new Cat(); //and
Animal myCat = new Cat();
是前者编程为具体实现,而后者编程为接口/超类型。
后一种方法是首选方法,因此实际的运行时对象不会绑定在您的代码中。 使用你的动物类的班级不必知道实际的动物物体(除了猫之外,它可以是相当大的数量)。
所以你可以做到
animal.makeSound()
后者使你以多态方式引用动物(猫/任何其他动物)
答案 4 :(得分:0)
只是用 Layman的语言来解释,一切都取决于你想要什么,我会给出一个非常简单的例子,因为其余的解释你可以从我提供的链接中获得..
假设您想要计算篮子里有多少猫,那么当然你不能选择第二种情况......你必须创建一个List<Cat>
并存储Cat
引用它们..因为Animal
引用也可以指向Dog
对吗?因此,List<Animal>
可以容纳Dog
..所以,你可能无法获得正确的猫数......或者,你可以得到,但还有一点点工作......
如果您只想获得有关Animal
的信息,例如您拥有的各种类型的动物,您可以愉快地使用第一个动物。使用{创建一个对象{1}}参考..这可以容纳你所有的动物..