You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何这段实现多接口的Java代码会触发StackOverflowError?

问题分析与解决

嘿,我一眼就瞅出你遇到的StackOverflowError问题出在哪啦!

错误根源

你在C类里定义的这两行代码是罪魁祸首:

A a = new C();
B b = new C();

当你在main方法里创建第一个C实例时,JVM会初始化这个实例的成员变量,也就是要分别新建一个C对象赋值给a和b。但每个新创建的C对象又会再次初始化自己的a和b,也就是再新建两个C对象——这个过程会无限递归下去,直到调用栈被彻底填满,最终抛出StackOverflowError。

修正方案

其实你只是想验证多接口实现并打印类信息,完全不需要创建额外的C实例。直接用当前对象的this.getClass()就能拿到类信息,或者直接用C.class也可以。修正后的代码如下:

interface A { void test(); }
interface B { void test(); }

class C implements A, B {
    @Override
    public void test() {
        // 直接打印当前实例的类信息
        System.out.println(this.getClass());
        // 或者直接用类名.class,效果一样
        // System.out.println(C.class);
    }
}

public class MultiInherit{
    public static void main(String args[]){
        C c = new C();
        c.test();
    }
}

额外说明

其实多接口实现的验证很简单,只要你的C类同时实现了A和B的test方法(这里因为两个接口的test方法签名完全一致,所以只需要重写一次就满足两个接口的要求),就已经完成了多接口实现的验证。打印类信息只是辅助确认,没必要搞这么复杂的成员变量~

内容的提问来源于stack exchange,提问作者Ajinkya Chavan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:43:23