首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >数组对象与其他对象有何不同

数组对象与其他对象有何不同
EN

Stack Overflow用户
提问于 2015-01-22 22:41:18
回答 5查看 104关注 0票数 2

我对数组的工作方式感到困惑。如果将数组引用传递给某些方法,则该方法能够更改以前存储在数组中的索引值。但是,如果对包装类对象执行相同的操作,则该方法无法更改该值。以下是代码:

代码语言:javascript
复制
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;
    }
}

产出:

代码语言:javascript
复制
789
-----------------
123

为什么数组能够更改而不是包装对象。有人能消除我的疑虑吗?谢谢。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2015-01-22 22:56:46

与其使用Integer包装器,不如使用类似的方法(请注意,自动装箱将被打破,因此必须手动完成):

代码语言:javascript
复制
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方法可以是:

代码语言:javascript
复制
void changeWrapper(MyInteger i){
    i.setValue(789);
}

代码语言:javascript
复制
    ch.changeWrapper(iWrapper);
    System.out.println(iWrapper.intValue());

将打印"789“。

或者,您可以将intValue公开:

代码语言:javascript
复制
public int intValue;

然后,您的changeWrapper方法可能变成:

代码语言:javascript
复制
void changeWrapper(MyInteger i){
    i.intValue = 789;
}

这实际上就是数组的含义--一个包含大量公共字段的对象。

票数 1
EN

Stack Overflow用户

发布于 2015-01-22 22:49:42

Java方法的所有参数都是通过值传递的。当参数为引用类型(相对于原始类型)时,则通过值传递引用。本质上,这意味着该方法接收调用方值的副本。

对可变对象的任何引用都可以用于修改该对象,但这与修改保存引用的变量不同。您提供的两个更改方法与此不同:changeArray()修改其参数所引用的数组对象,但changeWrapper()只为包含其参数的局部变量(最初)分配一个新值。

票数 5
EN

Stack Overflow用户

发布于 2015-01-22 22:46:19

因为包装器对象是不可变的。您必须创建一个新实例,而且由于无法修改调用者的引用,所以不能修改包装器实例。您可以(如果使用Java8)使用Optional,或者创建自己的POJO并传递它(只要修改POJO的引用,调用方就可以从POJO访问它)。就像,

代码语言:javascript
复制
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);
}

输出是

代码语言:javascript
复制
1
123
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28099987

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档