java将对象引用传递给方法
如果changedetails()中的Employee引用为null,则会保留变量id值,并且不会引发NullPointerException(代码1),这可能是因为我们只传递了对象引用的副本,但在代码2中,变量值为什么会更改
代码1:
public class JavaPassing {
public static void changedetails(Employee e)
{
e=null;
}
public static void main(String args[])
{
Employee emp = new Employee("Vishal",7);
changedetails(emp);
System.out.println(emp.id);
}
}
代码2:
public class JavaPassing {
public static void changedetails(Employee e)
{
e.id=9;
}
public static void main(String args[])
{
Employee emp = new Employee("Vishal",7);
changedetails(emp);
System.out.println(emp.id);
}
}
# 1 楼答案
所以
# 2 楼答案
In both cases Reference 'e' in changedetails() and 'emp' in main() both point to same object.
代码(1)
在changedetails()中,当您使e=null时;只有e停止指向对象。但emp继续指向目标。所以在main()中,当你做emp时。id值打印,无NullPointerException
代码(2) 在changedetails()中,当您将e.id=9时,请记住两个引用都指向同一个对象,即
changedetails()中的“e”和main()中的“emp”指向同一个对象。。。。 因此,e.id=9意味着在执行emp时对同一对象进行的更改。main()中的id值为9
# 3 楼答案
这里,当您将
B
设置为null
时,A
未被修改,它将继续指向堆中的Object
这就是为什么如果您从引用
A
访问id
,它不会抛出NullPointerException
。你所困惑的只是对象的引用和内存中对象的引用在你的例子中,
A
是emp
,B
是e
You can find some good explanation in this question.
# 4 楼答案
传递给方法
changedetails()
的参数是它自己的变量,与main()
方法中的变量emp
不同。他们都指的是同一个eployee。因此,如果您引用员工并更改其状态,那么更改在changedetails()
和main()
两种方法中都可见。但是,如果将null
赋值给方法changedetails()
的参数变量,这是一个仅在该方法中可见的局部更改旁注:更改方法参数的值被认为是不好的做法。离开方法
changedetails()
后,方法参数就消失了,因为它们位于堆栈上,而不是堆上