当前位置: 首页 > 图灵资讯 > 技术篇> Java按值传递参数详解

Java按值传递参数详解

来源:图灵教育
时间:2023-04-04 10:30:31

许多编程语言允许按引用或按值传递参数。那么在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类别。

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

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”在changetohomer方法中传递name。该方法完成实施后,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的参数是按值传递的,没有后续的解决方案,而是通过自己的实际操作了解原理,所以这些知识属于你,而不是复制书中的文字。