我目前正在阅读Rogers Cadenhead的第21版“Sam Teach Yourself Java”。
本书中有一个例子,它在静态变量和方法的一章中使用for循环显示对象创建。
代码如下:
public class InstanceCounter {
private static int numInstances = 0;
protected static int getCount() {
return numInstances;
}
private static void addInstance() {
numInstances++;
}
InstanceCounter() {
InstanceCounter.addInstance();
}
public static void main(String[] arguments) {
System.out.println("Starting with " +
InstanceCounter.getCount() + " objects");
for (int i = 0; i < 500; ++i)
new InstanceCounter();
System.out.println("Created " +
InstanceCounter.getCount() + " objects");
}
}
我不明白for循环如何创建对象而不实际给出这500个新对象名称。这就是我被教导如何创建对象:
对象对象名称 =新对象();
for循环是否会创建这些对象并在之后直接丢弃它们,因为它们没有对象名?
我看到当我在Netbeans中键入代码时,提示“新实例被忽略”。
答案 0 :(得分:2)
在第new InstanceCounter();
行创建新对象。但是,如果您没有任何引用它,您将无法访问它,可能很快就会收集垃圾。如果你想保留对它的引用,只需添加你在这里写的Object objectname = new Object();
。然后,objectname
将成为班级Object
的参考。
您的静态方法不引用您的对象,它们引用类InstanceCounter
。即使某些实例将被GC垃圾收集,创建的实例数也将保存在变量numInstances
中。
答案 1 :(得分:1)
对象没有名称,因此您可以创建任意多个名称。
引用这样的字段和局部变量可以命名。您可以根据需要在循环中重复使用这些变量和名称。是否将对象的引用分配给名称取决于您。
答案 2 :(得分:1)
它们可能会在创建后很快丢弃,也可能不会被丢弃。当没有对对象的更多引用时,GC(垃圾收集器)最终会将其删除,因此这些未引用的对象最终将在GC运行时获得GC。使用静态方法addInstance()
,您只需跟踪创建了多少这些“匿名对象”。这不是衡量仍然有多少的衡量标准,因为它只是一个静态int
,它计算了创建的数量。{/ p>
答案 3 :(得分:1)
您所说的Objectname在Java中称为引用,用于在创建对象后访问它。 如果您没有创建引用并为其分配对象,则可以在单个表达式的范围内对其进行操作,例如:
(new Random()).nextInt();
将返回一个随机的Integer对象,然后让垃圾收集器处理Random类型的对象。这意味着您不能再次使用同一个对象,所以看起来你是对的。
当然要使用相同的对象,你需要某种参考,如:
Random someGenerator = new Random();
其中赋值的左侧是引用的声明,或者您也可以将新对象放入某种集合中:
List<Random> randList = new LinkedList<Random>();
randList.add(new Random());
这样即使没有单独的引用,您也可以访问这些对象。您可以将这些集合视为对同一类型对象的组引用。
答案 4 :(得分:1)
创建instance
只是new SomeInstance()
的一个简单操作。
我们选择保存它们以供进一步使用或忽略它们,在正常情况下我们通常会保存它们。
传统的方法是像这样保存它们:
SomeInstance mySomeInstance = new SomeInstance()
如果我们选择创建它们而不在代码中保存或,我们将不再需要它们而不是全能Garabage Collection
将清除它们。