Почему этот код приводит к ошибке StackOverflow: - PullRequest
0 голосов
/ 29 мая 2018

Класс C реализует 2 интерфейса A и B. Я просто хотел напечатать значения класса для проверки реализации Multiple Interface, вместо этого я получил ошибку 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 голосов
/ 29 мая 2018

Как уже упоминалось, оно входит в рекурсивный цикл.Добавление изображения для лучшего понимания.

enter image description here

0 голосов
/ 29 мая 2018

когда вы инициализируете C c = new C();, он создает экземпляры своих переменных экземпляра и которые вы объявили как

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

здесь вы можете видеть, что он снова перейдет к построению C и снова n найдет a и b и будет создан как C().Это вызовет в stackOverflow

0 голосов
/ 29 мая 2018

Это потому, что каждый раз, когда вы создаете 'C', вы в конечном итоге создаете два C s, которые затем создают четыре C s и т. Д.

Вы можете сделать это вместо этого,

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();
    }
}
0 голосов
/ 29 мая 2018

Когда вы создаете экземпляр C из основного

C c = new C();
  1. , он должен инициализировать переменные-члены класса C - здесь они A a иB b.

  2. Чтобы инициализировать их, вы создаете экземпляр C.Перейти к 1 .

...