动力节点旗下在线教育品牌  |  咨询热线:400-8080-105 学Java全栈,上蛙课网
首页 > 文章

Java按值传递参数详解

07-16 17:35 213浏览
举报 T字号
  • 大字
  • 中字
  • 小字

许多编程语言都允许按引用或按值传递参数。那么Java中,我们只能传递参数。这样自然就施加了一些限制,并且引发了一些疑问。因此本篇文章详细介绍一下java按值传递参数知识例如,如果在方法中更改了参数值,方法执行后该值会怎样?可能还想知道Java如何管理内存堆中的对象值

Java中的所有对象引用均按值传递。这意味着该值的副本将传递给方法。但是诀窍是传递值的副本也会更改对象的实际值。我们可以从下面的实例中看出部分端倪

public class ObjectReferenceExample {

 

public static void main(String... doYourBest) {

         Simpson simpson = new Simpson();

         transformIntoHomer(simpson);

         System.out.println(simpson.name);

}

 

static void transformIntoHomer(Simpson simpson) {

         simpson.name = "Homer";

}

 

}

 

class Simpson {

String name;

}

我们可以思考一下simpson.name在执行transformIntoHomer方法后会怎样?

在这种情况下,它将是Homer!原因是Java对象变量只是指向内存堆中实际对象的引用。因此,即使Java通过值将参数传递给方法,但是如果变量指向对象引用,则实际对象也将被更改。

像对象类型一样,基本类型也按值传递。测试一下自己能否在下面的代码示例中推断出原始类型会发生什么?

public class PrimitiveByValueExample {

 

public static void main(String... primitiveByValue) {

         int homerAge = 30;

         changeHomerAge(homerAge);

         System.out.println(homerAge);

}

 

static void changeHomerAge(int homerAge) {

         homerAge = 35;

}

}

如果确定该值将更改为30,那么是正确的。这是30,因为(再次)Java通过值传递对象参数。数字30只是值的副本,而不是实际值。基本类型在堆栈存储器中分配,因此仅本地值将被更改。在这种情况下,没有对象引用。

传递不可变的对象引用

如果我们对不可变的String对象进行了相同的测试该怎么办?

JDK包含许多不可变的类。实例包括包装类型Integer,Double,Float,Long,Boolean,BigDecimal,和当然的非常公知的String类。

在下一个示例中,请注意当我们更改a的值时会发生什么String。

public class StringValueChange {

 

public static void main(String... doYourBest) {

         String name = "";

         changeToHomer(name);

         System.out.println(name);

}

 

static void changeToHomer(String name) {

         name = "Homer";

}

}

输出为 ""发生这种情况是因为String对象是不可变的,这意味着内的字段String是最终字段,无法更改。

使String类不可变使我们可以更好地控制Java最常用的对象之一。如果a的值String可以更改,则会产生很多错误。还要注意,我们没有更改String类的属性;相反,我们只是String为其分配了一个新值。在这种情况下,“ Homer”值将name在changeToHomer方法中传递到。该方法完成执行后,String“Homer”将有资格被垃圾回收changeToHomer。即使无法更改对象,局部变量也会更改。

String不同JDK中的大多数对象都是可变的,例如StringBuilder类。下面的示例与上一个示例相似,但是功能StringBuilder而不是String:

 static class MutableObjectReference {

    public static void main(String... mutableObjectExample) {

      StringBuilder name = new StringBuilder("Homer ");

      addSureName(name);

      System.out.println(name);

    }

 

    static void addSureName(StringBuilder name) {

      name.append("Simpson");

    }

  }

在这种情况下,因为我们正在使用可变对象,所以输出将为“ Homer Simpson”。可能期望Java中的任何其他可变对象具有相同的行为。

我们已经了解到Java变量是通过值传递的,这意味着将传递值的副本。只要记住复制的值指向Java内存堆中的真实对象即可。按值传递仍然会更改实际对象的值。

我们通过上面的实例不难得出自己的结论:

1.Java总是按值传递参数变量。

2.Java中的对象变量始终指向内存堆中的实际对象。

3.可变对象的值传递给方法时可以更改。

4.不可变对象的值即使传递了新值也无法更改。

5.“按值传递”是指传递值的副本。

6.“通过引用传递”是指在内存中传递变量的真实引用。

我们在学习java的过程中应该有着格物致知的精神,不能知其然而不知其所以然。不能因为知道java的参数是按值传递的就没有后续不求甚解,而是通过自己的实际操作明白了其中的原理,那么这样的知识才是属于你的而不是照搬书上的说辞。

0人推荐
共同学习,写下你的评论
0条评论
轻言绕指柔
程序员轻言绕指柔

14篇文章贡献84145字

作者相关文章更多>

推荐相关文章更多>

DOM渲染的详细过程

QCode09-04 14:38

CSS水平和垂直居中技巧大梳理

Code大师09-04 14:50

mui的input框在IOS系统下无法聚焦或点击多次才能聚焦

不写代码你养我啊08-23 11:14

推荐的-视.频播放器以及在线客服

不写代码你养我啊09-17 18:02

谈谈java多线程的三大特性

要学习了06-18 18:13

发评论

举报

0/150

取消