1

谁能告诉我我在这里做错了什么?

private static java.lang.Math a = new java.lang.Math();

这导致了一个错误,但我不知道为什么。

4

7 回答 7

9

您不能实例化 Math 实例。都是静态方法。没有公共的默认构造函数。

于 2013-04-19T17:21:43.847 回答
3

谁能告诉我我在这里做错了什么?

答案是您试图private从类外部使用单个构造函数实例化一个类。

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

a.abs(int min - int max); !!

您可以执行以下方式:

int min = xxx;
int max = yyy;
int abs = Math.abs(min-max);
于 2013-04-19T17:24:42.020 回答
2

您正在尝试实例化 java.lang.Math ... 我不知道为什么。

像这样使用它:

java.lang.Math.sin(x);
于 2013-04-19T17:22:50.200 回答
1

为什么要创建新对象,它的最终类和所有方法都是静态的。

我试图说如果所有方法都是静态的,为什么要创建一个对象,因为它是最终的,构造函数调用可能会失败

于 2013-04-19T17:24:02.737 回答
1

你可以实例化 Math,但你不应该,除非它是出于某种模糊的原因。

public static void main(String[] args) throws Exception {
    Constructor<?> constructor = Math.class.getDeclaredConstructors()[0];
    constructor.setAccessible(true);
    Math math = (Math) constructor.newInstance();
    ...
}
于 2013-04-19T20:32:36.053 回答
1

如果您无权访问其构造函数,则不能(没有反射)创建类的对象,例如在这种情况下,构造函数是私有的。

我已经有一个数学课,所以这就是我尝试其他选择的原因

的所有重要方法java.lang.Math都是静态的,因此您不需要该类的实例来调用它们。只需Math.abs(x - y)在您的情况下使用 orjava.lang.Math.abs(x - y)来指定您要使用java.lang.Math的,而不是您的班级。


如果您只想使用一些方法,java.lang.Math您可以像这样导入它们

import static java.lang.Math.abs;

并像使用它一样

abs(10 - 20)

你也可以试试这个方法

java.lang.Math a = null;
a.abs(x - y);   // compilator will change it to 
                //java.lang.Math.abs(x - y) since abs is static method

但我会留下来,java.lang.Math.abs(x - y)因为它更具可读性。

于 2013-04-19T17:47:35.857 回答
1

您不能创建 Math 类的对象,因为 Math 类的构造函数具有 private 修饰符。

此外,类中的所有方法都是静态的。所以你可以直接使用它们(例如: Math.method() )。通过扩展,类中仅存在静态方法并不需要对象构造。

因此,不能实例化 Math,因为它的设计使得任何人都不会发现需要实例化它

于 2013-04-19T17:49:33.263 回答