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; 
}