Java 为什么新的整数充当值类型int?
或者假设我写信Java 为什么新的整数充当值类型int?,java,Java,或者假设我写信 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; } 但两者的输出相同:9。有人能详细解释一下原因吗?因为JAVA是按值传递的,而不是按引用传递的 让我们这样理解, main函数有一个局部变量z,其作用域仅限于main d函数还有一个局部变量
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;
}
但两者的输出相同:
9
。有人能详细解释一下原因吗?因为JAVA是按值传递的,而不是按引用传递的
让我们这样理解,
main函数有一个局部变量z,其作用域仅限于main
d函数还有一个局部变量z,其作用域仅限于d
因此,在您的d函数中,您基本上创建了一个新的整数文本11,并将其放入局部变量z,该变量的作用域仅限于d函数,而不限于main的变量z。Java有一个自动装箱和自动取消装箱的概念,用于基本数据类型。 由于像int、float-double、long等primitve在技术上不是对象,所以它们有相应的类,这些类可以用primitive值实例化,以将它们视为对象 因此,为了减少痛苦,java自动将int转换为Integer,并在任何适用的情况下将Integer转换为int
如果您想知道为什么加法值没有反映出来,尽管在执行加法时它是一个整数对象,但会产生一个新的int对象。所以它不会直接反映。您可以从调用的方法返回值并分配给它。Java通过值传递变量,而不是通过引用。如果您认为传递一个对象并更改其数据成员的值会起作用,那么它就不会起作用。在这种情况下,也将传递该对象的副本,而不是原始对象。唯一的解决方案是将变量声明为静态变量,可以从任何地方更改。在使用
Integer
的代码中,会发生一个称为取消装箱的过程。调用方法d
时,Integer
-实例被取消绑定到原语int
至于方法d
中的z=z+2
。Java对象是通过引用传递的,但Java原语或不可变对象(如字符串)是通过值传递的。因为您的方法d
有一个基本参数int
,所以在本例中它是通过值传递的。但是,不会返回您的z=z+2
如果要添加System.out.println(z)
就在z=z+2
之后,它确实会打印11
。那么为什么您的main
-方法中的a
没有更改为11
,您如何实现这一点呢?正如我提到的,它是通过原语的值传递的。您需要返回新值,并使用它在main方法中设置a
。如果您将代码更改为此,它将工作:
public static void main(String []args){
int a = 9;
d(a);
System.out.print(a) ;
}
public static void d(int z){
z=z+2;
}
如您所见,
void d
更改为int d
,我们返回z+2
的结果。然后,我们用a=d(a)覆盖a
的值和这个新结果在main
-方法中的code>。这都是因为java的自动装箱和取消装箱功能,它提供了将原语转换为对象(包装器)类型的功能,反之亦然。为了更好地理解,您可以查看
. 我希望它能消除您所有的疑虑。阅读关于基本类型的自动装箱的内容这是Java中的一个名称。Integer
-对象被自动装箱到一个原语int
。为什么希望这两个程序给出不同的结果?
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;
}