【问题标题】:Benefit of method hiding in javajava中方法隐藏的好处
【发布时间】:2012-08-22 12:11:51
【问题描述】:

我已经阅读了 Java 中的方法隐藏概念,但我不确定我是否理解其中的优点。在哪些情况下方法隐藏有用?

【问题讨论】:

  • 您可以对普通用户隐藏类内部。
  • @LukasKnuth 我认为这不是 OP 所指的意思。
  • 是的。我犯了与@LukasKnuth 相同的错误,不得不删除我的答案……让我傻了。
  • @pratikabu 那不叫overridinghidingoverriding 是相互排斥的概念。
  • @MarkoTopolnik 感谢您纠正我.. 这是新的.. 当您在SubClass 中定义与BaseClass 相同签名的静态方法时,可以实现Method hiding。我从未见过它的用法..

标签: java overriding method-hiding


【解决方案1】:

您可以在这里阅读更多内容http://docs.oracle.com/javase/tutorial/java/IandI/override.html

简而言之,好处是您可以在子类中实现静态方法,该方法与超类中的静态方法具有相同的签名。如果你不能这样做,你就不能将这样的方法添加到子类中,如果你将这样的方法添加到超类中,那么它的所有子类都将无法编译。

顺便说一句:您可以通过将静态方法设为 final 来使静态方法不允许隐藏。

class Superclass {
    public static final void method() { }
}

class Subclass extends Superclass {
    public static void method() { } // doesn't compile
}

要允许隐藏方法,您可以将其设为非最终方法

class Superclass {
    public static void method() { }
}

【讨论】:

  • 我不明白你的意思:“如果你不能这样做,你就不能向子类添加这样的方法,如果你向超类添加这样的方法,它的所有子类都会失败编译”
  • 如果不能在超类中隐藏方法,就无法在子类中定义不同的实现。即它不会编译。
  • 哦,我明白了,但我还不明白它的好处。 Method Overriding 对于改变实例上方法的行为很有用,但在静态方法中不存在任何有趣的东西。
  • 也许添加的示例会有所帮助。
【解决方案2】:

这没有“好处”,只是语言规范决定如何处理相关类的静态方法碰巧具有相同签名的情况。语言设计者找不到提供“覆盖”功能的明智方法1,因此他们采用了简单的方法。


1 有一种方法可以使静态方法的覆盖在抽象的 OO 级别上工作,正如在 Objective-C 中完成的方式所证明的那样。然而,替代方案更难理解。

【讨论】:

  • 只有当类也是一种对象时,覆盖才有意义,因此按其类型分派才有意义。对于 Java 来说,这意味着对其基础的彻底改变。我看不出有什么方法可以在保持基础不变的同时“处理”它。
  • 同意,事实上,我认为通常不鼓励这样做,因为这种行为是不直观的。开发人员很容易认为他们正在覆盖刚刚隐藏的方法,从而意外地从基类而不是进行隐藏的类中获取行为。
  • @MarkoTopolnik 但是java.lang.Class<T> 的实例是对象,因此至少在原则上可以对它们进行调度。我可以很容易地设想对规范进行更改,将静态方法的隐藏替换为覆盖,特别是因为设计人员非常注意保持完整的签名兼容性。对规范的改变也不会那么深。不过,对编译器的更改可能非常重要。
  • 我认为这种变化的深度确实会非常大。在Class 对象上调度与它所代表的类的静态方法几乎没有关系,并且从当前语义到新语义没有简单的路径。类型及其Class 对象是两个不同的概念。我能看到的最接近的是 Scala 所做的,你可以看到它有多么不同。
  • @MarkoTopolnik 可以通过添加一个描述静态方法的 vtable 来实现对类的调度,在静态调用中拖曳类对象,就像在调用中传递 this 引用一样实例方法。 Objective-C 以这种方式实现了它(好吧,或多或少;他们的调度机制以不同的方式完成)并且它对他们来说工作得很好。该功能对于构建静态工厂非常有用 - 它可以让您跳过工厂对象的单独类层次结构。
猜你喜欢
  • 2015-12-26
  • 1970-01-01
  • 2023-03-29
  • 1970-01-01
  • 2020-04-21
  • 2011-02-09
  • 1970-01-01
  • 1970-01-01
  • 2015-05-31
相关资源
最近更新 更多