使用“new”关键字(Java)

时间:2013-07-29 18:36:30

标签: java oop

我对Java编程相对较新,并且面向对象方面存在一个小问题。那么,让我们来吧!我最近编写了一个程序来查找0和数字x之间的所有素数,其中“i”是素数。在这个程序中,两行与以下相同。

  BigInteger one = BigInteger.valueOf(i);
    one = one.nextProbablePrime();

这些行的目的是将整数i转换为BigInteger以使用nextProbablePrime方法。回想一下,我看到我没有使用关键字“new”,因此没有创建BigInteger类的实例,但程序仍然编译并运行顺利。为什么程序能够使用nextProbablePrime方法,如果没有创建BigInteger类的实例,则编译并运行?此外,不会在其他情况下以及使用其他类和方法创建对象。此外,它是否会阻止我使用BigInteger类的全部功能,是否被认为是良好的编程习惯?

我还将上面的两行代码重写为两行代码,使程序的其余部分保持不变。

BigInteger one = new BigInteger(String.valueOf(i));
    one = one.nextProbablePrime();  

我改变了两者的第一行,包括使用“new”这个词。正如我所料,它没有任何缺陷。回到我的其他问题,哪一个更好?尽管我正在使用哪种类或方法,哪一种更适合做,但哪一种能给我最大的功能呢?

总结一下,我的问题是: 1. 哪一个是正确的? 2. 哪种情况适用于所有情况,尽管我使用的是类或方法? 3. 哪一个被认为是良好的编程习惯? 4. 第一个如何在不创建对象的情况下工作?

Biginteger类的快速链接,适合那些可能想要查看它的人 - here

6 个答案:

答案 0 :(得分:15)

创建了BigInteger类的实例。只是new关键字在里面内部使用{/ 1}}方法的实现。

BigInteger.valueOf通常效率更高。它可以为BigInteger.valueOf的某些值重用相同的BigInteger对象 - 可能为0,或者可能为i,它从-128到128.

Integer.valueOf(int)被称为工厂方法,经常被推荐。除其他外,工厂方法可以有名称,其中构造函数不能;他们对实施有更多的控制权;有很多很好的理由。实际上, Effective Java 中的第一个建议是“考虑静态工厂方法而不是构造函数。”

如果您实际查找BigInteger.valueOf的{​​{3}},您可以看到它正在做的事情:它检查它是否可以重复使用常量值 - BigInteger.valueOf或小的正值或者是否定值 - 如果没有,它就会继续调用ZERO,尽管它使用内部私有构造函数,它使用new BigInteger(value)而不是long

答案 1 :(得分:1)

第一种方法使用BigInteger中的静态方法。这可能是我的偏好,虽然两者都有效但两者都完全相同。

new关键字在内存中创建对象的实际实例。由于BigInteger.valueOf(i);方法是静态的,因此它不需要BigInteger的实例(此方法本身就是为您创建一个新的BigInteger)。

答案 2 :(得分:1)

如果查看文档:

  

public static BigInteger valueOf(long val)

     

返回一个BigInteger ,其值等于指定的值   长。优先提供这种“静态工厂方法”   (长)构造函数因为它允许重用经常使用的   BigIntegers。

     

参数:       val - 要返回的BigInteger的值。返回:       具有指定值的BigInteger。

您正在调用的方法是返回BigInteger的新实例

此处:http://docs.oracle.com/javase/7/docs/api/java/math/BigInteger.html

答案 3 :(得分:0)

您在这里处理的是BigInteger类的静态方法。

此方法将返回一个自动分配的BigInteger实例,这就是路易斯正确的原因。 new方法中使用了valueOf

答案 4 :(得分:0)

首先在内部创建对象(*可能并非总是如此)。

使valueOf()方法有可能在一些小范围内缓存BigInteger而不浪费资源的原因之一。 (创建1个值为5的对象,而不是吨数)。

你必须在调用new时创建对象,但你可以在if语句里面重用旧对象

两种变体都可以。但最好使用valueOf因为你

  • 不要创建不必要的字符串。
  • 有可能加入

答案 5 :(得分:0)

回答你的所有问题:

  1. 两者都是100%正确。

  2. 两者都适用于任何合理的情况。

  3. 第一种方法可能具有最小的开销(滞后)。

  4. 第一种方法会在您调用的函数内部创建一个对象,如下所示:

    public static BigInteger valueOf(long val){     BigInteger bigInteger = new BigInteger();     //做一些事情让val成为BigInteger     返回bigInteger; }

  5. 因此,当它返回到您的变量时,它已经使用了new关键字。