2

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

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(){}

}

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

4

5 回答 5

3

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

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

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

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

于 2012-09-20T10:27:28.233 回答
1

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

于 2012-09-20T10:29:01.493 回答
0

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

于 2012-09-20T10:25:14.760 回答
0

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

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

于 2012-09-20T10:28:15.650 回答
0

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

于 2012-09-20T10:29:16.770 回答