1. 程式人生 > >Think in Java——無意識的遞迴

Think in Java——無意識的遞迴

public class Main {
    public String toString() {
        return this + "\n";
    }

    public static void main(String[] args) {
        List<Main> v = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            v.add(new Main());
        }
        System.out.println(v);
    }
}

如果想像上面這樣通過改寫toString()來列印物件的記憶體地址,則會出現java.lang.StackOverflowError。這是因為System.out.println(v)呼叫了Main類重寫的toString()。編譯器看到this後跟著 “+” 後面又是String,於是編譯器試著把this轉成String,就呼叫了Main類重寫的toString(),無盡的迴圈就開始了。當棧深度超過虛擬機器分配給執行緒的棧大小時就會出現java.lang.StackOverflowError。

如果想實現通過改寫toString()來列印物件的記憶體地址的功能,則應該把this改成super.toString()

相關推薦

Think in Java——意識

public class Main { public String toString() { return this + "\n"; } public static void main(String[] args) {

Java 意識

之前在練習中碰到一個問題,程式中沒有使用遞迴卻出現了 Exception in thread “main” java.lang.StackOverflowError 異常,先把之前的程式碼貼上來: public class InfiniteRecursio

工廠模式(think in java中的設計模式)

org 我們 import lac otf 返回值 類型 int ava 工廠模式:工廠模式是利用工廠類的工廠方法創建對象的一種設計模式,目的是創建對象,但是很多時候創建對象我們會考慮很多其他因素~~~~比如限定輸入,限定返回值是否某個,比如在創建的過程中進行一些判斷,通過

叠代器模式(think in java中的設計模式)

一個 div 封裝 imp 叠代器 方法 println rri 數字 叠代器模式:用來叠代一個容器集合數組的一種模式。可能大家很多時候是用for循環進行叠代的,但是實際上for循環內部不能使用remove方法,但是叠代器可以,這是因為叠代器內部進行了該方法的邏輯處理。同樣

模板方法模式(think in java中的設計模式)

方法 bst pac code pri ack 單點 size clas 模板方法模式:模板方法模式顧名思義就是一種構造模塊化的設計模式。將一次行為分為多種行為,靈活的調用不同模塊進行工作。比如在飯店吃飯,分為:點菜,吃飯,買單等行為無論什麽飯店大致都是這三種行為。因此我們

【轉】我為什麽把think in java 讀了10遍

很好 這樣的 是的 就會 十分 基礎 網絡 的確 找工作 我在想寫這篇博文之前,就曾經對我媳婦(她是做web前端的)講,我把think in java看了幾次幾次,媳婦那時就用很羨慕和莫名的眼神看著我說,你真有毅力,我當時就蒙了,我以為她會說,你現在基礎一定很好,很強大之類

Think in java讀書筆記】序列化

轉換 window 讀書筆記 對象 序列 執行 輕量 body 調用 Java的對象序列化將那些實現了Serializable接口的對象轉換成一個字節序列,並能夠在以後將這個字節序列完全恢復成為原來的對象。 序列化機制能自動彌補不同操作系統之間的差異,也就是說在Window

Think In Java讀書筆記:內部類覆蓋及其初始化

圖片 10.10 clas 構造 col 向上轉型 pan center 類初始化   本文相關章節:第十章 內部類 10.10 內部類可以被覆蓋嗎   在讀至本節第二個範例代碼時(及下方的代碼),我對輸出結果中的第一個“Egg.Yolk()”很不理解,為什麽它會第一個地方

think in java 讀書筆記

imp 優先級 拼接 別名現象 乘除 方法 垃圾 原則 java 第三章 操作符 3.1 更簡單的打印語句 原:System.out.println("打印"); 簡單:print("我是更簡單的"); =======需要導包 :import static net.mi

Java中使用

遇到一個問題,給出一個數字,比如10,就算出10×9×8×7……×2×1的結果。 第一個想到的方法: public static int jisuan(int x) { int r = 1; for (int i = 0; i < x; i++) { r =

第一次讀Think In Java收穫

        新進公司的初級程式設計師,看了公司的專案,目前沒啥事做就在看Think In Java,然後想把自己的收穫記錄起來。這是本人第一次寫部落格。  2018年5月25日       &

java tree 結構查詢

create table TB_TREE ( CID NUMBER not null, CNAME VARCHAR2(50), PID NUMBER //父節點 ) insert into tb_tree (CID, CNAME, PID) values (1, '中國', 0);

think in java--7.10初始化及類載入的理解

1.在java中每個類都會編譯成一個獨立得檔案。該檔案只會在程式需要使用的時候才載入。可以說:類得程式碼在初次使用的時候才會載入。還有,當訪問static域或者方法時候,也會發生載入。初次使用之處也是static載入發生之處,所有的static物件和static方法都會在載入時按照程式順序載入,定義

Java:利用方法實現角谷定理

問題描述:        角谷定理。輸入一個自然數,若為偶數,則把它除以2,若為奇數,則把它乘以3加1。經過如此有限次運算後,總可以得到自然數值1。求經過多少次可得到自然數1。 如:輸入22, 輸出 22 11 34 17 52 26 1

Java:利用方法求鴨子數

問題描述:        一個人趕著鴨子去每個村莊賣,每經過一個村子賣去所趕鴨子的一半又一隻。這樣他經過了七個村子後還剩兩隻鴨子,問他出發時共趕多少隻鴨子?經過每個村子賣出多少隻鴨子? 題目分析:      設經過第n

Java:利用求解分桔子問題

問題描述:        日本著名數學遊戲專家中村義作教授提出這樣一個問題:父親將2520個桔子分給六個兒子。分完 後父親說:“老大將分給你的桔子的1/8給老二;老二拿到後連同原先的桔子分1/7給老三;老三拿到後連同原先的桔子分1/6給老四;老四拿到後連同

think in java-物件導論

一:每個物件都提供服務 1.高內聚使軟體設計的基本質量要求之一 2.將物件作為服務提供者看待是一件偉大的簡化工具 二:被隱藏的具體實現 1.訪問控制的第一個存在原因就是讓客戶端程式設計師無法觸及他們不應該觸及的部分 2.訪問控制存在的第二個原因就是允許庫設計者可以改變類內部的

java基礎篇———————— 控制及漢諾塔

一: 遞迴控制: 1:遞迴:就是程式一層一層呼叫自身,從而將問題規模層層減小,解除結果; (1)遞迴必須要滿足的兩個條件: .子問題須與原始問題為同樣的事,且更為簡單; .不能無限制地呼叫本身,須有個出口,化簡為非遞迴狀況處理。 ( 2 )遞迴的優缺點: 優點: 遞迴語句簡單。 缺點:遞迴是

java:File類練習(按層級列印)

從鍵盤接收一個資料夾路徑,把資料夾中的所有檔案以及資料夾的名字按層級列印, 例如:     aaa是資料夾,裡面有bbb.txt,ccc.txt,ddd.txt這些檔案,有eee這樣的資料夾,eee中有fff.txt和ggg.txt,打印出層級來  &nb

java:File類練習(拷貝)

從鍵盤接收兩個資料夾路徑,把其中一個資料夾中(包含內容)拷貝到另一個資料夾中  package com.heima.test; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; imp