以一个问题开始:如果在函数的入参中传递一个对象,然后在函数内部将这个对象置空,请问原始的对象是否为空?下面我们来验证这个问题:
public static void main(String[] args) {
Entry entry = new Entry("name");
updateEntry(entry);
System.out.println("updateEntry " + entry.getName());
Entry entry2 = new Entry("name");
repalceEntry(entry2);
System.out.println("repalceEntry " + entry2.getName());
Entry entry3 = new Entry("name");
emptyEntry(entry3);
if (entry3 != null) {
System.out.println("emptyEntry " + entry3.getName());
}
else {
System.out.println("emptyEntry");
}
}
private static void updateEntry(Entry entry)
{
entry.setName("aaa");
System.out.println(entry.getName());
}
private static void repalceEntry(Entry entry)
{
entry = new Entry("aaa");
System.out.println(entry.getName());
}
private static void emptyEntry(Entry entry)
{
entry = null;
}
运行结果如下:
aaa
updateEntry aaa
aaa
repalceEntry name
emptyEntry name
结果表明:
引用传递可以修改参数对象的内部状态,但是对参数对象重新赋值是没有意义的;
Java入参,对象传递的是引用的副本,副本的概念其实就是按值传递,所以对象的属性值可以改变,但是引用无法改变,注意与C++区别;
答案:原始对象不为空;
网上有两种争论,入参对象按引用传递,那么是指传递对象的引用;入参对象按值传递,则指传递引用的值,不是对象的值;从上面的例子中,观察其在不同场景下的输出,理解其实质,知道啥时变,啥时不变。
网友评论