提问者:小点点

list、string和stringbuffer的局部变量行为[duplicate]


我是一个newbee。
我读到局部变量的作用域将在一个块内(如果我错了请更正我)。在这里,main方法的局部变量(Listlili1以及StringBuffery)的行为类似于实例变量,而变量(Stringy1和intx)的行为类似于局部变量。为什么?

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);
    }
}

输出:

b4 : [1, 2] , y = ab , y1 = ab x= 10
Af : [1, 2, 3, 4, 5] , y = abString Buffer Appended ! x= 10
Af : [1, 2, 3, 4, 5] , y1 = ab x= 10

共1个答案

匿名用户

对于ArrayList和StringBuffer,您传递的是一个对可变对象的引用,该对象反映了对持有相同引用的任何变量的任何修改。

在String的情况下,您传递了一个引用,但它是不可变的,所以当您将一些东西连接到它时,实际上是在创建一个新的String对象,并将一个新的引用分配给方法中的变量,您实际上并不是在修改对象本身。

在int的例子中,所有的原语都是按值分配和传递的,所以它实际上是复制它的值并将它传递给方法,所以你对方法内的变量做的任何事情都不会影响方法外的变量。

相关问题