【面试题】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
好学若饥,谦卑若愚
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理