我想我已经开始理解这个话题了,但并不是完全理解。有人可以通过这个例子向我解释:
public class Solution
{
public static void main(String[] args)
{
Cow cow = new Whale();
System.out.println(cow.getName());
}
public static class Cow
{
public String getName()
{
return "Im cow";
}
}
public static class Whale extends Cow
{
public String getName() {
return "Im whale";
}
}
}
这个叫什么区别:
Cow cow = new Whale();
System.out.println(cow.getName());
和此:
Whale whale = new Whale();
的System.out.println(whale.getName());
我将具有相同的输出,但在什么情况下或者当我们应该为Cow类调用方法时,以及何时形成Whale类。 对不起,如果我给出了太愚蠢或太简单的例子。我希望你没有理解我想说的话。 提前致谢。
答案 0 :(得分:3)
理解多态性是一个很好的问题。我不确定鲸鱼应该延伸牛;),但我可以向你展示一些不同的结构:
public class Solution {
public static void main(String[] args) {
Animal animal1 = new Cow();
Animal animal2 = new Whale();
ArrayList<Animal> myAnimals = new ArrayList<Animal>();
myAnimals.add(animal1);
myAnimals.add(animal2);
//show all my animals
for (Animal animal : arrayList) {
System.out.println(animal.getName());
}
}
public static class Animal {
public String getName() {
return "Im general animal";
}
}
public static class Cow extends Animal {
public String getName() {
return "Im cow";
}
}
public static class Whale extends Animal {
public String getName() {
return "Im whale";
}
}
}
在上面的例子中,我创建了由Cow和Whale扩展的Animal类。我可以创建我的动物列表并显示它们的名字。 在你的例子中,为Cow cow = new Whale()制作一个对象没有区别;和鲸鱼鲸鱼=新鲸鱼(); 你觉得好吗?
答案 1 :(得分:1)
使用Cow cow = new Whale()
时,对象的创建方式与Whale
类似,但只能访问Cow
个方法。
例如,如果您向Whale
类添加方法:
public int getDeepestDive() {
// some code
}
此代码可以使用:
Whale whale = new Whale();
System.out.println(whale.getDeepestDive());
此代码会告诉您Cow
没有名为getDeepestDive()
的方法:
Cow whale = new Whale();
System.out.println(whale.getDeepestDive());
答案 2 :(得分:1)
在您的示例中,您为Whale
分配了Cow
的实例。但是对象仍然是Whale
。这就是为什么你得到相同的输出。现在考虑这个Whale
类:
public static class Whale extends Cow {
public String getName() {
return "Im whale";
}
public void submerge() {
System.out.println("Hunting submarines");
}
}
重写方法将始终在实例化的对象类型上调用方法,除非显式强制执行(使用强制转换)。但是,这个新的Whale
实现有一个新方法,该方法未在Cow
上定义。因此,您可以致电:
Whale whale = new Whale();
whale.submerge();
但你不能写:
Cow mascaradedWhale = new Whale();
mascaradedWhale.submerge();
在第二个示例中,您将在方法调用上收到编译错误,因为此方法未在类Cow
上定义。
答案 3 :(得分:1)
或者当您创建一个处理奶牛的方法时,差异将变得更容易理解,比如说收集所有奶牛,鲸鱼,狗,马等的名称。
此方法不需要了解鲸鱼或任何其他牛的子类。不过它应该有效。示例:
public static List<String> collectNames(List<Cow> cows)
{
return cows.stream().map(c -> c.getName()).collect(Collectors.toList());
}
而且我不确定为什么鲸会延长牛。如果这是真的,我们应该在NG频道上看到它。一个更恰当的例子可能是:
动物 - &gt;牛,狗,猫,鲸鱼
人 - &gt;学生,司机,开发人员 等