簡體   English   中英

為什么此代碼導致StackOverflow錯誤:

[英]Why is this code resulting in StackOverflow error:

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();
        }
    }

正如其他人所述,它進入了遞歸循環。 添加圖像以便更好地理解。

在此處輸入圖片說明

當您從main創建C的實例時

C c = new C();
  1. 它必須初始化類C的成員變量-在這里它們是A aB b

  2. 要初始化它們,請創建C的實例。 轉到1

當您初始化C c = new C(); 它實例化了它的實例變量,並且您已經聲明為

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

在這里,您可以看到它將再次構造C,並且n將再次找到ab並將實例化為C() 它將導致stackOverflow

這是因為每次創建“ 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();
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM