Java中的引用类型

Java中的引用类型,java,Java,可能重复: 对于下面的Java程序,我的理解是a是整数的引用类型,就像C/C++中的指针类型一样。因此,在方法f中对其值所做的任何更改都将在方法返回后反映出来。但是println仍然打印其原始值0,而不是3 Integer和int没有区别。我以前的理解错了吗?请帮忙。谢谢大家! public static void f(Integer b){ b=3; } public static void main(String[] args)

可能重复:

对于下面的Java程序,我的理解是
a
是整数的引用类型,就像C/C++中的指针类型一样。因此,在方法
f
中对其值所做的任何更改都将在方法返回后反映出来。但是
println
仍然打印其原始值
0
,而不是3

Integer
int
没有区别。我以前的理解错了吗?请帮忙。谢谢大家!

  public static void f(Integer b){
            b=3;
        }
        public static void main(String[] args){
            Integer a=0;
            f(a);
            System.out.println(a);
      }

在Java中,一切都是按副本传递的,在您的方法中,您链接的是引用,而不是它所指向的实际对象。

整数是不可变的,因此按引用传递不会按预期工作。请参见

方法接收引用的副本。赋值不会更改整数表示的值(即使它希望-
integer
在Java中是不可变的,也无法更改)。它只是将
b
设置为指向其他对象。
a
指向的原始
Integer
对象不受此更改的影响

b=3

------    ------
|  a |    |  b |
------    ------
  |          |
  ------------
        |
   Integer(0)
------    ------
|  a |    |  b |
------    ------
  |          |
  |          |
  |          |
Integer(0)  Integer(3)
b=3

------    ------
|  a |    |  b |
------    ------
  |          |
  ------------
        |
   Integer(0)
------    ------
|  a |    |  b |
------    ------
  |          |
  |          |
  |          |
Integer(0)  Integer(3)
如果要更改该值,则必须使用可变类型

相关的


    • 您的理解是正确的,但整数是不可变的。如果要影响整型变量的值,唯一的方法是创建新的整型对象并放弃旧的整型对象。因此,语句
      b=3
      无效。

      Integer
      (与其他“基本”类一样)是可变对象。这意味着没有可以更改值的方法。如果你这样做

       new Integer(1);
      
      创建的对象将始终保持1值

      你当然可以

      Integer a = new Integer(1);
      a = new Integer(2);
      
      但这里您要做的是创建两个对象,然后依次为每个对象指定一个

      调用该方法时,您正在
      a
      中传递引用的副本(正如edalorzo所说),因此您的操作基本相同(但没有更改原始
      a
      引用)

      当然,很多类是不可变的。在这些类中,您将有一个(或多个)方法允许您更改对象的内部状态,并且(只要您正在访问同一个对象),这些更改将由对象的所有引用“共享”(因为它们都指向同一个引用)。例如,假设Integer有一个
      setValue(int)
      方法,那么

      public static void f(Integer b){      
              b.setValue(3);      
          }      
          public static void main(String[] args){      
              Integer a=0;      
              f(a);      
              System.out.println(a);      
        }    
      

      将按预期工作。

      Java总是通过值而不是引用传递参数


      让我通过一个例子来解释这一点:

      我将分步骤解释这一点:

    • 声明类型为
      Foo
      的名为
      f
      的引用,并将其分配给具有属性
      “f”
      的类型为
      Foo
      的新对象

    • 从方法方面,声明了一个名为
      a
      Foo
      类型的引用,并将其初始分配给
      null

      public static void changeReference(Foo a)
      

    • 调用方法
      changeReference
      时,引用
      a
      将被分配给作为参数传递的对象

      changeReference(f);
      

    • 声明类型为
      Foo
      的名为
      b
      的引用,并将其分配给具有属性
      “b”
      的类型为
      Foo
      的新对象

    • a=b
      正在将引用
      a
      而不是
      f
      重新分配给其属性为
      “b”
      的对象


    • 调用
      modifyReference(Foo c)
      方法时,将创建一个引用
      c
      ,并将其分配给具有属性
      “f”
      的对象

    • c.setAttribute(“c”)
      将更改引用
      c
      指向它的对象的属性,并且引用
      f
      指向它的对象是同一个对象


    • 我希望您现在了解在Java中作为参数传递对象是如何工作的:)

      这是一样的,我试过了。那么,在Java中方法返回后,如何更改int并保持效果?我必须将int打包到一个类中吗?让你的方法返回新的整数并分配给你作为参数传递给你的方法的原始引用。Downvoter,请告诉我。那么不可变引用和可变引用有何不同?@littleEinstein:它不是可变或不可变的引用。就是这种类型<代码>整数
是不可变的。一旦创建了
整数
,就无法更改其内容。但您可以重新分配一个变量,以指向一个新的具有不同值的
整数。+1对于酷图形,您是在10分钟内完成所有这些绘图还是已经完成了?@Luciano我已经完成了:
Foo b = new Foo("b");