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

在Java中按值传递还是按引用传递?

漆雕修德
2023-03-14
问题内容

我读了许多文章,都说Java是通过价值传递的。但是我仍然不能解释按值传递和引用之间的区别。我写了一个示例程序,它像这样执行。

public class PassByValue {

   private int a;
   private int b;

   public PassByValue(int a, int b) {
    this.a = a;
    this.b = b;
   }

   public static int mul(int a, int b) {

       int z = a * b;
       System.out.println("The Value of Z inside mul: " + z);
       return z;

   }

   public static void main(String args[]) {

    int z = 100;

        int x = 40;
        int y = 20;

    mul(x,y);

    PassByValue pass = new PassByValue(x,y);
    mul(pass.a,pass.b);

        System.out.println("The Value of Z" + z);

   }

}

执行

800
800 and 
100

谁能向我解释这些问题…

  1. 价值传递是什么意思?

答:它只是将存储在变量中的数字或值传递给函数。我是对还是错。

  1. How do you say Java是通过价值传递?
  2. 为什么Java是按值传递而不是按引用传递?
  3. 上面的程序Tries是否显示了“按值传递”和“引用”的示例…但是仍然仅通过“按值传递”来做事情…我编写了该程序。

问题答案:

您的回答正确,但缺乏细节。如果你这样做

Dog d = new Dog()

d是对Dog实例的引用,即按值传递意味着您在传递d给方法时

walkDog(d);

到Dog的引用的 副本
(即,引用的值,而不是引用本身)被传递到方法中。因此,您有2个对Dog实例的引用,一个在调用范围内,一个在被调用范围内。可以说walkDog方法中有一行

d = new Dog();

方法中d引用 指向新的Dog。最初调用该方法的原始参考仍然指向originalDog。如果Java通过引用传递,则在该方法中将使用
相同的引用,而不是引用的副本 ,因此更改引用的值将影响调用范围和被调用范围的引用。

编辑-根据您的评论,我想澄清一下。由于原始范围和方法范围中的引用都指向 同一个 对象,因此您仍然可以在两个范围中对该对象进行更改。所以如果你这样做

d.drinkWater();

在该walkDog方法中,并drinkWater更改dog对象上的某些变量,然后由于两个引用都指向了已更改的同一对象。

这只是每个范围中 引用 实际上是什么之间的区别。但这确实很多。



 类似资料:
  • 问题内容: 我一直认为Java使用传递引用。 但是,我已经看到了几篇博客文章声称不是(博客文章说Java使用值传递)。 我不认为我能理解他们的区别。 有什么解释? 问题答案: Java总是按值传递。 不幸的是,我们根本不处理任何对象,而是处理称为引用的 对象句柄(当然是通过值传递)。选择的术语和语义很容易使许多初学者感到困惑。 它是这样的: 在上面的示例中仍将返回”Max”。值aDog内main未

  • 本文向大家介绍JS是按值传递还是按引用传递,包括了JS是按值传递还是按引用传递的使用技巧和注意事项,需要的朋友参考一下 按值传递 VS. 按引用传递 按值传递(call by value)是最常用的求值策略:函数的形参是被调用时所传实参的副本。修改形参的值并不会影响实参。   按引用传递(call by reference)时,函数的形参接收实参的隐式引用,而不再是副本。这意味着函数形参的值如果被

  • 因此,在父对象的状态中所做的更改也可以通过它所出现的道具立即在子对象中使用。 这样做正确吗?

  • 问题内容: 数组不是Java中的原始类型,但它们也不是对象,因此它们是按值还是按引用传递?它是否取决于数组包含的内容,例如引用或原始类型? 问题答案: 。如果是Array(只不过是Object),则数组引用按值传递。(就像对象引用按值传递)。 当你将数组传递给其他方法时,实际上是复制对该数组的引用。 通过该引用对数组内容进行的任何更改都会影响原始数组。 但是,将引用更改为指向新数组不会更改原始方法

  • 数组在Java中不是一种基元类型,但它们也不是对象,那么它们是通过值传递还是通过引用传递呢?它是否取决于数组包含什么,例如引用或基元类型?

  • 我创建了一个MapReduce作业,该作业将计算键的数量,然后根据它们出现的次数对它们进行排序 处理输入时,如 最终目标将是一个类似于 我的地图阶段输出a 我的减少阶段有3个阶段:设置,我初始化一个数组列表来保存我的 数组列表中的值是我创建的一个对象myObject的值,它将文本和Int保存在一个元组中可写,我发现一个奇怪的地方是当我这样做的时候 key是传递到reducer的键,count是我通