为什么新的Integer用作值类型int?

时间:2018-07-23 06:59:46

标签: 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; 
}

或者假设我写

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。谁能详细解释我为什么?

5 个答案:

答案 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实例被取消装箱到原始dSee 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; 
}

Try it online.

如您所见,void d更改为int d,我们返回了z+2的结果。然后,我们用a方法中的a = d(a);用这个新结果覆盖main的值。

答案 4 :(得分:0)

所有这些都是由于Java的自动装箱和拆箱功能,该功能提供了将原语转换为对象(包装)类型,反之亦然的功能。为了更好地理解,您可以检查here 。我希望它能消除您的所有疑问。