【问题标题】:Dynamic Binding Java. Does an object have the methods of its declared type, or its actual type? [duplicate]动态绑定 Java。对象是否具有其声明类型或实际类型的方法? [复制]
【发布时间】:2015-04-18 02:36:51
【问题描述】:

假设我声明如下:

Cat elsa = new Lion();

狮子延伸猫。如果我这样声明,elsa 会是一只猫,拥有猫的所有方法,还是狮子,拥有狮子和猫的所有方法

我能找到的其他问题没有解决这个确切的问题。

【问题讨论】:

  • 你为什么不试试看?
  • 我试过了,在我看来好像它采用了声明的类型。是对的吗?我只是想确保我没有遗漏任何东西。
  • 你没有遗漏任何东西,将 elsa 声明为 Cat 将它限制为仅由 Cat 实现的方法(但可以被 Lion 覆盖)。
  • Lion 对象分配给Cat 引用不会更改对象具有的方法(在运行时)。它改变了编译器允许你访问的方法(在编译时)。如果重要的是对象具有方法,那么 java 就会有鸭子类型。它没有。你可以通过强制转换来解决这个问题,但只会让人想知道你为什么首先要费心制作Cat 类。 Cat 类型的全部意义在于说,“只要你能做猫能做的事,你就可以去这里成为 Cat,没有什么比这更需要你做的了。

标签: java dynamic binding


【解决方案1】:

您创建的对象Lion 类型,并具有Lion 对象的所有属性和方法。 变量 elsaCat 类型,因此它只能用于访问Cat 对象的方法和属性。

因此,您的问题的答案是 elsa 将是 Lion,除非您将其转换回 Lion,否则您只能将其视为 Cat。例如:

elsa.roar();          // compile error if the roar() method is only for Lion
((Lion)elsa).roar();  // will work

【讨论】:

  • 更好的设计是elsa.speak(),它可能会产生“Mew”、“Roar!”或“What's goingin' baby?”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-11-19
  • 1970-01-01
  • 1970-01-01
  • 2020-06-25
  • 2021-02-23
  • 2016-09-02
  • 2013-10-12
相关资源
最近更新 更多