JAVA:指针等价

时间:2012-12-05 03:56:25

标签: java pointers

我知道指针不像他们在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]

到目前为止一切顺利。但问题是,我想采用上面代码中修改过的变量,然后在程序中使用/修改该变量。

所以说如果r1r2不为空,r3为空,r3 = [something]。我想稍后在程序中修改r3。在C / C ++中,我想我可以在if-else语句中设置指向r3的指针。然后我可以稍后在程序中通过该指针修改r3

这在Java中可行吗?谢谢!

编辑:忘了提,r1-r5是字符串。

6 个答案:

答案 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来处理那个字符串