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中调用的另一个问题,你就会知道原语不是通过引用传递的,而是通过值传递的