【面试题】Java值传递、引用传递问题面试题探究
相关面试题如下
写出下面的程序的运行结果:
public class TransterValueMain {
public static void main(String[] args) {
TransterValueMain t = new TransterValueMain();
int inte = 0;
User u = new User("Python");
t.setUser(u);
String str = "str1";
t.setInt(inte);
t.setStr(str);
System.out.println("inte = "+ inte);
System.out.println("User = "+ u);
System.out.println("str = " + str);
}
public void setStr(String v) {
v = "setStr";
}
public void setInt(int v) {
v = 10;
}
public void setUser(User user) {
user = new User("C#");
}
public static class User{
private String name;
public User(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "User [name=" + name + "]";
}
}
}
运行结果如下:
inte = 0
User = User [name=Python]
str = str1
分析
首先,我们知道在Java中基本类型变量是在栈中运行的。所以在程序中setInt
方法执行时,是复制变量inte
的值,也就是0,在setInt
对复制的值进行操作,不会影响到main
方法值,所以inte
打印还是为0.
在[User]对象执行new
操作后,对象保存在堆内存中,而变量[u]对象引用,setUser
执行时,就是复制了一份User对象的地址,在setUser
中,又创建一个User对象,并将对象地址赋值给setUser
中变量,不会影响到main
的变量u,所以main
打印还是User = User [name=Python]
String str = "str1";
这段代码执行时,先去JVM常量池中查找是否有str1的字符串,如果有将引用赋值给变量str,如果没有创建一个str1字符串放到常量池,并将引用赋值给str1。setStr
和上面相同都是对引用地址操作。不会影响到原来变量。所以打印是str = str1
好学若饥,谦卑若愚