java 类之间相互引用实例探索

本文探讨了Java中类之间相互引用的情况,指出这种引用并不会导致死循环,因为每个对象实例是独立的。然而,当在如toString()方法中不慎造成循环调用时,可能会导致栈溢出错误。示例代码展示了Student和Teacher类的相互引用,并通过注释解除循环调用来防止错误的发生。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文记录一下自己对类之间相互引用的探索,如有错误,希望不吝赐教


问题一:类之间相互引用依赖会不会引用死循环
不会,例如: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方法,循环、递归调用了,最终导致栈异常。
 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值