当前位置: 首页 > 知识库问答 >
问题:

如何用变量定义java对象名?

郝承悦
2023-03-14

我需要使用一种命名模式创建大量对象,这种命名模式可以通过循环轻松获得。有没有办法像这样从变量中读取对象名?

String Var = "ObjectName";
ClassName Var = new ClassName();

我不需要为对象分配变量名,只需要在分配时从对象中获取名称即可。

共有3个答案

姚信鸥
2023-03-14

容易获得?你查过数组了吗?如果你想使用Strings,那么一个字符串数组就足够了,还有char和int数组。

    String[] myStringArray = new String{"hello", "world"};
    int[] myIntArray = new int{1, 2, 3, 6};

我建议您仔细阅读阵列及其使用,我相信它可能会解决您的问题。

岑驰
2023-03-14

根本不清楚你想要什么。如果要按名称查找对象,可以使用地图

例子:

Map<String, Object> map = new HashMap<String, Object>();

String objectName = ...// get name of object
Object object = ...// get object
map.put(objectName, object);

然后可以检索:

Object obj = map.get(objectName);
葛宏爽
2023-03-14

您选择的词语表明您没有完全理解变量和对象的工作方式,您需要解决这一问题,才能使用Java实现任何目标。

如果我写:

Item myItem = new Item();

我创建一个新对象,并定义一个指向该对象的变量。

对象没有名称(它有一个ID,ID是运行时分配的数字;大多数程序员可以忽略它)。

该变量的名称为myItem。变量指向对象。稍后,它可能会指向另一个对象。当对象继续存在时,变量可能会超出范围并不再存在。

你可能会说,“这并不重要。如果我说‘对象的名称’,我的意思是‘指向对象的变量的名称’。”

但这很重要,因为许多对象将被不止一个变量指向:

Item myItem = new Item();
Item yourItem = myItem;
// both variables point to the same object. Neither variable is "more" the
// owner of the object than the other.

...许多对象不会被变量直接指向。

myList.append(new Item()); 
// you can't get at this new object using a direct variable.

在Java(和大多数主流语言)中,不能在运行时创建变量名。唯一存在的变量名是源代码中的变量名。

所以没有什么是这样工作的:

int number = 1;
Cell cell$number = new Cell(); // can't be done!
Cell currentCell = cell1; 

也不能基于运行时数据按名称访问变量。所以没有什么能像这样起作用:

Cell cell1 = ...;
int number = 1;
Cell currentCell = cell$number; // can't be done!

这是一件好事,因为它可以让编译器验证代码的某些方面。

在某些语言中,您可能可以使用ava()实现这样的目标--但是您应该远离它!

这是一个提示,如果您正在编写如下代码:

 Cell cell0 = new Cell(...);
 Cell cell1 = new Cell(...);
 ...
 Cell cell99 = new Cell(...);

... 那你就做错了。它可能会起作用,但规模很小。没有办法将其放入循环中。(别担心——我们大多数人在开始编程时都遇到了这个问题)。

如果你使用数组:

 Cell[] cells = new Cell[];
 cells[0] = new Cell(...);
 cells[1] = new Cell(...);
 ...
 cells[99] = new Cell(...);

然后可以使用循环来代替:

 for(int i = 0; i<100; i++) {
     cells[i] = new Cell(...);
 } 

数组是最简单的“集合”对象。还有集合、列表、地图和许多更高级的集合,以满足大多数需求。

您似乎希望使用字符串作为键来存储和访问对象。实现这一点的方法是使用地图。

Map<String,Cell> myMap = new TreeMap<String,Cell>();

myMap.put("AA", new Cell(...));
myMap.put("AB", new Cell(...));

...

Cell currentCell = myMap.get("AA");

Map是一个接口。TreeMap只是提供Map接口实现的一个类。阅读标准JRE提供的Map的各种实现。

键不一定是String。任何实现equals()的东西都可以用作键。

使用此选项:

for(char c = 'A'; c <= 'L'; c++) {
   for(char d = 'A'; d<= 'L'; d++) {
       myMap.put("" + c + d, new Cell(...));
   }
}

然而,既然你说过你想要一个网格,那么最好使用2D数组,并在需要的时候将数字坐标转换成字母网格引用。谷歌搜索“2D数组Java”,你会找到很多例子。

Cell[][] cells = new Cell[12][12];
for(int x=0; x<12; x++) {
   for(int y=0; y<12; y++) {
       Cell cell = new Cell();
       cell.setName( "" + ('A' + x) + ('A' + y)); // perhaps
       cells[x][y] = cell;
   }
}

除了标准的JRE之外,还有许多其他的Map实现。例如,Spring提供了DefaultRedisMap,其中对象存储在Redis数据库中。

更一般地说——你在这里问了一个非常基本的问题。你应该阅读任何一本像样的Java书中关于集合应用编程接口的章节。

 类似资料:
  • 问题内容: 我需要使用可以通过循环轻松获得的命名模式来创建大量对象。有什么办法可以像这样从变量中读取对象名称? 我不需要为对象分配变量名,仅是在分配时从其获取名称。 问题答案: 您所选择的单词表明您不完全了解变量和对象的工作方式,因此您需要对其进行修复以使其在Java中得到广泛应用。 如果我写: 我创建一个新对象, 然后 定义一个指向该对象的变量。 该对象 没有名称 (它具有一个ID,该ID是在运

  • 如果它走路像鸭子,说话像鸭子,样子像鸭子,叫声也像鸭子,那它就是一只鸭子。 对于 Nutz Ioc 来说,它面对的配置文件就是层层嵌套的 "名值对集合",或者说是 Map 集合。 事实上,它是先把整个配置文件解析成 Map 再做判断的。 如果一个 Map 仅包括如下的键,则被认为是一个注入对象: type 对象类型 singleton 是否单例 scope 生命周期范围 events 监听事件 a

  • 问题内容: 我正在自学Java,这本书中的其中一项复习练习要求“对象”和“对象变量”之间的区别。 我知道什么是对象(类的特定实例),但是我似乎无法在书中的任何地方(无答案部分)或在互联网上找到术语“对象变量”。 有人知道这个名词的意思吗? 问题答案: 它是“实例变量”的同义词: 显然,该术语并不常用,最好坚持使用“实例变量”以避免任何潜在的歧义。

  • 问题内容: 我想将自定义类型的对象添加到集合中。我有几个相同,即它们的公共变量值相同。 我不希望将多个“相同”对象的实例添加到集合中,但是每次创建新对象时,总是将其添加。 这是因为类Object的equals方法在对象上实现了最有区别的对等关系:“对于x和y的任何非空引用值,当且仅当x和y引用同一个对象时,此方法返回true(x = = y的值为true)。” 我可以覆盖此对象的equals方法以

  • 出于教育目的,我正在研究Java值对象。 我不明白的是,为什么没有人(异口同声)提到Java值对象实现可比性? 如果Java值对象必须具有"正确的"HashCode 这是我的思考过程。将测试值对象的实例是否相等,因此它们需要正确的equals/hashcode。值对象可以存储在“hash”集合中,这也是Hashcode方法所需要的。那么,为什么不添加Compariable以便它们可以成为有序集合中

  • 问题内容: 在我的 Dockerfile中 ,我想 定义 稍后 可以 在Dockerfile中使用的变量 。 我知道该指令,但是我不希望这些变量是环境变量。 有没有一种方法可以 在Dockerfile范围内声明变量 ? 问题答案: 您可以使用-请参阅https://docs.docker.com/engine/reference/builder/#arg 该指令定义了一个变量,用户可以在构建时使用