【问题标题】:JVM - Order of execution of sub class methods and the use of @override [duplicate]JVM - 子类方法的执行顺序和@override的使用[重复]
【发布时间】:2013-07-26 18:54:42
【问题描述】:

这是一个新手问题。 我读到 JVM 的执行从在层次结构中的最低类中搜索方法名开始,如果该方法在该类中不可用,它会遍历父类以查找该方法。

如果是这种情况,为什么我们需要使用“@override”为继承的类添加自定义逻辑?

下面的例子说明了我的问题

class superclassA
{

method()
{
}

}

class subclassB extends superclassA
{

@Override 
//While executing if JVM starts looking for the method name from the lowest hierarchy
//then why do we have to use "override" as the methodname will be matched from the lowest level itself?
method() 
{
--custom subclass specific code...
} 

}

【问题讨论】:

  • 你不需要@Override。它是最近才引入的(Java 1.5)并且是完全可选的。 - 它的目的是避免程序中的错误,因为它告诉编译器您实际上打算覆盖特定方法。例如,如果您输入错误的方法名称,则继承的方法不会被覆盖,这可能会导致一些讨厌的错误。使用@Override,如果带注释的方法不实际上覆盖了继承的方法,编译器至少应该警告你。
  • 谢谢hanno..它解释了
  • @HannoBinder 1.5 是相当新的?到 1.5 发布时,它的发布时间超过了 1.0。
  • @TomHawtin-tackline 当然,你(几乎)是对的。实际上只有一点是 1.0、1.1、1.2 和 1.4 在没有 @Override 的情况下也能正常运行,这意味着强制使用此注释将在语法上使所有为 1.5 以下的任何版本编写的程序都无效,留下“仅”1.5、1.6、和 1.7 是“兼容的”;这就是 @Override 是可选而不是必需的一个明显原因。

标签: java oop


【解决方案1】:

如果是这种情况,为什么我们需要使用“@override”为继承的类添加自定义逻辑?

我们没有。 @Override 注释没有技术意义 - 它的存在是为了记录此方法覆盖超类中的一个这一事实,这有一些优点:

  • 如果您查看代码,它会告诉您有一个超类方法可能对理解该方法的作用很重要
  • 如果超类方法的签名发生更改,而子类方法实际上不再覆盖它,则会出现编译器错误。
  • 如果您在不使用注释的情况下覆盖方法,则会收到编译器警告,以防您无意中这样做。

【讨论】:

    【解决方案2】:

    @Override 只是帮助 Java 编译器检测源代码中的错误,如果使用 @Override 注释的方法实际上没有覆盖它,编译器会生成错误。

    使用@Override 来注释覆盖超类型方法的方法不是强制性的。

    【讨论】:

      【解决方案3】:

      你不需要@Override。但它是一个有用的注释,它使编译器检查你是否真的覆盖了你所说的方法。当你@Override 一个方法实际上并没有覆盖一个方法时,编译器会通知你这个差异。此外,它只是让您的代码更清晰:因为 Java 中的所有方法都是隐式虚拟的,并且派生类中的方法与 super 类中的非 final 方法具有相同签名的方法隐式覆盖它1,添加@Override 使代码更易于人类 理解。

      1:需要明确的是,您可以不在派生类中拥有与超类中的final 方法具有相同签名的方法。p>

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-09-26
        • 2014-12-14
        • 2021-11-08
        • 2014-04-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多