为何这段实现多接口的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
相关产品推荐
相关产品推荐

