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

Java通过引用传递

陶乐生
2023-03-14
问题内容

这两个代码有什么区别:

代码A:

Foo myFoo;
myFoo = createfoo();

哪里

public Foo createFoo()
{
   Foo foo = new Foo();
   return foo;
}

VS. 代码B:

Foo myFoo;
createFoo(myFoo);

public void createFoo(Foo foo)
{
   Foo f = new Foo();
   foo = f;
}

这两个代码之间有什么区别吗?


问题答案:

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 modify 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并将其分配给Foo具有属性的type的新对象”f”。
Foo f = new Foo("f");
  1. 从方法方面,声明Foo具有名称的类型引用,a并将其初始分配给null。
public static void changeReference(Foo a)
  1. 调用方法时changeReference,引用a将分配给作为参数传递的对象。
changeReference(f);
  1. 声明一个名为btype 的引用,Foo并将其分配给Foo具有属性的type的新对象”b”。
Foo b = new Foo("b");
  1. a = b正在将引用aNOT 分配给f属性为的对象"b"

  2. 在调用modifyReference(Foo c)method时,将c创建一个引用并将其分配给具有attribute的对象”f”。

  3. c.setAttribute("c");将更改引用所c指向的对象的属性,并且引用所指向的对象是同一对象f。

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



 类似资料:
  • 问题内容: 是否可以通过Java通过引用传递对象 就像在C#中一样 问题答案: 不,这在Java中是不可能的。 在Java中,方法的所有参数均按值传递。注意非原始型的的变量,它们是对对象的引用,也由值来传递:在这种情况下, 参考 是 由值来传递 。请注意,按值传递引用与按引用传递不同。

  • 问题内容: 您可以使用关键字“ ref”在.NET中进行操作。用Java有什么办法吗? 问题答案: 您正在用自己的方法做什么?如果仅填充现有数组,则不需要.NET或Java中的按引用传递语义。在这两种情况下,引用都将按值传递-因此对 对象的 更改将由调用者看到。这就像告诉某人您的住所地址,并要求他们向其提供物品-没问题。 如果您 确实 需要传递引用语义,即调用方将看到对参数本身所做的任何更改,例如

  • 问题内容: 因此,我正在阅读这篇文章,并没有回复。2.在该示例中,调用该方法后,地址42处的Dog值是否更改为Max? 问题答案: Java通过值传递- 始终 为基元和对象传递值。 就对象而言,传递的是对存在于堆中的对象的引用。当传入引用时,方法不能更改该引用所指向的内容。 如果该引用指向具有可变数据的对象,则该方法可以更改其状态。 摘自Ken Arnold和James Gosling撰写的“ J

  • 问题内容: 我习惯在中执行以下操作: 输出为: 但是,在Java中,这似乎不起作用。我认为是因为该对象是复制的,而不是通过referenced传递的。我以为字符串是对象,总是通过引用传递。 这里发生了什么? 问题答案: 你有三种选择: 使用StringBuilder: 创建一个容器类,并将容器的实例传递给你的方法: 创建一个数组: 从性能的角度来看,StringBuilder通常是最佳选择。

  • 问题内容: 我认为几乎所有语言(包括Java)都将数组传递给函数作为引用(可修改)。 但由于某种原因,它在这里不起作用,并且大小仍为。 奇怪的是,如果我更改为它的话。它确实通过了引用。 此代码有什么问题? 最后,我有了;(更新a)。结果是否从堆栈中删除。这就是为什么我仍然要恢复原著a吗? 我很迷惑。 谢谢! 问题答案: 数组通过引用传递,但引用通过传递。也就是说,您可以更改所引用的数组,但是不能更

  • 问题内容: 该程序给出6作为输出,但是当我取消注释第9行时,输出为5。为什么?我认为ba不应更改,主要应保持5。 问题答案: 在Java中传递对象时,它们将作为in 方法中引用的参考含义对象和method 中的参数传递,它们都指向同一对象,因此,当您将值更改为6时,它将反映在方法中。 现在,当您尝试执行此操作时,您将指向另一个对象,但仍指向您在方法中创建的对象,因此更新的值6在main方法中不可见