在Java中,新的总是新的吗?

时间:2009-07-02 19:11:47

标签: java

Java中有没有像

这样的语句
Thing thing = new Thing();

不能导致创建一个新对象(即thing最终可能指向已存在的对象的任何方式)?

12 个答案:

答案 0 :(得分:16)

new运算符分配新的堆空间并调用构造函数。你将总是以这种方式获得一个新对象(除非,正如其他人指出的那样,在构造函数中抛出异常)。

对于返回引用的静态方法,情况略有不同,例如Integer.valueOf(),如果可能,它会重用内部池中的对象。

答案 1 :(得分:6)

如果Thing的构造函数抛出异常,则不会创建该对象。但是,thing永远不会指向另一个现有的Thing实例。

答案 2 :(得分:4)

有些人说如果构造函数抛出异常,就不会创建对象。我想指出这不是真的。举个例子,看看这个非常糟糕的代码:

public class Test {
    static int count;

    static Set<Test> set = new HashSet<Test>();

    int id = count++;


    public Test() {
        set.add(this);
        throw new RuntimeException();
    }


    public static void main(String[] args) throws Exception {
        for(int i = 0; i < 5; i++) {
            try {
                new Test();
            } catch(Exception e) {
            }
        }
        System.out.println(set);
    }


    public String toString() {
        return "Test[" + id + "]";
    }
}

输出结果为:

[Test[0], Test[1], Test[2], Test[4], Test[3]]

new每隔一段时间创建一个新对象。

答案 3 :(得分:3)

使用new将始终导致分配和创建新对象。但是,您可能指的是 interning 的概念,其中对象存储在池中并且可以重复使用以节省空间。有关一个很好的示例,请参阅Java中String interning上的这篇文章。

答案 4 :(得分:1)

New总是新的(对于原始包装器可能有一些例外),但如果重用对象是一种理想的行为,那么有办法通过某些设计模式(单例,工厂,池等)来实现。

答案 5 :(得分:0)

不,如果内存中没有空间,你应该得到一个OutOfMemoryError。

当然,Thing构造函数可能会抛出其他异常。

答案 6 :(得分:0)

我不确定我是否理解你的问题。

new的定义是来分配和初始化一个新对象

我想你可能能够存储一个对象的静态引用,然后克隆它来创建一个新对象,但该对象仍然是新的。

由于你不能修改this的值(否则你可以在构造函数中说出this = oldObject之类的东西),你唯一能做到这一点的方法是抛出异常,就像已经提到的那样之前。

答案 7 :(得分:0)

据我所知,它不像C ++,你可以重载operator new或放置新的或其他分配器的东西。 (但我不熟悉JLS)

答案 8 :(得分:0)

new始终会创建新对象。在java中,您无法使用new重用对象。实际上这会导致某些java类的性能问题。对于例如布尔类实际上只能存储两个值(true或false),用户仍然可以使用new创建具有相同值的多个对象。

答案 9 :(得分:0)

没有

执行该行代码thing后,永远不会引用该行之前存在的对象。

答案 10 :(得分:0)

如果这是您第一次引用该类并且该类具有无法初始化的静态块,则对new的调用可能会失败。我遇到过一些行为,其中静态块或构造函数中发生的任何运行时错误都会导致新调用在websphere应用程序服务器的使用上下文中抛出ClassNotFound异常。由于运行时异常,websphere类加载器显然拒绝加载类。

答案 11 :(得分:-1)

在Java中,我唯一能想到的就是使用Singleton模式。这不会创建Thing的多个新实例,而是每次创建同一个对象的实例。