2013-02-09 179 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类中的所有方法都是静态的原因。