2010-09-09 84 views
2

如何在java中聲明靜態類?日食希望我從聲明中移除「靜態」。java中的靜態類

static public class Constants { 

回答

1

如果用'static'表示'只能有靜態成員',那麼Java中就沒有這種東西。

內部類(只有它們)可以是靜態的,但這是一個不同的概念。 Inner static類仍然可以有實例成員。

+0

只有內部類可以是靜態的。 – Thilo 2010-09-09 03:49:21

+2

@Thilo,當你說內心時,我希望你的意思是「嵌套」。因爲「Inner」在規範中有不同的含義。只有「嵌套」類可以是靜態的。不是靜態的嵌套類被稱爲內部類 – naikus 2010-09-09 04:17:05

+0

請參閱我對Thilo的評論。內部類是非*聲明爲靜態的嵌套類。因此,如果聲明爲靜態,則不能將其稱爲內部類:) – naikus 2010-09-09 04:18:51

-2

所有頂級類別隱含地爲static,這意味着每個人都可以訪問它們。所以只有內部類可選static纔有意義。

+2

這一切都不正確。靜態並不意味着「每個人都可以訪問」,並不是所有的頂級類都可以被每個人訪問。結論並不是從前提出發的。 – EJP 2010-09-10 00:04:03

7

首先回答你的問題:

只有嵌套類可以聲明爲靜態的。頂級類別不能聲明是靜態的。

其次,內部類是一個嵌套類,沒有明確聲明爲靜態。請參閱java language spec。因此違背了這裏的一些答案,內部類不能是靜態

要從規範舉一個例子:

class HasStatic{ 
    static int j = 100; 
} 
class Outer{ 
    class Inner extends HasStatic{ 
     static final int x = 3; // ok - compile-time constant 
     static int y = 4; // compile-time error, an inner class 
    } 
    static class NestedButNotInner{ 
     static int z = 5; // ok, not an inner class 
    } 
    interface NeverInner{} // interfaces are never inner 
} 
+4

+1不會讓內部類與嵌套類混淆。我的巨大的偷情。 :-) – 2010-09-09 04:20:15

+0

如果我理解正確,嵌套類可以是靜態的或不是。嵌套接口,枚舉和註釋都是隱式靜態的。 – emory 2010-09-09 04:34:21

+0

@emory:是的。 – 2010-09-09 04:56:12

0

Eclipse中正確地抱怨,你的代碼將無法編譯爲頂層類可以」不被宣佈爲靜態。

您需要先了解靜態類的含義。

靜態類

頂層類不能被聲明爲靜態的。只有成員和嵌套的頂級類可以定義爲靜態。

如果您希望在沒有明確委派的情況下使用包含類的變量和方法,則聲明成員類。當你聲明一個成員類時,你只能在聲明這個成員類的外部類的對象的上下文中實例化該成員類。如果你想刪除這個限制,你可以聲明成員類是一個靜態類。當你用一個靜態修飾符聲明一個成員類時,它將成爲一個嵌套的頂級類,並且可以像上面解釋的那樣用作一個普通的頂級類。

嵌套的頂級類是帶有靜態修飾符的成員類。嵌套的頂級類與其他任何頂級類相似,只不過它在另一個類或接口中聲明。通常將嵌套的頂級類用作組合相關類的便捷方式,而不創建新的包。

還要檢查when should we go for static class,variables and methods in java

0

正如你已經從其他意見告知,類不能被聲明爲靜態的。但是,這個問題有其他選擇。

最簡單的方法是在所有成員變量和方法之前加上static修飾符。這基本上是你想要的。

一個稍微更復雜的選擇是讓這個類變成單例。這是一個通過使用私有構造函數和instanceOf()方法的類,或者只是一個Enum類,您只能擁有該類的一個實例。在語義上和語法上,您將該實例視爲您正在創建單例的任何特定類的普通實例,但您只能擁有該類的單個實例,該實例可通過SomeObject.instanceOf()或Enum實現中的SomeObject .INSTANCE。

您通常會使用Enums來實現這一點,減去擴展另一個類的邊緣情況。

欲瞭解更多關於單身人士的完整信息,請訪問下面的鏈接。

Design Patterns in Java - Singleton

0

有C#的靜態類Java中沒有直接等價的,但在我看來,最接近的是一個空的枚舉,這初看起來似乎不可思議,但有道理你越去想它。 Java中的枚舉(與C#不同)基本上是一組單實例,它們都實現相同的抽象基類和接口。使Java中的正常單最快,最安全的方式是像這樣:

enum Foo { 
    INSTANCE; 
    public Bar doSomething(Baz baz) { 
     return Bar.fromBaz(baz); // yadda yadda 
    } 
} 

因此,既然我們面對的是套單身的,它使我們能有一個空集的意義。而一個空集意味着不可能有實例。這在概念上與C#中的靜態類相同。

enum MyUtilities { 
    ; 
    static Bar doSomething(Baz baz) { 
     return Bar.fromBaz(baz); // yadda yadda 
    } 
    static final String SOME_CONSTANT = "QUX"; 
} 

這是偉大的,因爲你不會失去的,因爲硬盤的測試覆蓋率在最後的類來測試私有構造函數,並且代碼比空私有構造final類清潔劑。

現在,如果靜態類都是爲了在一個接口上工作而且你能控制該接口,那麼你應該在接口上實現靜態方法(在C#中你不能這樣做)。