为什么此代码导致StackOverflow错误:

时间:2018-05-29 03:55:14

标签: java interface stack-overflow

C类实现了2个接口A和B.我只是想打印类值来验证多接口实现,而不是StackOverflow错误。

 interface A {
        void test();
    }

    interface B {
        void test();
    }


    class C implements A, B {
        A a = new C();
        B b = new C();

        @Override
        public void test() {
            System.out.println(a.getClass());
            System.out.println(b.getClass());
        }
    }


    public class MultiInherit{

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

4 个答案:

答案 0 :(得分:3)

正如其他人所提到的,它会进入一个递归循环。 添加图像以便更好地理解。

enter image description here

答案 1 :(得分:1)

从main

创建C的实例时
C c = new C();
  1. 它必须初始化类C的成员变量 - 这里它们是A aB b

  2. 要初始化它们,请创建C的实例。转到 1

答案 2 :(得分:1)

当你初始化C c = new C();时,它正在实例化它的实例变量并且你声明为

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

在这里你可以看到它将再次构建C并再次n再次找到ab并将实例化为C()。它会导致stackOverflow

答案 3 :(得分:0)

因为每当你创建一个'C'时,你最终会创建两个C,然后创建四个C,依此类推。

你可以这样做,

interface A {
              void test();
        }

        interface B {
              void test();
        }


        class C implements A, B {
              A a ;
              B b ;

              @Override
              public void test() {
                    System.out.println(a.getClass());
                    System.out.println(b.getClass());
              }

              public void createObjects(){
                    a = new C();
                    b = new C();
              }


        }

然后调用测试方法,

public class MultiInherit{

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