page contents

初始化对象放在私有方法中操作,却对原对象未初始化,为什么?

Pack 发布于 2020-03-17 11:15
阅读 2113
收藏 0
分类:Java开发

attachments-2020-03-oM0AWeVg5e7040a3c75e5.png

我在打印student上一步,初始化student的私有方法中对student进行了赋值,可上面主方法执行打印后student对象还是null,大佬们可知道为什么吗,感激不尽

以下为测试代码

attachments-2020-03-Qa9MEcYP5e70408a2dbf9.png

最佳答案 2020-03-24 17:09

546
Pack
Pack

就楼主所示的案例而言,

  1. 在定义 test022() 的代码中,可以去掉 throws Exception, 因为执行有关的代码行 initStudent(student),student 不会是 null, 不会有异常抛出。
  2. 这里,(公有方法) public void test022() 调用 (私有方法) initStudent(Student student),传递的参数是 Student 对象的引用 student。
  3. 调用 (这个私有方法) 时,首先复制现有的 Student 对象的引用(null)作为传递参数的值。然后,执行第一行代码 student = new Student()。导致:将原先复制来的 Student 对象的引用 (null) 换成另一个新的 Student 对象的引用,再将 这个新对象的属性 name (值) 设成 "阿波吃的"。场景如下:
  4.  private void initStudent(Student student) {
            student = new Student(); //改变原先复制的Student对象的引用
            student.setStudentName("阿波吃的");//给新对象student的属性 name重新赋值。
    //但是,这个新对象的引用,没能传递出去,即,在调用完毕之后,无法输出name的新数值。。
        }
  5. 此方法调用完毕后,System.out.println(student) 输出的是 以前调用  (私有方法) initStudent(Student student) 时所使用的 Student 对象的引用值(null),所以输出 null。
  6. 其实,不管是调用私有的还是公有的方法,只要是 操作改变了引用的指向,且改变了的引用值(指向)没有传递出去( 或为以后保留),那么完成这个方法的调用之后,未保留的引用所携带的所有信息,比如,name 的值 “阿波吃的”,将无法再获得。

修改代码, 以求 保留或传递出 修改了的对象的引用,方案有二:

1. 如果在调用 (私有方法) initStudent()的操作里,保持输入参数的引用不变,只是重新设置其属性 name 的值, 则调用完毕后执行 System.out.println(student) 就会输出为 name 新设置的值。即,执行如下修改的代码, 就会输出从新设置其属性 name 的值。

    public void test022(){
        Student student = new Student();
        initStudent(student);
        System.out.println(student);
    }

    private void initStudent(Student student) {
      //  student = new Student();
        student.setStudentName("阿波吃的");
    }

2. 将 具有新属性值的对象的引用传递出去。

   public void test022(){
        Student student = new Student();
        student = initStudent(student);
        System.out.println(student);
    }

    private Student initStudent(Student student) {
    	student = new Student();
        student.setStudentName("阿波吃的");
        return student;
    }
请先 登录 后评论