父類中聲明子類對象變量,導致棧溢出

    今天,我學習Java的時候,做了一個撲克牌小遊戲,主要的功能就是計算機和玩家出牌比大小。

    但是,在創建一個撲克牌Poker類的時候,我遇到了一個問題,我創建了兩個Poker的子類,分別是用來存放玩家撲克牌的PlayPoker類,和用來存放電腦撲克牌的ComputerPoker,當我在Poker類裏面聲明瞭兩個對象,分別是:

        ComputerPoker cPoker = new ComputerPoker();
        PlayerPoker pPoker = new PlayerPoker();

    然後我在mian函數,生成一個Poker類的對象,並且執行的時候:

        Poker poker = new Poker();

    控制檯Console顯示出現錯誤,我一看,嚇我一跳,出現了一堆錯誤:

 Exception in thread "main" java.lang.StackOverflowError
 at sun.misc.Unsafe.compareAndSwapLong(Native Method)
 at java.util.concurrent.atomic.AtomicLong.compareAndSet(Unknown Source)
 at java.util.Random.seedUniquifier(Unknown Source)
 at java.util.Random.<init>(Unknown Source)
 at pack8_撲克牌.ComputerPoker.<init>(ComputerPoker.java:8)
 at pack8_撲克牌.Poker.<init>(Poker.java:22)
 at pack8_撲克牌.PlayerPoker.<init>(PlayerPoker.java:6)
 at pack8_撲克牌.Poker.<init>(Poker.java:23)
 at pack8_撲克牌.PlayerPoker.<init>(PlayerPoker.java:6)
 at pack8_撲克牌.Poker.<init>(Poker.java:23)
 at pack8_撲克牌.PlayerPoker.<init>(PlayerPoker.java:6)
 at pack8_撲克牌.Poker.<init>(Poker.java:23)
 at pack8_撲克牌.PlayerPoker.<init>(PlayerPoker.java:6)
 at pack8_撲克牌.Poker.<init>(Poker.java:23)
 at pack8_撲克牌.PlayerPoker.<init>(PlayerPoker.java:6)
 at pack8_撲克牌.Poker.<init>(Poker.java:23)

......

發現是StackOverflowError錯誤,也就是常說的棧溢出,我就納悶了,怎麼會棧溢出,我就上網百度了一下,發現說是因爲內存不夠,可以通過在Eclipse中JDK的配置中加上 -XX:MaxDirectMemorySize=128,因爲默認的jvm內存是64,我們可以改成128或者256,然後我就去找jdk,但是我突然又想想,我就做了個完全只有幾個類的小遊戲,怎麼會內存不夠,那我以後做大一些的遊戲,那還了得。


    於是,我又認真地看了顯示的錯誤信息,我發現這兩處錯誤 

    at pack8_撲克牌.PlayerPoker.<init>(PlayerPoker.java:6)
    at pack8_撲克牌.Poker.<init>(Poker.java:23)

    總是在不斷的出現,一直循環到錯誤結束,這是隻有無限遞歸的時候纔會出現的問題,然後我在查看PlayPoker這個類的時候,發現了問題,PlayPoker這個類繼承了Poker類,但是我在Poker類裏面聲明並創建了PlayPoker對象,我想起了我們林老師曾經說的,new子類出來的對象,裏面其實包含了父類的所有非私有成員變量及方法,但是這個Poker父類裏面卻又有一個子類PlayPoker對象,而這PlayPoker

對象又包含了其Poker父類的所有非私有成員變量及方法。。。,這是不是看起來像是遞歸,所以就造成死循環,這是我學習Java其中這發現的一個不經意間的問題,希望能給Java初學者一些幫助。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章