0

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

到现在为止还挺好。但问题是,我想取上面代码中修改过的变量,然后在程序中使用/修改该变量。

所以说 if r1and r2were NOT null, and r3was null, r3 = [something]. 我想r3稍后在程序中进行修改。在 C/C++ 中,我想我可以r3在 if-else 语句中设置一个指针。然后我可以r3稍后在程序中通过该指针进行修改。

这在Java中可能吗?谢谢!

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

4

6 回答 6

4

Java是一种面向对象的语言,对象是通过引用传递的。因此,如果您的变量 r1 - r5 是特定类的实例,则传递它们将与传递对象相同。

因此,在单独的函数或方法中修改对象也会更新原始对象。

在枕头下放一本好的 Java 书;Dietel 和 Dietel 适合初学者,Java LRM 适合毕业生。

于 2012-12-05T04:00:50.707 回答
2

听起来您想使用数组。一旦您确定哪个元素尚未使用,只需保存索引并使用它。

于 2012-12-05T04:00:53.467 回答
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;
}
于 2012-12-05T04:00:53.957 回答
0

FieldJava 的反射 API 允许通过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!"
}

然而,这样做的必要性显然是糟糕的设计。您的全局变量很可能由其他一些成员变量类型更好地表示。

于 2012-12-05T04:06:41.747 回答
0

Java 通过值传递它的对象。虽然您可以修改传递给方法的对象的状态,并且这些修改保留在方法之外,但不会将对象分配给另一个实例。

例如,保留执行以下操作:

point.setX(10);
point.setY(100);

虽然这样的事情不会:

point = new Point(10,100);

正如您所说,您使用的是字符串,Java 中的字符串是不可变的,因此无法修改其状态。

就像建议的其他一些答案一样,在这种情况下使用 Array of String 是一个很好的选择。由于它是一个全局变量,你可以使用这样的东西:

public static final String[] r = new String[5];

随之,改变它的一个元素,比如

r[0] = "Some String";

将在全球范围内保存。

于 2012-12-05T06:57:03.763 回答
-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 来处理该字符串

于 2012-12-05T04:59:17.440 回答