我知道这里在 Java 中没有指针。但是如何更改调用范围中的值?例如,我想编写一个接受整数 num 的函数,如果大于 21,则将整数设置为 0,否则什么也不做。总的来说,我的代码如下:
int a=34;
KillOver21(a);
System.out.print(a);
我期待一个 0。
Java是传值的,所以参数a的副本被发送到方法中,所以方法a
中的修改不会影响到原来的a
参数main
您可以做的最大值return int
来自KillOver21(a)
方法
int z = KillOver21(a); // This will return 0
System.out.print(z);
但是你可以用自定义对象来实现类似的东西,比如你有一个类
class AHolder {
public int a;
}
那么您可以期望AHolder
实例发生变化
public static void main(String [] args) {
AHolder a = new AHolder();
a.a = 34;
killOver21(a);
System.out.println(a.a);
}
public static void killOver21(AHolder b) {
if(b.a > 21) {
b.a = 0;
}
}
因为在后者中(即使它的按值传递),引用被复制并且两个引用都指向同一个对象。因此,在killOver21
方法内部所做的更改实际上会更改对象。
这根本不可能,Java 支持按值传递。int a
的值将被复制到函数中。
您可以使用Object
将参考值复制到您的函数而不是原始对象,通过该函数您可以获得实际对象并对其进行修改。
最简单的方法(快速和肮脏)是将值放入数组中
int holder[] = new int[]{ a};
KillOver21(holder)
System.out.printf( "value=[%d]", holder[0] );
void KillOver21(int holder[] ) {
holder[0] = 0;
}
在 Java 中基本上是不可能的。int
是不可变的,并按值传递。您需要创建一个可变int
类型:
class MutableInt {
private int value;
public MutableInt(int value) { this.value = value; }
public getValue() { return this.value; }
public setValue(int value) { this.value = value; }
}
然后:
void KillOver21(MutableInt m) {
if(m.getValue() > 21) { m.setValue(0); }
}
但是,请注意,表示由其值而不是其标识定义的概念的可变类型通常是一个非常糟糕的主意。但是,这是实现您想要实现的目标的唯一方法。再次,我用最强烈的话警告你:你正在做的是一个坏主意。你应该另谋出路。
医生,我这样做的时候很痛。
那就不要那样做!