2012-10-01 21 views
4

可以請你幫我如何創建一個不可繼承的類,並且應該在行爲中是靜態的(意味着我們不應該能夠創建它的實例)。我需要這個類來存儲常量值。謝謝。如何在java中創建一個不可繼承和靜態的類?

+2

「靜態行爲」不是一個有意義的描述。 「靜態」修飾符實際上允許在某些類(即內部類)上,它意味着不同的東西。你真正應該問的是如何讓一個類不可繼承和*不可實例化*。 –

+1

[如何在Java中構建不可實例化和非可繼承類]的可能重複(http://stackoverflow.com/questions/8848107/how-to-construct-a-non-instantiable-and-non-inheritable-class -in-java) –

回答

6

可以使用final關鍵字類不能被繼承。 但我會建議你使用EnumsEnums不能被繼承,並且每個常量值只存在一個實例。你也可以用enums做更多事情。

public enum DaysOfweek 
{ 
    SUNDAY,MONDAY..... 
} 

你可以閱讀更多關於枚舉這裏Enum Types

+2

你可以有'enum Singleton {INSTANCE; ...},甚至是'enum Static {; ''。 –

+1

我將前者用於無狀態單例,後者用於實用類。 –

4

爲什麼不使用具有幾個靜態變量和最終變量的接口?

6
public final class MyClass { 
    private MyClass() { } 
} 

final關鍵字使它不可繼承,並且使得構造(或多個)private將幫助被實例化停止它。

+1

使所有構造函數都是私有的,然後除了這個類本身以外,沒有人可以創建它的實例。 – ReyCharles

+0

@ReyCharles:錯過了那部分。感謝您指出。 –

+0

如果他正在設計類來存儲常量,他應該使用'enums'。 –

3
  • 對於第一種情況,你可以使用final類,因爲它們不能被繼承..
  • 關於第二個情況下,你可以使用interface,他們是很好的用來存儲Constants

但你不能有他們兩人在一起(作爲具有interface不能爲implemented沒有意義)..
所以,最好的是,你可以在一個混合兩者的性質類..你可以有一個final classpublic static final變量,這是什麼使接口變量constant,將服務的constants目的..

public final class A { 
    public static final int YOUR_CONST = 5; 

} 

如果你不想讓這個類的實例,你可以在它private 0-arg constructor ..

public final class A { 
    public static final int YOUR_CONST = 5; 

    private A() {} 

} 
+0

它是否必須是0-arg構造函數? – Jimmy

+0

@vandey ..簡單地說 - 沒有..在這種情況下,因爲這個類不能被繼承,所以不會有任何問題,因爲不定義一個0-參數構造函數。在這裏我剛剛舉了一個例子0-arg構造函數.. –

1
public final class MyClass { 
    public static string MY_STRING; 
    public static int MY_INT; 

    private MyClass() {} 
} 
+0

在Java中,一個類不能同時是'abstract'和'final' - http://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls -8.1.1.2 –

+0

@StephenC是的,謝謝。但我已經編輯了我的答案。 – manas

2

它聲明爲final,不會讓其他類來擴展它,並它的構造私人所以沒有人(除了自己的類)會能夠實例化它:

public final class MyClass { 

    private MyClass() { 
     // Private so noone else can instantiate this 
    } 

} 
1

final:做出一個類最終意味着這個類不能繼承更多。 static:如果所有方法都是靜態的,則不需要創建此類的實例。並且在行爲中應該是靜態的。

單例模式:如果你的所有方法都不是靜態的,並且你不想創建多個實例,那麼你可以使構造函數保持私有狀態,並在類中保留一個類對象的變量。如果它爲null,則創建一次,如果不爲null,則始終返回相同的實例。

由於

2

下面是包含一個恆定值的類的一個例子:

public final class Trial // it is the FINAL 
{ 
    private static final int CONSTANT_VALUE = 666; 

    private Trial() // it is PRIVATE instead of PUBLIC 
    { 
    } 

    public static int getConstantValue() 
    { 
     return CONSTANT_VALUE; 
    } 
} 

並且在下面的如何測試上面的類的例子:

public class Bully //extends Trial ////"extends" WILL NOT COMPILE 
{ 
    public static void main(String[] args) 
    { 
     //Trial trial = new Trial(); ////"new Trial()" WILL NOT COMPILE 

     // The only thing can be done is getting a constant value from "Trial" 
     int acquiredValue = Trial.getConstantValue(); 
     System.out.println(acquiredValue); 
    } 
} 

希望這有助於:))