public static void main(String []args){
Integer a = new Integer(9);
d(a);
System.out.print(a) ;
}
public static void d(int z){
z=z+2;
}
或者假设我写
public static void main(String []args){
int a = 9;
d(a);
System.out.print(a) ;
}
public static void d(int z){
z=z+2;
}
,但两者的输出相同:9
。谁能详细解释我为什么?
答案 0 :(得分:1)
因为JAVA是按值传递,而不是按引用传递。
让我们这样理解
您的main函数具有一个局部变量z,其范围仅限于main
并且您的d函数还有另一个局部变量z,其范围仅限于d
因此,在功能上,您基本上是在创建一个新的整数文字11,并将其放到局部变量z中,该变量的作用域仅限于d函数,而不是main变量z。
答案 1 :(得分:0)
Java对原始数据类型具有自动装箱和自动拆箱的概念。 由于从技术上说int,float double,long等primitves不是对象,因此它们具有相应的Class,可以使用原始值实例化这些Class来将它们视为对象。
因此,为了减轻痛苦,java会在适用的情况下自动将int转换为Integer并将Integer转换为int。
如果您想知道加法值为何没有反映出来,尽管它是执行加法运算时的一个Integer对象,则会生成一个新的int对象。因此它不会直接反映出来。您可以从调用的方法中返回值并将其分配给它。
答案 2 :(得分:0)
Java通过值而不是通过引用传递变量。如果您认为传递对象并更改其数据成员的值将是可行的,则不会。在这种情况下,也将传递该对象的副本,而不是原始对象。唯一的解决方案是将变量声明为static,可以在任何地方进行更改。
答案 3 :(得分:0)
在带有Integer
的代码中,会发生一个称为拆箱的过程。调用方法Integer
时,int
实例被取消装箱到原始d
。 See this to better understand how autoboxing and unboxing works.
关于方法z=z+2
中的d
。 Java对象是按引用传递的,但是Java基元或不可变对象(如Strings)是按值传递的。由于您的方法d
具有原始参数int
,因此在这种情况下按值传递。但是,您的z=z+2
未返回。
如果您要在System.out.println(z);
之后添加z=z+2
,则确实会打印11
。那么,为什么您的a
方法中的main
没有更改为11
,又如何实现呢?正如我所提到的,它是为基元传递值的。您需要返回新值,并使用它在main方法中设置a
。如果将代码更改为此,它将起作用:
public static void main(String []args){
int a = 9;
a = d(a);
System.out.print(a);
}
public static int d(int z){
return z+2;
}
如您所见,void d
更改为int d
,我们返回了z+2
的结果。然后,我们用a
方法中的a = d(a);
用这个新结果覆盖main
的值。
答案 4 :(得分:0)
所有这些都是由于Java的自动装箱和拆箱功能,该功能提供了将原语转换为对象(包装)类型,反之亦然的功能。为了更好地理解,您可以检查here 。我希望它能消除您的所有疑问。