带有list,string和stringbuffer的局部变量行为

时间:2014-06-30 09:56:19

标签: java string list local-variables stringbuffer

我是新手。
我已经读过,局部变量的范围将在一个块内(如果我错了,请纠正我)。 这里,main方法的局部变量(列表lili1以及StringBuffer y)的行为类似于实例变量,变量(String y1和int { {1}})表现得像局部变量。为什么?

x

输出:

public class Test {
    public static void addValues(ArrayList<String> list, StringBuffer sb, int x){
        list.add("3");
        list.add("4");
        list.add("5");

        sb.append("String Buffer Appended !");
        x=x+10;
    }

    public static void addValues(ArrayList<String> list, String sb, int x){
        list.add("3");
        list.add("4");
        list.add("5");

        sb = sb + "is Appended !";
        x=x+10;
    }

    public static void main(String[] args) {
        ArrayList<String> li = new ArrayList<>();
        ArrayList<String> li1 = new ArrayList<>();
        StringBuffer y=new StringBuffer("ab");
        int x=10;
        String y1=new String("ab");
        li.add("1");
        li.add("2");
        li1.add("1");
        li1.add("2");
        System.out.println("b4 : "+li+" , y = "+y+" , y1 = "+y1+" x= "+x);
        addValues(li,y,x);
        System.out.println("Af : "+li+" , y = "+y+" x= "+x);
        addValues(li1,y1,x);
        System.out.println("Af : "+li1+" , y1 = "+y1+" x= "+x);
    }
}

2 个答案:

答案 0 :(得分:3)

对于ArrayList和StringBuffer,您将传递对可变对象的引用,该对象反映对具有相同引用的任何变量的任何修改。

在String的情况下你也传递了一个引用但是它是不可变的,所以当你连接它时,它实际上创建了一个新的String对象并为方法中的变量赋值,你实际上并没有修改对象本身。

在int的情况下,所有基元都按值分配和传递,因此它实际上复制了它的值并将其传递给方法,因此对方法中的变量所做的任何操作都不会影响变量在它之外。

答案 1 :(得分:0)

Java总是按值传递,意味着它总是将变量(原始变量和引用变量)的副本传递给方法的代码块。

当我们传递一个Object引用变量(在这种情况下是ArrayList和StringBuffer)时,实际上我们正在复制那里的引用变量的位模式,而不是它自己的真实对象,你的addValues方法中的新副本完全相同object作为main方法中声明的对象,因此每当我们修改对象成员的值时,copy和actuall对象引用变量都会看到更改。

默认情况下,String是不可变的和int,默认情况下它们是不可变的。因此,每当我们将它们作为参数传递给方法时,方法只会获得String和int的值的副本。

你的问题与&#34; Stack and Heap&#34;在java中。您可以将this video视为参考