【问题标题】:Polymorphism on simple example简单示例的多态性
【发布时间】:2015-10-10 08:20:55
【问题描述】:

我想我已经开始理解这个话题了,但还没有完全理解。有人可以就这个例子向我解释一下吗:

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 类。 对不起,如果我给出了太愚蠢或太简单的例子。我希望你明白我想说的话。 提前致谢。

【问题讨论】:

    标签: java oop polymorphism


    【解决方案1】:

    理解多态性是个好问题。我不确定 Whale 是否应该扩展 Cow ;),但我可以向您展示一些不同的结构:

    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(); 创建对象没有区别和鲸鲸 = new Whale(); 你清楚吗?

    【讨论】:

    • 吉普车。现在它更清楚了。与我相比非常好的例子。谢谢
    【解决方案2】:

    使用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());
    

    【讨论】:

      【解决方案3】:

      在您的示例中,您将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 上定义。

      【讨论】:

        【解决方案4】:

        或者,当您创建一种处理奶牛的方法时,这种差异可能会变得更容易理解,比如说一个收集所有奶牛、鲸鱼、狗、马等的名字的方法。

        此方法不需要了解鲸鱼或牛的任何其他子类。尽管如此,它应该可以工作。示例:

        public static List<String> collectNames(List<Cow> cows)
        {
                return cows.stream().map(c -> c.getName()).collect(Collectors.toList());
        }
        

        而且我不确定为什么鲸会延伸牛。如果这是真的,我们应该在 NG 频道上看到它。一个更恰当的例子可能是:

        动物 -> 牛、狗、猫、鲸鱼

        Person -> 学生、司机、开发人员 等等

        【讨论】:

        • 我只是想用牛做一条鲸鱼))。生病给 NG 写一封电子邮件,一旦它在电视上播出,我会告诉你)))
        猜你喜欢
        • 2023-03-24
        • 1970-01-01
        • 1970-01-01
        • 2011-08-20
        • 2014-08-29
        • 2011-04-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多