我是一个newbee。
我读到局部变量的作用域将在一个块内(如果我错了请更正我)。在这里,main方法的局部变量(Listli
和li1
以及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
对于ArrayList和StringBuffer,您传递的是一个对可变对象的引用,该对象反映了对持有相同引用的任何变量的任何修改。
在String的情况下,您传递了一个引用,但它是不可变的,所以当您将一些东西连接到它时,实际上是在创建一个新的String对象,并将一个新的引用分配给方法中的变量,您实际上并不是在修改对象本身。
在int的例子中,所有的原语都是按值分配和传递的,所以它实际上是复制它的值并将它传递给方法,所以你对方法内的变量做的任何事情都不会影响方法外的变量。