工做三年多了,作過很多的項目,越到最近越深深地感受到本身的基礎薄弱,因此最近買了《java編程思想》。但願經過此次的學習可以使本身有所收穫。java
這也是我第一篇博客,以往只是看而沒有本身寫過,此次着重記錄書本上習題的解答。編程
練習1:建立一個類,它包含一個未初始化的String引用。驗證該引用被java初始化成了null。數組
package chapter5; public class Session1 { /** * 未初始化的變量會自動初始化爲null */ String a; public static void main(String[] args) { Session1 session1 = new Session1(); System.out.println(session1.a); //「null」 } }
練習2:建立一個類,它包含一個在定義是就被初始化了的String域,以及另外一個經過構造器初始化的String域。這兩種方式有何差別?session
package chapter5; public class Session1 { /** * 會先初始化類中的變量 */ String b = "hello"; String c; public Session1() { System.out.println(b); /** * 後進行c的初始化 */ c = "world"; } public static void main(String[] args) { Session1 session1 = new Session1(); //在類初始化前會先初始化類中的變量 //「hello」 } }
練習3:建立一個帶默認構造器(即無參構造器)的類,在構造器中打印一條消息。爲這個類建立一個對象。ide
package chapter5; public class Session2 { public Session2() { System.out.println("我是默認構造器"); } public static void main(String[] args) { Session2 session2 = new Session2(); //「我是默認構造器」 } }
練習4:爲前一個聯繫中的類添加一個重載構造器,令其接受一個字符串參數,並在構造器中把你本身的消息和接收參的參數一塊兒打印出來。學習
package chapter5; public class Session2 { public Session2() { System.out.println("我是默認構造器"); } public Session2(String arg) { this(); System.out.println("我是重載有參構造器,我接收的參數爲:"+arg); } public static void main(String[] args) { Session2 session2 = new Session2("hello world"); //「我是默認構造器」 //「我是重載有參構造器,我接收的參數爲:hello world」 } }
練習5:建立一個名爲Dog的類,它具備重載的bark()方法。此方法應根據不一樣的基本數據類型進行重載,並根據被調用的版本,打印出不一樣類型的狗吠(barking)、咆哮(howling)等信息。編寫main()來調用全部不一樣版本的方法。測試
package chapter5; public class Dog { void bark(String a){ System.out.println("barking:狗吠"); } void bark(Integer i){ System.out.println("howling:咆哮"); } public static void main(String[] args) { Dog dog = new Dog(); dog.bark("barking"); dog.bark(1); //barking:狗吠 //howling:咆哮 } }
練習6:修改前一個練習的程序,讓兩個重載方法各自接受兩個類型不一樣的參數,但兩者順序相反。驗證其是否工做。this
package chapter5; public class Dog { /** * 參數順序不一樣也能夠重載 * @param i * @param a */ void bark(Integer i,String a){ System.out.println("barking:狗吠"); } void bark(String a,Integer i){ System.out.println("howling:咆哮"); } public static void main(String[] args) { Dog dog = new Dog(); dog.bark(1,"barking"); dog.bark("barking",1); //barking:狗吠 //howling:咆哮 } }
練習7:建立一個沒有構造器的類,並在main()中建立其對象,用以驗證編譯器是否真的自動加入了默認構造器。spa
package chapter5; public class Session7 { public static void main(String[] args) { Session7 session7 = new Session7(); } }
練習8:編寫具備兩個方法的類,在第一個方法內調用第二個方法兩次:第一次調用時不使用this關鍵字,第二次調用時使用this關鍵字——這裏只是爲了驗證它是起做用的,你不該該在實踐中使用這種方式。命令行
package chapter5; public class TestThis { private void method1(){ method2(); /** * this指當前對象的引用 */ this.method2(); } private void method2(){ System.out.println("方法二"); } public static void main(String[] args) { TestThis testThis = new TestThis(); testThis.method1(); //方法二 //方法二 } }
練習9:編寫具備兩個(重載)構造器的類,並在第一個構造器中經過this調用第二個構造器。
package chapter5; public class Session4 { public Session4() { this("經過this調用有參構造器"); System.out.println("無參構造器"); } public Session4(String arg) { System.out.println(arg); } public static void main(String[] args) { Session4 session4 = new Session4(); //經過this調用有參構造器 //無參構造器 } }
5.5 清理:終結處理和垃圾回收
練習10:編寫具備finalize()方法的類,並在方法中打印消息。在main()中爲該類建立一個對象。試解釋這個程序的行爲。
package chapter5; public class TestFinalize { @Override protected void finalize() throws Throwable { System.out.println("回收前執行的方法"); } public static void main(String[] args) { TestFinalize finalize = new TestFinalize(); } }
finalize()方法不必定會執行。
練習11:修改前一個程序,讓你的finalize()總會被調用。
package chapter5; public class TestFinalize { @Override protected void finalize() throws Throwable { System.out.println("回收前執行的方法"); } public static void main(String[] args) { TestFinalize finalize = new TestFinalize(); finalize = null; System.gc(); //回收前執行的方法 } }
練習12:編寫名爲Tank的類,此類的狀態可使「滿的」或「空的」。其終結條件是:對象被清理時必須處於空狀態。編寫finalize()以檢驗終結條件是否成立。在main()中測試Tank可能發生的幾種使用方式。
package chapter5; public class Tank { private boolean full = true; @Override protected void finalize() throws Throwable { if(!full){ System.out.println("空了,不要了"); } } public static void main(String[] args) { Tank t = new Tank(); t = null; System.gc(); //此時狀態是「滿的」因此回收時不會執行輸出 } }
package chapter5; public class Tank { private boolean full = true; @Override protected void finalize() throws Throwable { if(!full){ System.out.println("空了,不要了"); } } public static void main(String[] args) { Tank t = new Tank(); t.full = false; t = null; System.gc(); //狀態是「空的」 //回收時會輸出 //空了,不要了 } }
練習14:編寫一個類,擁有兩個靜態字符串域,其中一個在定義處初始化,另外一個在靜態塊中初始化。如今加入一個靜態方法用以打印出兩個字段值。請證實他們都會在被使用以前完成初始化動做。
package chapter5; public class Session7 { static String a = "hello world"; static String b; static { b = "hello world 2"; } public static void main(String[] args) { System.out.println(Session7.a); System.out.println(Session7.b); //hello world //hello world 2 } }
練習15:編寫一個含有字符串域的類,並採用實例初始化方式進行初始化。
package chapter5; public class Session71 { String a; { a = "hello world"; } public static void main(String[] args) { Session71 session71 = new Session71(); System.out.println(session71.a); //hello world } }
練習16:建立一個String對象數組,併爲每個元素都賦值一個String。用for循環來打印該數組。
package chapter5; public class Session8 { String[] strs = {"h","e","l","l","o"}; public static void main(String[] args) { Session8 session8 = new Session8(); for (String string : session8.strs) { System.out.print(string); } //hello } }
練習17:建立一個類,他有一個接受一個String參數的構造器。在構造階段,打印該參數。建立一個該類的對象引用數組,可是不實際去建立對象賦值給該數組。當運行程序時,請注意來自對該構造器的調用中的初始化消息是否打印了出來。
package chapter5; public class Session81 { public Session81(String a) { System.out.println(a); } public static void main(String[] args) { Session81[] sss = new Session81[]{}; //不會進行打印輸出 } }
練習18:經過建立對象賦值給引用數組,從而完成前一個練習。
package chapter5; public class Session81 { public Session81(String a) { System.out.println(a); } public static void main(String[] args) { Session81[] sss = new Session81[]{new Session81("1"),new Session81("2")}; //1 //2 } }
練習19:寫一個類,他接受一個可變參數的String數組。驗證你能夠向該方法傳遞一個用逗號分隔的String列表,或是一個String[]。
package chapter5; public class Session82 { public Session82(String ...a) { for (String string : a) { System.out.println(string); } } public static void main(String[] args) { Session82 session82 = new Session82("a","b"); Session82 session821 = new Session82(new String[]{"a","b"}); } }
練習20:建立一個使用可變參數列表而不是普通的main()語法的main()。打印所產生的args數組的全部元素,並用各類不一樣數量的命令行參數來測試它。
package chapter5; public class Session82 { public Session82(String ...a) { for (String string : a) { System.out.println(string); } } public static void main1(String...args) { Session82 session82 = new Session82("a","b"); Session82 session821 = new Session82(new String[]{"a","b"}); } }
練習21:建立一個enum,它包含紙幣中最小面值的6種類型。經過values()循環並打印每個值及其ordinal();
package chapter5; public enum Session9 { YIMAO,YIKUAI,SHIKUAI,YIBAIKUAI //一毛,一塊,十塊,一百塊 }
package chapter5; public class TestSession9 { public static void main(String[] args) { for (Session9 string : Session9.values()) { System.out.println(string); System.out.println(string.ordinal()); } //YIMAO //0 //YIKUAI //1 //SHIKUAI //2 //YIBAIKUAI //3 } }
練習22:在前面的例子中,爲enum寫一個switch語句,對於每個case,輸出該特訂貨幣的描述
package chapter5; public class TestSession9 { public static void main(String[] args) { TestSession9 session9 = new TestSession9(Session9.SHIKUAI); session9.descript(); } public TestSession9(Session9 session9) { this.session9 = session9; } private Session9 session9; void descript() { switch (session9) { case YIMAO: System.out.println("一毛"); break; case YIKUAI: System.out.println("一塊"); break; case SHIKUAI: System.out.println("十塊"); break; case YIBAIKUAI: System.out.println("一百塊"); break; default: break; } } }