【问题标题】:Java array method(Confusion) [duplicate]Java数组方法(混淆)[重复]
【发布时间】:2016-01-11 19:07:07
【问题描述】:

我对这种方法感到困惑。我认为通常你需要返回一些东西。或者在我看来,我会认为需要一个 for 循环,将元素从为每个元素添加 5 的方法中传回。

但是当数组传递给方法时,数组本身发生了变化,但是为什么呢?

public static void main(String[] args) {
       int ray[]={3,4,5,6,7};
       change(ray);

       for(int y: ray){
           System.out.println(y);
       }
    }
    public static void change(int x[]){
        for(int counter = 0; counter < x.length;counter++){
            x[counter]+=5;
        }
    }

【问题讨论】:

    标签: java arrays methods


    【解决方案1】:

    在Java中,所有对象都是通过引用传递的,数组就是对象。这意味着您的change 方法接收到在main 中创建的相同数组——而不是它的副本,相同的对象。所以当你修改它时,main 方法也会看到这种变化。

    【解决方案2】:

    Java 是对原语按值传递,对其他所有事物(包括数组)按引用(值)传递。

    http://javadude.com/articles/passbyvalue.htm

    这基本上意味着您的函数没有获得数组的副本,而是获得了数组本身。

    用一个 int 试试(原来的值不会改变,因为它是一个原始值)。

    public static void main(String[] args) { int ray[]={3,4,5,6,7}; 改变(射线);

       for(int y: ray){
           System.out.println(y);
       }
    
    
    }
    
    public static void change(int i){
          i = i + 10;
    }
    
    
    
    public static void change(int x[]){
        for(int counter = 0; counter < x.length;counter++){
            x[counter]+=5;
        }
    }
    

    有些人会说 Java 总是按值传递,但这是因为在引用方面选择不当。

    从概念上讲,对象是通过引用传递的,而基元是通过值传递的。你可以随便叫它,但它看起来像鸭子,走路像鸭子,叫起来像鸭子。

    试试这个,你会得到更好的主意:

    /**
     * Main 
     * 
     */
    public class Main {
    
        static class IntegerClass {
            int internal;
    
            public IntegerClass(int i) {
                internal = i;
            }
    
            public void setInternal(int i) {
                internal = i;
            }
    
            public int getInternal() {
                return internal;
            }
        }
    
        public static void main(String[] a) {
            int x = 10;
            changeInteger(x);
            System.err.println(x);
    
            IntegerClass ic = new IntegerClass(10);
            changeIntegerClass(ic);
            System.err.println(ic.getInternal());
        }
    
        public static void changeIntegerClass(IntegerClass ic) {
            ic.setInternal(500);
        }
    
        public static void changeInteger(Integer i) {
            i = 500;
        }
    }
    

    【讨论】:

    • 实际上,java 不是对象的传递引用。它是按值传递的。唯一改变的是,对于对象,引用是按值传递的,因此您将不能够修改对象本身,但您将能够修改对象的每个属性对象。因此,对于数组,您将无法更改数组本身,您将能够更改存储在数组中的值。在您的示例中,这意味着您无法使用新数组重新分配 x,您只能更改其内容。
    • 看我的编辑,说 java 总是通过价值传递就像说飞机不能飞,但没有告诉任何人说飞你真的意味着游泳。
    • @mikeb 不,不一样。如果一个对象是按引用传递的,则意味着您可以修改引用。在 java 中,您不能修改引用,这就是为什么要注意 java 按值传递引用的原因。在 C、C++ 和类似语言中,您可以修改引用,因此您可以编辑传递给方法的所有内容。在java中你不能。见this example。参考您的最后一个示例,如果对象是按引用传递的,则方法 changeInteger 将能够更改 i 的值。
    • 谢谢你们。我现在明白了!
    猜你喜欢
    • 2016-04-02
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 2013-08-02
    • 1970-01-01
    • 2012-08-12
    • 1970-01-01
    • 2014-01-13
    相关资源
    最近更新 更多