关于值类型和引用类型的问题
1求输出结果
public class TestA {
int i ;
void change(int i){
i++;
System.out.println(i);
}
void change1(TestA t){
t.i++;
System.out.println(t.i);
}
public static void main(String[] args) {
TestA ta = new TestA();
System.out.println(ta.i); //0
ta.change(ta.i);//1
System.out.println(ta.i); //0
ta.change1(ta); //1
System.out.println(ta.i);//1
}
}
这里的change方法传入的是ta.i的值,并在change方法中又声明了一个i,这个i是局部变量,存储在栈中,而ta对象中的属性值都存在堆中。change方法对栈中的i做了一系列操作后,方法结束,i出栈,对ta没有影响。
而change1方法传入的是ta对象,在参数列表中又新建了一个t对象,并将它指向ta,此时t和ta指向的是堆中相同的数据,因此对t做的操作会影响到ta对象的属性值,但是如果把t指向其他对象的话,并不会对ta造成影响。
2
class Value{
int i = 15;
}
public class Test{
public static void main(String argv[]) {
Test t = new Test();
t.first();
}
public void first() {
int i = 5;
Value v = new Value();
v.i = 25;
second(v, i);
System.out.println(v.i);
}
public void second(Value v, int i) {
i = 0;
v.i = 20;
Value val = new Value();
v = val;
System.out.print(v.i + " " + i);
}
}
A.15 0 20
B.15 0 15
C.20 0 20
D.0 15 20
A is correct.
这题重点在于first方法调用second方法,传入一个value类型的v和一个int类型的i。
在second方法的参数列表又声明了一个新的value对象v,并指向first方法传入的v,此时两个v存在在栈中,并指向同一个堆中的数据,因此,对v中属性的操作会改变堆中的数据,但是如果把second中的v指向其他对象,对于first中的v没有影响,仅仅是本来v(second)–>v(fiest) to v(second)–>val(second);这里要是有一张堆栈图就好了,可惜我不会画