本文记录一下自己对类之间相互引用的探索,如有错误,希望不吝赐教
问题一:类之间相互引用依赖会不会引用死循环
不会,例如: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方法,循环、递归调用了,最终导致栈异常。
















![CodeForces..一条绳上的蚂蚱.[简单].[ifelse]](https://img-blog.csdnimg.cn/1889f1fc1b8f4dab82f4b27d0f852b79.png)


