Java 为什么下面的程序是不同数组的打印对象?

Java 为什么下面的程序是不同数组的打印对象?,java,functional-programming,Java,Functional Programming,我无法理解屏幕后面发生的内部工作,但我感到困惑,因为它在控制台中打印的结果与预期的不同。有人能解释清楚我的问题吗 public class Demo { public int [] sort(int h[]) { int temp; for(int i=0;i<h.length;i++) { for (int j=i;j<h.length;j++) { if(h[i]>h[j])

我无法理解屏幕后面发生的内部工作,但我感到困惑,因为它在控制台中打印的结果与预期的不同。有人能解释清楚我的问题吗

public class Demo {

public int [] sort(int h[])
{
    int temp;
    for(int i=0;i<h.length;i++)
    {
        for (int j=i;j<h.length;j++)
        {
            if(h[i]>h[j])
            {
                temp=h[i];
                h[i]=h[j];
                h[j]=temp;
            }

        }
    }
    return h;
}
public static void main(String args[])
{
    Demo obj =new Demo();
    int a[]={9,2,3,5,32,1,5,3,7};

    int[] sorted=obj.sort(a);

    /*Code to Display Array a*/
    for(int s :a)
    {   
     System.out.print(s+ "  ");
    }

     System.out.println("");


    /*Code to Display Array sorted*/
    for(int k:sorted)
    {   
     System.out.print(k+"  ");
    }
}

  /*
   Expected output
               9  2  3  5  32  1  5  3  7
               1  2  3  3  5   5  7  9  32  

   Actual output 
               1  2  3  3  5  5  7  9  32  
               1  2  3  3  5  5  7  9  32  
 */ 


}
公共类演示{
公共整数[]排序(整数h[])
{
内部温度;

对于(int i=0;i,
sort
方法正在处理通过引用调用传递给方法的实际输入参数(我知道这在措辞上不是100%正确-请参阅)。也就是说,
sort
中对数组
h
的所有更改在调用代码中也是可见的


如果您不想更改输入参数,则需要创建对象的副本。在您的情况下,可以使用
System.arrayCopy
来执行此操作。

sort
方法正在处理通过引用调用传递给方法的实际输入参数(我知道这在措辞上不是100%正确-请参阅)也就是说,
sort
中对数组
h
的所有更改也在调用代码中可见


如果不想更改输入参数,则需要创建对象的副本。在您的情况下,可以使用
System.arrayCopy
来执行此操作。

这是因为当您传递数组对象时,数组int[]h引用相同的内存位置


将int[]a视为一个对象,其字节表示数组内存的地址。现在,当您传递此数组时,相同的字节会复制到int[]h中,因此现在,h也指向相同的内存,因此该内存会被修改。

这是因为当您传递数组对象时,数组int[]h表示相同的内存位置



将int[]a视为一个对象,其中包含表示数组内存地址的字节。现在,当您传递此数组时,相同的字节会复制到int[]中所以现在,h也指向相同的内存,因此内存被修改。

我用int更改了相同的方法,但这次它没有通过引用传递。公共类prac{public int square(int a){return a*a;}public static void main(String args[]){prac obj=new prac();inta=14;intk=obj.square(a);System.out.print(a+);System.out.println(“”);System.out.print(k+);}现在看int a不是一个对象,它是一个基元,它存储14的位模式。相同的位模式被传递到方法上,它返回196的位模式,以k保存。记住这一点的一个简单方法是,对象通过引用传递,基元通过值传递。我尝试了Integer,它通过值传递。Integer是一个对象。它是如何工作的?现在bro,这是因为Integer类是不可变的。当您对Integer类执行操作时,它将被取消绑定为int,执行操作,然后再次将其装箱为Integer。Java 5附带了此装箱、取消装箱功能。您将获得与String、Double和其他不可变包装类Same类似的结果方法I更改了,使用了一个int,但这次它没有通过引用传递。公共类prac{public int square(int a){return a*a;}公共静态void main(String args[]){prac obj=new prac();int a=14;int k=obj.square(a);System.out.print(a+“”);System.out.println(“”);System.out.print(k+" "); } }现在看int a不是一个对象,它是一个基元,它存储14的位模式。相同的位模式被传递到方法上,它返回196的位模式,以k保存。记住这一点的一个简单方法是,对象通过引用传递,基元通过值传递。我尝试了Integer,它通过值传递。Integer是一个对象。它是如何工作的?现在bro,这是因为Integer类是不可变的。当您对Integer类执行操作时,它将被取消绑定为int,执行操作,然后再次将其装箱为Integer。Java 5附带了此装箱、取消装箱功能。您将获得与String、Double和其他不可变包装类Same类似的结果方法I更改了,使用了一个int,但这次它没有通过引用传递。公共类prac{public int square(int a){return a*a;}公共静态void main(String args[]){prac obj=new prac();int a=14;int k=obj.square(a);System.out.print(a+);System.out.println(“”);System.out.print(k+) "); } }Out是19614是的,如果您阅读了Java中调用的另一个问题,您会知道原语不是通过引用传递的,而是通过值传递的。此外,在您的示例中,您没有更改输入参数
a
,而是仅使用其值进行计算…我尝试了Integer,它确实通过值传递了..Integer如前所述,您没有更改示例中
a
的值。为什么要进行任何更改?此外
Integer
是许多不可变类中的一个。也就是说,一旦您创建了
Integer
就不可能再更改此对象。其他不可变类是
String
Byte
Short
,…不客气。您介意投票选出对您有帮助的答案,或者将“最佳”答案标记为正确答案,将此问题标记为已回答…我更改了相同的方法,使用int,但这一次为什么它没有通过引用。公共类prac{public int square(int a){返回a*a;}公共静态void main(字符串args[]){prac obj=new prac();int a=14;int k=obj.square(a);System.out.print(a+“”);System.out.println(“”;System.out.print(k+“”);}Out是19614是的,如果你读过Java中调用的另一个问题,你就会知道原语不是通过引用传递的,而是通过值传递的