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();
除非其构造函数在某处存储对自身的引用,否则它将立即无法访问。但是,打印到控制台等副作用仍然可见。
这是一个非常简单的问题,但我想知道如何制作没有名称的 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();
除非其构造函数在某处存储对自身的引用,否则它将立即无法访问。但是,打印到控制台等副作用仍然可见。