【问题标题】:Overloading and overriding static and non static methods in Java在 Java 中重载和覆盖静态和非静态方法
【发布时间】:2020-04-16 20:48:12
【问题描述】:

我试图了解重载和覆盖静态和非静态方法的工作原理。事实上,我试图了解这些方法通常如何出现在父类和子类中。我想出了以下规则:

  1. 我们不能覆盖静态方法,而是隐藏它们。通过隐藏,我们的意思是在编译时根据引用变量类型决定执行哪个方法,这与覆盖不同(在运行时根据实例类型选择执行哪个方法)。
    例如让class B extends A,然后static B.method()隐藏static A.method()
  2. 我们可以覆盖实例方法。
    例如B.method() 覆盖 A.method()
  3. 具有相同签名的两个或多个方法不能以静态或非静态的任何组合存在于同一类中。
    例如B 不能同时包含 static method(float)method(float)
  4. 两个或多个具有不同签名的方法可以以静态或非静态的任意组合存在于同一个类中。
    例如B 可以包含 static method()static method(int)method(float)
  5. 静态方法不能覆盖非静态方法。
    例如B.method() 不能覆盖 static B.method()
  6. 非静态方法不能覆盖静态方法。
    例如static B.method() 不能覆盖 B.method()

我对这些观察是否正确?我也错过了任何规则吗?

【问题讨论】:

    标签: java


    【解决方案1】:

    规则:

    • Polymorphism 适用于覆盖,而不适用于重载。
    • Overriding 是一个运行时概念,而重载是一个编译时概念。

    多态性-> 真实的对象类型@runtime(而不是引用变量的类型)决定了使用哪个overridde 方法。相反,引用类型决定了在编译时使用哪个overload 方法。

    关于静态方法: 它们不能覆盖,但可以在 Java 中重载隐藏

    【讨论】:

      【解决方案2】:

      我对这些观察是否正确?

      他们大多是正确的。我会将 3 和 4 更改为:

      1. 在类型擦除后具有相同签名的两个或多个方法不能以静态或非静态的任何组合存在于同一类中。

      2. 两个或多个具有不同签名的方法类型擦除后可以以静态或非静态的任意组合存在于同一个类中。

      例如,您不能在同一类中拥有 method(List<String>)method(List<Integer>)。实际上,您也不能将其中一个放在父类中,而将另一个放在子类中。因为无论哪种方式,你都是overloading a method where the formal parameter types of each overload erase to the same raw type

      另外,你没有提到任何关于重载的规则......一般规则是,只要两个方法在同一个类中,(或其中一个继承自父类),它们的名称就是相同,但它们不会互相覆盖 --> 它们是彼此的重载。

      在我看来,你的“规则”对于学习 Java 的人来说已经足够有用了,但是如果你对如何以更严格的方式表达这一点感兴趣,请查看 Language Specification,特别是 §8.4.8 覆盖 &隐藏。您的大多数规则要么在其中明确说明,要么是其中声明的结果。通过阅读语言规范,您还可以找出您遗漏的内容。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-11-07
        • 2011-01-29
        • 2011-06-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-07-06
        相关资源
        最近更新 更多