【问题标题】:The working of the static imports静态导入的工作
【发布时间】:2012-09-12 16:52:28
【问题描述】:

我所拥有的是两个这样的课程。

public class Class1 {

    public static void staticMethod1(){}

    public static void staticMethod2(){}

    public static void commonStaticMethod(){}

}

和第 2 类一样

import static Class1.*;

public class Class2 {

    public static void commonStaticMethod(){}

}

令我惊讶的是,它编译时没有任何错误甚至警告。那么静态导入是如何避免重载的呢?

【问题讨论】:

    标签: java static import overloading


    【解决方案1】:

    静态导入不会重载。它们只是语法糖,可以缩短其他类的静态方法的使用时间。

    也就是说,当调用在当前上下文中不可用的方法时,它会检查静态导入以查看是否有匹配的静态方法。

    所以staticMethod() 会扩展为SomeOtherClass.staticMethod()

    在您的特定情况下没有冲突,因为您不尝试调用commonStaticMethod。如果你这样做,编译器要么抱怨歧义,要么默认使用当前类中的静态方法(我不确定哪个——我不在静态导入中使用 *)。但这是您自己可以轻松检查的内容。

    【讨论】:

      【解决方案2】:

      您对静态导入的作用感到困惑。 B.* 的类 A 中的静态导入只允许在 A 的代码中调用 B 的静态方法,而无需在静态方法调用之前添加 B.。它与覆盖无关,也不会将 B 中的方法添加到 A 类中。

      【讨论】:

        【解决方案3】:

        我不明白你在这里期待什么。您始终可以覆盖封闭范围或另一个范围中的名称,import 所做的只是打开其他范围。

        【讨论】:

        • 那如果我调用了commonStaticMethod(),是调用Class1还是Class2的方法?
        • @SriHarshaChilakapati 这完全取决于您从哪里调用它。如果你从 Class2 中调用它,你会得到 Class2 的版本。在您完成 import static Class2.* 并且没有覆盖的范围内也是如此。如果它在 Class1 的范围内,您将获得 Class1,就像您已经完成 import static Class1.* 并且没有覆盖一样。当然,如果你已经完成了两个导入,你会得到一个歧义编译错误。
        • 您的意思可能是隐藏与覆盖。
        • @assylias 不,谢谢,我的意思是覆盖。编译器负责隐藏:程序员负责覆盖。
        【解决方案4】:

        没有重载,因为Class2 没有扩展Class1。隐藏在其中,因为Class2 的方法名称与导入的方法名称相同,因此对该方法名称的任何非限定引用都将假定为本地实例。要使用导入的方法,您必须使用 Class1.commonStaticMethod 限定方法

        【讨论】:

          【解决方案5】:

          您刚刚在 Class2 中隐藏了 Class1 的 commonStaticMethod

          如果您对具有相同方法的 2 个类进行静态导入并尝试在您的类中使用该方法,您会得到预期的错误。

          【讨论】:

          • @chaitanya10 重新定义是非常正确的术语。而你正在做的是“隐藏”其他静态方法。
          猜你喜欢
          • 2014-06-14
          • 2018-03-10
          • 1970-01-01
          • 2013-01-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多