2012-09-20 114 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