Java中有没有像
这样的语句Thing thing = new Thing();
不能导致创建一个新对象(即thing
最终可能指向已存在的对象的任何方式)?
答案 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的多个新实例,而是每次创建同一个对象的实例。