将对象引用传递给方法

时间:2014-03-24 09:45:09

标签: 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 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);
    }
}

4 个答案:

答案 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)

  1. 在java中,对象的引用按值传递。
  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。所有你感到困惑的是对象的引用和内存中的对象

在您的情况下,AempBe

You can find some good explanation in this question.