我是新手。
我已经读过,局部变量的范围将在一个块内(如果我错了,请纠正我)。
这里,main方法的局部变量(列表li
和li1
以及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);
}
}
答案 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视为参考