我是一名学习Java的学生。
我越了解面向对象编程,就越发现自己创建了新对象的数组:
ArrayList<kitten> sackOfKittens = new ArrayList<kitten>();
String[] kittenNames = new String[10];
//fill kittenNames with cute strings like "flufftown" and "Indie Rocker"
for(int i = 0; i < 10; i++) {
sackOfKittens.get(i) = new Kitten(kittenNames[i]);
}
这对我来说很有趣,因为现在我有了所有这些小猫,我显然会做些什么,而且没有直接引用它们,或者没有我指定的变量。
我是否只需要习惯flufftown
甚至kitten1
已消失但sackOfKittens.get(1)
等同于此的想法?
写出来更有意义。
我猜一个人只是在小猫课上编写方法来做所有混乱的事情就是这样。
我错过了什么吗?
答案 0 :(得分:1)
您需要放弃必须为您创建的每个对象指定符号的想法。符号(变量名称)在编译时中定义,但您可以编写在运行时创建任意数量对象的程序,而无需事先知道要调用它们的内容。
考虑public static void main(String[] args)
。您如何处理为String
中的每个args
提供变量名称?您可以尝试变得聪明并提前列出一堆变量:
public static void main(String[] args) {
String s1 = (args.length > 0) ? args[0] : null;
String s2 = (args.length > 1) ? args[1] : null;
String s3 = (args.length > 2) ? args[2] : null;
String s4 = (args.length > 3) ? args[3] : null;
String s5 = (args.length > 4) ? args[4] : null;
}
但是,如果遇到更多,你会怎么做?如果您需要支持数千个可能的命令行参数,该怎么办?当然,你不可能事先预测到这一点。
事实上,这就是main
采用String[]
而不是多String
次的确切原因。命令行参数的数量不能提前知道,因此需要一个数组。你必须引用它们的唯一方法是通过数组中的索引。
如果没有符号,您可以在数据结构中使用多种查找方法(例如数组,List
或Map
)。
可以迭代诸如List
和数组之类的数据结构。假设您要查找名为kitten
的{{1}},您可以浏览"puss"
中的每个kitten
,直到找到您想要的那个:
List
或者,您可以利用强大的kitten pussTheKitten;
for (kitten k: sackOfKittens) {
if (k.getName().equals("puss")) {
pussTheKitten = k; // found it!
}
}
数据结构,根据一些独特的“键”属性更快更轻松地获取对象:
Map
答案 1 :(得分:0)
我建议您详细了解将Map
映射到其值的flufftown
。在这种情况下,您可以使用名称作为键。这样您就不必记住1
偏移 Map<String, Kitten> map = new HashMap<>();
map.put("flufftown", new Kitten(...));
。
Kitten myKitten = map.get("flufftown");
然后你可以用同一把钥匙把它拿出来
{{1}}