2013-02-09 178 views
2

我正在嘗試在Java中創建數學對象。理想情況下,不需要創建這樣的實例,因爲它只有靜態方法和參數。我只是想創造它,不管它是否允許我。所以當我創建一個數學類對象時,會顯示編譯器錯誤,說Math類的構造函數不可見。無法在Java中創建Math對象?

但我研究了Math類的代碼,並沒有提供明確的構造函數,所以java將提供一個默認的構造函數,它可以在外部訪問。

+0

請問,你可以發佈你的代碼? – kameny 2013-02-09 15:37:40

回答

1

你不能這樣做,因爲它的構造函數是私有的。您沒有在API中看到構造函數,因爲未列出私有方法。

例如借這個例子:

public class SampleClass { 

    private static int var1 = 1; 
    private static int var2 = 1; 
    private static int var3 = 1; 


    private SampleClass() { 
     // This constructor will prevent the default constructor from being invoked 
    } 

    public static void runMethod1() { 
     System.out.println("Value is:" + var1); 
    } 

    public static void runMethod2() { 
     System.out.println("Value is:" + var2); 
    } 

    public static void runMethod3() { 
     System.out.println("Value is:" + var3); 
    } 

} 

只能從同一個類中創建這個類的一個實例。如果你嘗試從別處創建它,你將會失敗。

+0

根據給出的示例進行更新。 – user000001 2013-02-09 15:37:24

5

這是正確的行爲。該constructor for Mathprivate,因爲它僅包含static的實用方法:

private Math() {} 
+0

感謝您的回答。我只想知道java – user2057312 2013-02-09 15:28:15

+0

中的實用方法是什麼,它們與'Math'中的一樣。通常不依賴實例變量或_state_並且是確定性的無狀態輔助方法。另見[link](http://www.coderanch.com/t/479357/java/java/utility-methods) – Reimeus 2013-02-09 15:32:13

2

這是從Java docs

public final class Math { 

    /** 
    * Don't let anyone instantiate this class. 
    */ 
    private Math() {} 
} 

文檔評論本身足以回答你的問題。

2

如果你看一下數學類的定義,它的構造函數是私有的:

private Math() {} 

這意味着類的創作者不希望用戶能夠創建該類的實例。這是有道理的,因爲它是一個工具類,這意味着類中的任何方法都不依賴於對象的狀態。你只需要傳遞方法參數值,它只會給你預期的結果。這就是爲什麼Math類中的所有方法都是靜態的原因。