Java:创建对象而不命名它们?

时间:2014-01-19 15:14:22

标签: java

我目前正在阅读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中键入代码时,提示“新实例被忽略”。

5 个答案:

答案 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将清除它们。