如果在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);
}
}
答案 0 :(得分:5)
<强> In both cases Reference 'e' in changedetails() and 'emp' in main() both point to same object.
强>
代码(1)
当你使e = null时,在changedetails()中;只有指向对象的STOPS。但是继续指向对象。所以在main()中你做emp.id值打印而没有NullPointerException
代码(2)
在更改详细信息()中,当您使e.id = 9时,请记住两个引用都指向同一个对象,即
changedetails()中的'e'和main()中的'emp'指向同一个对象....
所以e.id = 9意味着对同一个对象进行了更改,因此当你在main()值中执行emp.id时为9
答案 1 :(得分:2)
所以,
public static void main(String args[])
{
Employee emp = new Employee("Vishal",7);
changedetails(emp); / /object Employee ahs only one reference - "emp"
System.out.println(emp.id);
}
public void changedetails(Employee emp1){ // here both emp1 and emp of main() point to the same Employee object.
emp1.setId(100); // now since emp1 also points to same Employee object, the data will be changed.
emp1 = null;// now emp1 points to null. So, only emp is pointing to E,ployee
}
答案 2 :(得分:1)
您传递给方法changedetails()
的参数是它自己的变量,与emp
方法中的变量main()
不同。他们都指的是同一个eployee。因此,如果您引用员工并更改其状态,则可以在changedetails()
和main()
两种方法中看到更改。但是,如果将null
分配给方法changedetails()
的参数变量,则这是仅在该方法中可见的局部变化。
旁注:更改方法参数的值被认为是不好的做法。在离开方法changedetails()
之后,方法参数消失了,因为它们存在于堆栈而不是堆上。
答案 3 :(得分:1)
--------
A -->| Object |<-- B
--------
A.id = 10; // Property of object modified
B.id = 10; // Property of object modified here also
B = null ; // B is set to null
--------
A -->| Object | B (reference is null)
--------
当您将B
设置为null
时,A
未被修改,它将继续将Object
指向堆中。
这就是为什么如果您从参考NullPointerException
访问id
,它就不会抛出A
。所有你感到困惑的是对象的引用和内存中的对象。
在您的情况下,A
为emp
而B
为e
。