【问题标题】:Trying to instantiate Math class试图实例化数学类
【发布时间】:2013-04-13 04:11:10
【问题描述】:

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

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

导致错误,但我不知道为什么。

【问题讨论】:

  • Math 是静态的,你不能new 它。
  • 想想你打算用你的 a 对象做什么,这可能会帮助你意识到为什么它是一个错误。
  • 我的问题是为什么你需要做new java.lang.Math
  • a.abs(int min - int max);

标签: java


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

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

    java.lang.Math 的所有重要方法都是静态的,因此您不需要该类的实例来调用它们。只需使用Math.abs(x - y) 或在您的情况下使用java.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),因为它更具可读性。

    【讨论】:

      【解决方案3】:

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

      public static void main(String[] args) throws Exception {
          Constructor<?> constructor = Math.class.getDeclaredConstructors()[0];
          constructor.setAccessible(true);
          Math math = (Math) constructor.newInstance();
          ...
      }
      

      【讨论】:

        【解决方案4】:

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

        【讨论】:

        • 没有默认的public构造函数,但是有一个private
        • 这是故意的,以防止人们实例化它。
        • 奇怪的是Math 真的不应该是静态方法的单例类,因为有两个类具有相同的方法:MathStrictMath。我可以想象Math 界面的更多版本,以准确性换取速度。查看 Quake 3 Inverse Square Root 例程,了解为什么要这样做。
        • 那是历史;对此无能为力。您会看到原始的 Math 是 JDK 1.0 的一部分,但 StrictMath 不是。
        • 是的,我了解私有构造函数。
        【解决方案5】:

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

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

        【讨论】:

        • 您是在提问、评论还是试图提供答案?
        • 试图提供答案
        • final 类和static 方法之间有什么关系?
        • 没有关系..正如我想说的,如果所有方法都是静态的,为什么要创建一个对象,因为它是最终的,构造函数调用可能会失败。
        【解决方案6】:

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

        答案是您尝试使用单个 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);
        

        【讨论】:

          【解决方案7】:

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

          就这样使用吧:

          java.lang.Math.sin(x);
          

          【讨论】:

            猜你喜欢
            • 2020-04-10
            • 1970-01-01
            • 2019-05-16
            • 1970-01-01
            • 2017-04-03
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多