加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 不可变,并通过价值

发布时间:2020-12-14 05:26:10 所属栏目:Java 来源:网络整理
导读:我有以下代码 一个可变的Person类,String和一个修改String和Person实例的方法 class Person{int a = 8;public int getA() { return a;}public void setA(int a) { this.a = a;}@Overridepublic String toString() { return "Person [a=" + a + "]";} } – pu
我有以下代码
一个可变的Person类,String和一个修改String和Person实例的方法
class Person{

int a = 8;

public int getA() {
    return a;
}

public void setA(int a) {
    this.a = a;
}

@Override
public String toString() {
    return "Person [a=" + a + "]";
}

  }

public class TestMutable {
public static void main(String[] args)
{
    Person p = new Person();
    p.setA(34);


    String s = "bar";

             modifyObject(s,p);   //Call to modify objects

    System.out.println(s);
    System.out.println(p);

}



private static void modifyObject(String str,Person p)
{

        str = "foo";
        p.setA(45);

}

  }

输出如预期.它打印

bar
          Person [a=45]

现在我的问题是

在你说str =“foo”的地方发生了什么?

最初假设s =’bar’,数据位于0x100内存中

现在,string的引用传递给另一个方法,另一个方法尝试使用s =“foo”将内存位置(0x100)的内容更改为’foo’.这是发生了什么,还是在不同的内存位置创建“foo”?

java通过值引用引用吗?

解决方法

Java总是通过引用通过值NOT传递参数.

让我通过example解释一下:

public class Main
{
     public static void main(String[] args)
     {
          Foo f = new Foo("f");
          changeReference(f); // It won't change the reference!
          modifyReference(f); // It will change the object that the reference variable "f" refers to!
     }
     public static void changeReference(Foo a)
     {
          Foo b = new Foo("b");
          a = b;
     }
     public static void modifyReference(Foo c)
     {
          c.setAttribute("c");
     }
}

我将在步骤中解释一下:

1-声明一个名为f的F类型的引用,并将其分配给一个具有属性“f”的Foo类型的新对象.

Foo f = new Foo("f");

2-从方法方面,声明类型为Foo的名称为a的引用,最初分配给null.

public static void changeReference(Foo a)

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

changeReference(f);

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

Foo b = new Foo("b");

5- a = b将参考a NOT f重新分配给其属性为“b”的对象.

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

7- c.setAttribute(“c”);将更改引用c指向的对象的属性,它与引用f指向的对象相同.

我希望你现在明白传递对象作为参数在Java中的作用:)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读