Java 如何创建没有名称的 class 对象

Java How to create objects of class without name

这是一个非常简单的问题,但我想知道如何制作没有名称的 classes 对象。例如,如果我有一个 class 'Zombie' 我如何创建一个新的而不每次都分配一个新名称(例如,Zombie zombie1 = new Zombie();

new Zombie() 将创建一个新的僵尸实例。但是,如果您不想,则不必将其分配给局部变量或数据成员。例如,您可以将这些僵尸累积在一个集合中:

List<Zombie> undeadLegion = new LinkedList<>();
for (int i = 0; i < 1000; ++i) {
    undeadLegion.add(new Zombie());
}

如果您想将新对象传递给方法等,您可以只使用构造函数调用 (new Zombie()) 而无需将其分配给变量。

例如,如果您有一个名为 doThingsWithZombie() 的方法,它接受一个 Zombie 对象,您可以执行以下操作:

doThingsWithZombie(new Zombie());

您还可以将新对象添加到列表中:

LinkedList<Zombie> zombieList = new LinkedList<Zombie>();
zombieList.add(new Zombie()); // Add a zombie
zombieList.add(new Zombie()); // Add a zombie
zombieList.get(0) // Gets the first zombie

对象没有名字。无法为对象分配名称,也无法找出它在运行时的名称(借助调试信息)

您的意思可能是我如何避免声明对对象的命名引用。

最简单的方法是将引用用作表达式,例如

System.out.println(new Zombie());

对象没有名字。变量有名称。您不必将 new 的结果存储到变量中:您可以直接将其作为参数传递,或者直接将其丢弃。

您指的是name binding:数据与标识符的关联。

绑定最常见的用途是确定变量的范围。绑定数据由语言保证存在(比如 "in scope")。在 Java 中,反之则不然:在垃圾回收之前,未绑定的数据可能仍存在于堆上。但是,无法访问此数据,因为您无法识别它(缺乏涉及垃圾收集器的深层魔法)。

只要写new Zombie()就可以创建未绑定的数据。您不必给它一个特定的名称;它可以是(命名)数组的未命名成员:

// Create a new ArrayList<> and bind it to the name list.
List<Zombie> list = new ArrayList<Zombie>();

// Create new Zombie objects, but do not name them.
// Instead, add them to the list.
for (int i = 0; i < 5; ++i) {
    list.add(new Zombie());
}

您也可以将对象直接传递给函数。它不会绑定到调用者范围内的任何名称,但会绑定到被调用者范围内:

void a()
{
    b(new Zombie());
}

void b(Zombie z)
{
}

这里,new Zombie() 根本没有在 a 中命名 -- 但一旦它传递给 b,它就会绑定到 z

最后,您可以创建一个对象并且完全不对其进行任何操作:

new Zombie();

除非其构造函数在某处存储对自身的引用,否则它将立即无法访问。但是,打印到控制台等副作用仍然可见。