【面试题】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字符串放到常量池,并将引用赋值给str1setStr和上面相同都是对引用地址操作。不会影响到原来变量。所以打印是str = str1

posted @ 2022-02-17 22:01  二月无雨  阅读(84)  评论(0编辑  收藏  举报