我知道指针不像他们在C中那样存在,但我想知道这样的事情是否可行:
我有5个全局变量r1 r2 r3 r4 r5
,每个变量最初初始化为null
我想(1)找到尚未使用的变量,(2)为其分配内容,然后(3)稍后在程序中操作该变量。但是,在代码执行之前,我不知道变量的状态。为了弥补这一点,我现在有一堆if-else语句:
if(r1==null)
r1 = [something]
else if(r2==null)
r2 = [something]
else if(r3==null)
r3 = [something]
else if(r4==null)
r4 = [something]
else if(r5==null)
r5 = [something]
到目前为止一切顺利。但问题是,我想采用上面代码中修改过的变量,然后在程序中使用/修改该变量。
所以说如果r1
和r2
不为空,r3
为空,r3 = [something]
。我想稍后在程序中修改r3
。在C / C ++中,我想我可以在if-else语句中设置指向r3
的指针。然后我可以稍后在程序中通过该指针修改r3
。
这在Java中可行吗?谢谢!
编辑:忘了提,r1-r5
是字符串。
答案 0 :(得分:4)
Java是面向对象的语言,对象通过引用传递。 因此,如果您的变量r1-r5是传递它们的特定类的实例,则与传递对象相同。
因此,在单独的函数或方法中修改对象也会更新原始对象。
在你的枕头下放一本好的Java书; Dietel和Dietel为初学者,Java LRM为毕业生。
答案 1 :(得分:2)
听起来你想要使用数组。一旦你弄清楚哪个元素尚未使用,只需保存索引并使用它。
答案 2 :(得分:1)
对于这么简单的事情,你可以使用一个数组。 您可以将数组索引保留为指向所需变量的指针。
String[] r = new String[5]; // all nulls
所以:
private int findFirstNull(String[] array) {
for(int i=0; i<r.length; i++)
if(r[i] == null)
return i;
return -1;
}
答案 3 :(得分:0)
Java的反射API允许通过Field
type引用成员变量。
简而言之,您可以在Field
对象中存储对所需全局变量的引用,并根据需要进行查询/更新。例如,假设全局变量的类型为String:
// static String MyClass r1 = null;
Field theGlobal = MyClass.class.getField("r1");
String s = (String) theGlobal.get(MyClass.class);
if (s == null) {
theGlobal.set(MyClass.class, "Hello, Reflection!");
// MyClass.r1 == "Hello, Reflection!"
}
然而,这样做的必要性似乎看起来很糟糕。您的全局变量可能会被其他一些成员变量类型更好地表示。
答案 4 :(得分:0)
Java按值传递其对象。虽然您可以修改对象传递给方法的状态,并且在方法外部保留这些修改,但是不会为该对象分配另一个实例。
例如,保留这样的内容:
point.setX(10);
point.setY(100);
虽然这样的事情不会:
point = new Point(10,100);
正如您所说的那样,您使用的是Strings,java中的String是不可变的,因此无法修改其状态。
与建议的其他一些答案一样,在这种情况下使用String of String是一个很好的选择。由于它是一个全局变量,你可以使用这样的东西:
public static final String[] r = new String[5];
用它来改变它的一个元素,如
r[0] = "Some String";
将在全球范围内保留。
答案 5 :(得分:-1)
我认为你可以有一个单独的全局变量来知道哪一个被修改(我认为你只需要该字符串的引用)并使用如下:
if(r1==null)
globalR = r1 = [something]
else if(r2==null)
globalR = r2 = [something]
else if(r3==null)
globalR = r3 = [something]
else if(r4==null)
globalR = r4 = [something]
else if(r5==null)
globalR = r5 = [something]
然后你可以使用globalR来处理那个字符串