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

3

这是一个非常简单的问题,但我想知道如何创建没有名称的类对象。例如,如果我有一个名为“Zombie”的类,如何创建一个新的对象而不需要每次都分配一个新名称(例如:Zombie zombie1 = new Zombie();


1
你需要一个数据结构来保存这些对象的引用吗? - Reut Sharabani
1
如果对象没有名称,你将如何引用它们? - Yosef Weiner
5个回答

10

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

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

3
+!用于描述性变量名... :) (注:+!是一个常见的编程符号,通常用于表示向某个变量添加注释或描述。本句话的意思是建议使用描述性变量名。最后的“:)”表示积极、愉快的情绪。) - jdphenix

3
你所指的是name binding:将数据与标识符相关联的过程。
绑定最常见的用途是确定变量的作用域。绑定的数据由语言保证存在(即“在作用域内”)。在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();

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

2

对象没有名称。不能给对象分配名称,也无法在运行时(通过调试信息)找出它的名称。

你可能想表达的是,如何避免声明一个命名引用对象。

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

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

1

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


0
如果你想将一个新对象传递给一个方法或类似的东西,你可以直接使用构造函数调用(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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接