【问题标题】:Constructing objects using inheritance (java)? [closed]使用继承(java)构造对象? [关闭]
【发布时间】:2019-12-29 15:53:08
【问题描述】:

所以规则规定,如果 B 是 A 的子类,那么当期望 A 类型的对象时,B 会这样做。

因此,如果我在超类 Animals 中有一个非静态方法并使用子类 Dog 的对象调用它,它将正常运行,例如Dog rexy = new Dog(); -> rexy.someMethodFromAnimals();。然后,我从该对象的静态类型中获得什么好处 Animals 例如Animals rexy = new Dog();。这会带来什么?

【问题讨论】:

  • 我真的不明白您所说的“正常运行”和“该对象动物的静态类型”是什么意思。你能改写一下吗?
  • 就像这样,它会编译并运行。因此我想知道为什么需要创建Animals rexy = new Dog(); 而不仅仅是Dog rexy = new Dog();。我所说的静态是指静态绑定类型。
  • 虽然不是在谈论界面,但从这个意义上说,我可以在所有 SO 中搜索类似的东西并声称“可能重复”。另外,我得到了正确的答案,为什么它太宽泛了?
  • 在多态中隐式使用,你可以将一个超类列表传递给一个函数,并循环遍历子类并执行相同的覆盖方法,但每个子类对象会以不同的方式执行。

标签: java object inheritance subclass superclass


【解决方案1】:

假设您有四种动物 - DogCatRatFish

现在,您希望能够跟踪家中的所有宠物。为此,您可以保留多个不同种类动物的列表。或者,您可以提取Animal 类型的超类,其中包含所有动物共有的字段和方法,并为所有宠物保留一个ArrayList<Animal> myPets = new ... 列表。

这样做的好处是,当您想将所有动物都视为动物时,您有能力做到这一点,即使动物个体可能具有完全不同的特征。

【讨论】:

    【解决方案2】:

    简而言之,您可以尽可能通用。诚然,使用Animals dog = new Dog(); 并没有比Dog dog = new Dog(); 带来太多好处。然而,Animals animal = someWebService.getFirstAnimal(); 可以工作,而Dog dog = someWebService.getFirstAnimal(); 不会编译,因为getFirstAnimal() 可能会返回一个Animal

    顺便说一句,你的班级真的应该叫Animal,而不是Animals。声明 Integers i = 1; 对您来说会很奇怪,自定义类型也是如此

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-07-09
      • 2021-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-21
      • 2011-09-09
      • 2010-12-11
      相关资源
      最近更新 更多