本文记录一下自己对类之间相互引用的探索,如有错误,希望不吝赐教
问题一:类之间相互引用依赖会不会引用死循环
不会,例如:A类中声明一个B类的引用,B类中也声明一个A类的引用,因为类之间的引用相当于指针,声明的时候不会分配对象。即使你在A构造方法中new 一个B类对象,这个B类对象也只是一个新的,与其他的B类对象无关,只是在堆上为这个对象分配了内存。
代码实例如下:
定义了一个Student类、一个Teacher类,他们相互引用,另外在定义一个TestReference测试类
package com.zjh.reference; public class Student { private String name; private int age; private Teacher teacher; public Student(){ } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public Teacher getTeacher() { return teacher; } public void setTeacher(Teacher teacher) { this.teacher = teacher; } public void showTeacherInfo(){ if (teacher!=null){ System.out.println(teacher.toString()); } } // @Override // public String toString() { // return "Student{" + // "name='" + name + '\'' + // ", age=" + age + // ", teacher=" + teacher + // '}'; // } }
package com.zjh.reference; public class Teacher { private String name; private int age; private Student student; public Teacher() { } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public Student getStudent() { return student; } public void setStudent(Student student) { this.student = student; } public void showStudentInfo(){ if (student!=null){ System.out.println(student.toString()); } } // @Override // public String toString() { // return "Teacher{" + // "name='" + name + '\'' + // ", age=" + age + // ", student=" + student + // '}'; // } }
package com.zjh.reference; public class TestReference { public static void main(String[] args) { showInfo(); } private static void showInfo() { Teacher teacher = new Teacher(); teacher.setName("android 讲师"); teacher.setAge(35); Student student = new Student(); student.setName("android 学生"); student.setAge(30); teacher.setStudent(student); student.setTeacher(teacher); System.out.println("teacher 获取学生信息"); teacher.showStudentInfo(); System.out.println("student 获取教师信息"); student.showTeacherInfo(); } } 执行结果 : > Task :TestReference.main() teacher 获取学生信息 com.zjh.reference.Student@15db9742 student 获取教师信息 com.zjh.reference.Teacher@6d06d69c 可以看到没有发生死循环的报错 问题二、为什么担心循环依赖引起死循环呢,因为你写的方法真的可能一不小心就中招了 调用死循环出现在函数的相互调用、递归、最终导致栈溢出而报错
还是上面的代码,我将toString方法注释给放开,就报错了
这是因为重写的toString方法,循环、递归调用了,最终导致栈异常。