Java 将对象引用传递给方法
如果changedetails()中的Employee引用为null,则会保留变量id值,并且不会引发NullPointerException(代码1),这可能是因为我们只传递了对象引用的副本,但在代码2中,变量值为什么会更改 代码1:Java 将对象引用传递给方法,java,pass-by-reference,pass-by-value,Java,Pass By Reference,Pass By Value,如果changedetails()中的Employee引用为null,则会保留变量id值,并且不会引发NullPointerException(代码1),这可能是因为我们只传递了对象引用的副本,但在代码2中,变量值为什么会更改 代码1: public class JavaPassing { public static void changedetails(Employee e) { e=null; } public static void mai
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);
}
}
传递给方法
changedetails()
的参数是它自己的变量,不同于main()
方法中的变量emp
。他们都是指同一个eployee so。因此,如果您引用员工并更改其状态,则更改在两种方法中都可见,changedetails()
和main()
。但是,如果将null
赋值给方法changedetails()
的参数变量,则这是仅在该方法中可见的局部更改
旁注:更改方法参数的值被认为是不好的做法。离开方法changedetails()
后,方法参数就消失了,因为它们位于堆栈上,而不是堆上
在这两种情况下,changedetails()中的“e”和main()中的“emp”都指向同一个对象。
代码(1)
在changedetails()中,当您使e=null时;只有e停止指向对象。但emp继续指向目标。所以在main()中,当您执行emp.id值打印时,不会出现NullPointerException
代码(2)
在changedetails()中,当您使e.id=9时,请记住两个引用都指向同一个对象,即changedetails()中的“e”和main()中的“emp”指向同一个对象。。。。 所以e.id=9意味着对同一对象所做的更改,因此当您在main()中执行emp.id时,值为9
--------
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)
--------
A-->Object | | Object | B(引用为空)
--------
在这里,当您将B
设置为null
时,A
不会被修改,它将继续指向堆中的对象
这就是为什么如果您从参考A
访问id
,它不会抛出NullPointerException
。你们所困惑的只是对象的引用和内存中的对象
在您的情况下,A
是emp
,B
是e
这是一个事实,问题在哪里?根据SCJP的书“在方法内部对对象所做的任何更改都会对传递引用的对象进行”。因此,如果我们在方法中使Employee对象引用为null,那么实际的对象引用也应该为null。我错过了什么?
--------
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)
--------