我对数组的工作方式感到困惑。如果将数组引用传递给某些方法,则该方法能够更改以前存储在数组中的索引值。但是,如果对包装类对象执行相同的操作,则该方法无法更改该值。以下是代码:
public class TestArray {
public static void main(String[] args) {
ChangeValues ch=new ChangeValues();
int intArr[]={1,2,3};
Integer iWrapper=new Integer(123);
ch.changeArray(intArr);
for(int i:intArr){
System.out.print(i);// o/p: 789
}
System.out.println("\n-----------------");
ch.changeWrapper(iWrapper);
System.out.println(iWrapper);// o/p: 123
}
}
class ChangeValues{
void changeArray(int i[]){
i[0]=7;
i[1]=8;
i[2]=9;
}
void changeWrapper(Integer i){
i=789;
}
}产出:
789
-----------------
123为什么数组能够更改而不是包装对象。有人能消除我的疑虑吗?谢谢。
发布于 2015-01-22 22:56:46
与其使用Integer包装器,不如使用类似的方法(请注意,自动装箱将被打破,因此必须手动完成):
public class MyInteger {
private int intValue;
public MyInteger(int val) {
intValue = val;
}
public void setValue(int val) {
intValue = val;
}
pubic int intValue() {
return intValue;
}
}那么您的changeWrapper方法可以是:
void changeWrapper(MyInteger i){
i.setValue(789);
}和
ch.changeWrapper(iWrapper);
System.out.println(iWrapper.intValue());将打印"789“。
或者,您可以将intValue公开:
public int intValue;然后,您的changeWrapper方法可能变成:
void changeWrapper(MyInteger i){
i.intValue = 789;
}这实际上就是数组的含义--一个包含大量公共字段的对象。
发布于 2015-01-22 22:49:42
Java方法的所有参数都是通过值传递的。当参数为引用类型(相对于原始类型)时,则通过值传递引用。本质上,这意味着该方法接收调用方值的副本。
对可变对象的任何引用都可以用于修改该对象,但这与修改保存引用的变量不同。您提供的两个更改方法与此不同:changeArray()修改其参数所引用的数组对象,但changeWrapper()只为包含其参数的局部变量(最初)分配一个新值。
发布于 2015-01-22 22:46:19
因为包装器对象是不可变的。您必须创建一个新实例,而且由于无法修改调用者的引用,所以不能修改包装器实例。您可以(如果使用Java8)使用Optional,或者创建自己的POJO并传递它(只要修改POJO的引用,调用方就可以从POJO访问它)。就像,
class POJO<T> {
T v;
public POJO(T v) {
this.v = v;
}
public T getValue() {
return v;
}
public void setValue(T v) {
this.v = v;
}
@Override
public String toString() {
return String.valueOf(v);
}
}
public static void changeIt(POJO<Integer> a) {
a.setValue(123);
}
public static void main(String args[]) throws Exception {
POJO<Integer> p = new POJO<>(1);
System.out.println(p);
changeIt(p);
System.out.println(p);
}输出是
1
123https://stackoverflow.com/questions/28099987
复制相似问题