当将对象引用或基元类型作为参数传递时,void方法的行为如何

时间:2014-06-18 07:56:18

标签: java pass-by-value

我有一个有void方法的类。

我的问题是,这些方法是如何执行的。因为我的stringBuilderAppend()是一个void方法,但是当我调用这个方法时,它会返回在该方法中附加的值,并且我正在使用其他两个方法(即stringAppend()和addNumbers())进行相同的检查。不归还任何东西。

  public class VoidMethodChecker {
    public static void main(String... a){
        StringBuilder stringBuilder = new StringBuilder("first StringBuilder ");
        stringBuilderAppend(stringBuilder);

        String string = "first String ";
        stringAppend(string);

        int number = 0;
        addNumber(number);


        /* stringBuilderAppend method prints "first StringBuilder second StringBuilder"
        *  why does stringBuilder() returning the appended value. (my stringBuilder() is void method) 
        *  as other two method does not appending*/

        System.out.println(stringBuilder);     // it prints "first StringBuilder second StringBuilder"

        System.out.println(string);            // it prints "first String"
        System.out.println(number);            // it prints "0"
    }

    private static void stringBuilderAppend(StringBuilder stringBuilder) {
        stringBuilder.append("second StringBuilder");
    }

    private static void addNumber(int number){
        number = 120;
    }

    private static void stringAppend(String string){
        string += "second String";
    }
}

由于

4 个答案:

答案 0 :(得分:3)

stringBuilderAppend:该方法没有返回任何内容。您正在传递一个对象并在方法体内修改其状态。当您在调用方法中保留对同一对象的引用时,您会看到对该对象所做的更改。这是面向对象的基本概念,您需要了解它。

addNumber:您正在传递一个分配给参数number的原始整数。该参数只是一个仅在方法体中可见的变量。如果为该变量分配一个新值,那么调用者就不会看到该值。如果您在修改变量(stringBuilderAppend)之前将新的StringBuilder分配给stringBuilder = new StringBuilder(),则stringAppend也会发生同样的情况。

addNumber:基本上与string += "second String"相同。 string = string + "second String"与{{1}}相同,因此您要为变量分配新值。

答案 1 :(得分:2)

您正在将引用值传递给您的函数private static void stringBuilderAppend(StringBuilder stringBuilder)

这意味着函数可以修改stringBuilder引用的对象。这就是你正在做的事情。

中在您的函数中执行的操作是在stringBuilder中设置main以引用其他StringBuilder实例。

答案 2 :(得分:2)

让我们来看看你的例子:

stringBuilderAppend: 您的main - 方法创建一个StringBuilder - 对象,并将引用(确切地说:原始引用的副本,因为引用按值传递)传递给该对象stringBuilderAppend。在那里你调用该对象的append()方法,从而修改原始对象。

addNumber:由于number是intint是基本类型,因此您不传递引用,而是传递原始int的副本。在方法期间修改,但原始变量保持不变

stringAppend:这里的事情开始变得有趣了。您正在将引用的副本传递给原始String - 对象。但+=并未修改原始对象(String无法修改,它们是不可变的),而是将连接的String创建为新对象。然后,赋值将替换引用的副本。原始参考和原始对象都保持不变。

答案 3 :(得分:0)

Java字符串是不可变的,即您无法更改字符串的值。将新字符串文字添加到现有值时,Java会再创建一个新字符串。 StringBuilder / StringBuffer可变的地方。

因此,在String的情况下,它在内存中创建一个包含值“first stringsecond string”的新文字,其中将范围限制为该特定方法。在StringBulder的情况下,它将字符串附加到现有字符串。

然而,当您将int作为参数传递时,它将按值传递。

谢谢, JK