Java 将对象引用传递给方法

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

如果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);
    }
}

传递给方法
changedetails()
的参数是它自己的变量,不同于
main()
方法中的变量
emp
。他们都是指同一个eployee so。因此,如果您引用员工并更改其状态,则更改在两种方法中都可见,
changedetails()
main()
。但是,如果将
null
赋值给方法
changedetails()
的参数变量,则这是仅在该方法中可见的局部更改

旁注:更改方法参数的值被认为是不好的做法。离开方法
changedetails()
后,方法参数就消失了,因为它们位于堆栈上,而不是堆上

  • 在java中,对对象的引用是通过值传递的
  • 所以


    在这两种情况下,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)
          --------