2012-09-20 174 views
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(){} 

} 

让我吃惊,这已经编译没有任何错误,甚至警告。那么静态导入如何逃离重载?

回答

3

静态导入不会超载。它们仅仅是语法上的糖,可以缩短其他类的静态方法的使用。

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

所以staticMethod()将扩大到SomeOtherClass.staticMethod()

在您的特定情况下是没有冲突的,你不要试图打电话commonStaticMethod。如果你这样做,编译器会抱怨模糊或者默认当前类中的静态方法(我不确定哪一个 - 我在静态导入中不使用*)。但这是你可以轻松检查自己的东西。

0

我不明白你在这里期待什么。您始终可以覆盖封闭范围或其他范围中的名称,并且所有import都会打开其他范围。

+0

然后方法,如果我叫'commonStaticMethod()',不是调用该方法Class1中或Class2中? –

+0

@SriHarshaChilakapati它完全取决于你从哪里来。如果你从Class2中调用它,你会得到Class2的版本。在你已经完成'import static Class2。*'的范围内,并且没有覆盖。如果它在Class1的范围内,你会得到Class1的,就像你已经完成了'import static Class1。*'那样,并且没有覆盖。当然,如果你已经完成了两次导入,你会得到一个模糊的编译错误。 – EJP

+0

你可能意味着隐藏与重写。 – assylias

0

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

如果你有同样的方法2类的静态导入并尝试使用该方法在您的类你会得到你所期望的错误。

+0

你不能重写静态方法,你只能重新定义它们。 – PermGenError

+0

@chaitanya10重新定义是相当正确的术语。而你在做的是“隐藏”另一种静态方法。 – Dunes

+0

@ chaitanya10编辑我的答案。感谢您指出。 – basiljames

1

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

0

没有超载,因为Class2不延伸Class1。因为Class2有一个方法名称与导入的方法名称相同,所以对此方法名称的任何非限定引用将假定为本地实例。要使用导入一个你必须限定在与Class1.commonStaticMethod