当前位置: 首页 > 面试题库 >

不变并传递价值

雍马鲁
2023-03-14
问题内容

我有以下代码,其中包含可变的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);

}

  }

The output is as expected. It prints

           bar
          Person [a=45]

现在,我的问题是

您说的地方str =” foo”发生了什么事?

最初,假设s =’bar’并且数据驻留在0x100内存中

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

Java是否按值传递引用?


问题答案:

Java始终按值传递参数,而不按引用传递参数。

让我通过一个

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- 声明一个名为ftype的引用,Foo并将其分配给具有属性的type的新对象。Foo"f".

Foo f = new Foo("f");

2- 从方法方面,声明Foo具有名称的类型引用, 并将其初始分配给。a null

public static void changeReference(Foo a)

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

changeReference(f);

4- 声明一个名为btype的引用,Foo并将其分配给具有属性的type的新对象。Foo"b".

Foo b = new Foo("b");

5- a = b 正在将引用aNOT分配给 属性为f的对象。"b"

6-调用modifyReference(Foo c)方法时,将c创建一个引用并将其分配给具有attribute的对象”f”。

7 c.setAttribute("c");将对象的属性更改参考c点它,和它的同一个对象引用f指向它。

我希望您现在了解如何将对象作为参数传递给Java :)



 类似资料:
  • 我一直认为Java使用按引用传递。 然而,我看到一篇博客文章声称Java使用传递值。 我想我不明白他们的区别。 原因是什么?

  • 如何从片段和活动中传递和获取值?

  • 我有一个带有WebSockets的应用程序,使用spring-boot应用程序作为后端,在客户端使用stomp/sockjs,spring-boot应用程序使用JMS队列消息并将更改通知给正确的用户。问题出在哪里?有时工作有时不工作,同样的代码和用户可以工作或不工作。 编辑1: 经过更多的调试,当不工作的时候,WebSocket的“会话”似乎被Spring配置丢失了。我看不到任何关于“断开连接”消

  • 问题内容: 据说在Java方法中,参数是通过值传递的,这对于基元和对象都是正确的,而对象的引用是通过值传递的。为了说明,请考虑以下代码: 能给出相同结果的C ++等价物是什么? 在调用该方法后,使d1的值与该方法内的值相同,即调用方看到修改后的值,那么C ++的等效项是什么? 问题答案: C ++对于值和引用的语义与Java不同。首先,每种类型都有可能通过复制,引用或地址传递(但是,可以通过隐藏复

  • 我正在尝试使用JDBC连接到MySQL。如果我将url、用户名和密码的硬代码值传递给DriverManager,我会有一个奇怪的行为。getConnection()与数据库的连接正常。但如果我将参数作为变量传递,则与JDBC的连接失败,并出现以下错误。 JAVAsql。SQLException:找不到适用于“jdbc:mysql://localhost:3306/hplus"

  • 我正在尝试运行一个带有env变量的docker映像。 但是它对我来说不管是使用env.list文件还是命令行都不起作用。