package net.mindview.initialization; public class Test1 { public String str; public static void main(String[] args) { Test1 t = new Test1(); System.out.println(t.str); } }
返回結果java
null
package net.mindview.initialization; public class Test2 { public String str1 = "abc"; public String str2; public Test2(){ System.out.println(str1); System.out.println(str2); this.str2 = "def"; System.out.println(str1); System.out.println(str2); } public static void main(String[] args) { Test2 t = new Test2(); } }
運行結果:數組
abc null abc def
結論: 定義是就被初始化的str1只被賦值一次, 而定義時未被初始化str2被賦值了兩次, 第一次是null,第二次是構造器賦值.dom
package net.mindview.initialization; public class Test3 { public Test3(){ System.out.println("默認構造器"); } public static void main(String[] args) { Test3 t = new Test3(); } }
package net.mindview.initialization; public class Test3 { public Test3(){ System.out.println("默認構造器"); } public Test3(String str){ System.out.println("有一個參數的構造器"); System.out.println(str); } public static void main(String[] args) { Test3 t = new Test3(); Test3 t2 = new Test3("hello"); } }
package net.mindview.initialization; public class Dog { public void bark(){ System.out.println("barking"); } public void bark(String paoxiao){ System.out.println("howling"); } public static void main(String[] args) { Dog dog1 = new Dog(); dog1.bark(); dog1.bark("paoxiao"); } }
編寫具備兩個方法的類,在第一個方法內調用第二個方法兩次:第一次調用時不使用this關鍵字,第二次調用時使用this關鍵字-- * 這裏只是爲了驗證它是起做用的,你不該該在實踐中使用這種方法。ide
package net.mindview.initialization; public class Test8 { public void method1(){ System.out.println("1"); method2().method2(); } public Test8 method2(){ System.out.println("2"); return this; } public static void main(String[] args) { Test8 t = new Test8(); t.method1(); } }
編寫具備finalize()方法的類,並在方法中打印消息,在main()中爲該類建立一個對象,試解釋這個程序的行爲。測試
package net.mindview.initialization; public class Test10 { @Override protected void finalize() throws Throwable { System.out.println("調用了finalize方法"); super.finalize(); } public static void main(String[] args) { Test10 t = new Test10(); t = null; System.gc(); Test10 t1 = new Test10(); t1 = null; System.gc(); } }
即使我手動調用垃圾回收處理了, 但finalize方法也不是每次都會被調用. 也就是說雖然我手動觸發垃圾回收, 但實際上, 並無真的觸發垃圾回收. 下面這篇文章就解釋緣由:http://blog.csdn.net/yewei02538/article/details/52386642this
修改前一個練習的程序,讓你的finalize()總會被調用。spa
package net.mindview.initialization; public class Test10 { @Override protected void finalize() throws Throwable { System.out.println("調用了finalize方法"); super.finalize(); } public static void main(String[] args) { Test10 t = new Test10(); t = null; System.gc(); Test10 t1 = new Test10(); t1 = null; System.gc(); System.runFinalization(); } }
(4)編寫名爲Tank的類,此類的狀態能夠是「滿的」或「空的」。其終結條件是:對象被清理時必須處於空狀態。 * 請編寫finalize()以檢驗終結條件是否成立,在main()中測試Tank可能發生的幾種使用方式.net
package net.mindview.initialization; public class Tank { public String state = "empty"; public Tank(String state){ this.state = state; } void clear(){ this.state = "empty"; } @Override protected void finalize() throws Throwable { System.out.println("------finalize---------"); if(!state.equals("empty")){ System.out.println("Error!!Tank未被清空"); } super.finalize(); } public static void main(String[] args) { Tank tank1 = new Tank("full"); tank1.clear(); System.gc(); System.runFinalization(); Tank tank2 = new Tank("full"); tank1 = null; tank2 = null; System.gc(); System.runFinalization(); } }
這裏須要將tank1和tank2手動置爲空. 不然垃圾回收機制會將其標記, 而後再下一個週期清除.命令行
編寫一個類,擁有兩個靜態字符串域,其中一個在定義處初始化,另外一個在靜態塊中初始化。如今,加入一個靜態方法用以打印出兩個字段值。請證實它們都會在被使用以前完成初始化動做。code
package net.mindview.initialization; public class Test14 { public static String str1 = "abc"; public static String str2; static { str2 = "def"; } public static void print(){ System.out.println("str1 :"+ str1); System.out.println("str2 :"+ str2); } public static void main(String[] args) { print(); } }
編寫一個含有字符串域的類,並採用實例初始化方式進行初始化。
package net.mindview.initialization; public class Test14 { public static String str1 = "abc"; public static String str2; public String str3; //靜態成員初始化 static { str2 = "def"; //str3 = "aaa"; //報錯 } //非靜態成員初始化 { str3 = "aaa"; str2 = "mmm";//也能夠給靜態成員初始化 } public static void print(){ System.out.println("str1 :"+ str1); System.out.println("str2 :"+ str2); } public static void main(String[] args) { Test14 t = new Test14(); print(); System.out.println("str3 :"+ t.str3); } }
建立一個類,他有一個接受一個String參數的構造器。在構造階段,打印該參數。建立一個該類的對象引用數組,可是不實際去建立對象賦值給該數組。當運行程序時,請注意來自對該構造器的調用中的初始化消息是否打印了出來
package net.mindview.initialization; public class Test17 { public Test17(String str){ System.out.println(str); } public static void main(String[] args) { Test17[] tt = null; } }
只有實例化的時候纔會調用構造方法
經過建立對象賦值給引用數組,從而完成前一個練習。
package net.mindview.initialization; import java.util.Random; public class Test17 { public Test17(String str){ System.out.println(str); } public static void main(String[] args) { Random rand = new Random(); Test17[] tt = new Test17[rand.nextInt(100)]; for(int i=0;i<tt.length; i++){ tt[i] = new Test17(""+i); } } }
寫一個類,他接受一個可變參數的String數組,驗證你能夠向該方法傳遞一個用逗號分隔的String列表,或是一個String[]。
package net.mindview.initialization; public class Test19 { public void print(String ...strings){ for(String str: strings){ System.out.print(str); } System.out.println(); } public static void main(String[] args) { Test19 t = new Test19(); t.print("aaa", "bbb", "ccc"); t.print(new String[]{"d","e","f"}); } }
建立一個使用可變參數列表而不是普通的main()語法的main()。打印所產生的args數組的全部元素,並用各類不一樣數量的命令行參數來測試它。
package net.mindview.initialization; public class Test19 { public static void main(String ...args){ for(String arg: args){ System.out.println(arg); } } }
建立一個enum,它包含紙幣中最小面值的6種類型。經過values()循環並打印每個值及其ordinal()
package net.mindview.initialization; enum Money{ ONE, TWO, FIVE, TEN, FIVTY, HUNDRED } public class Test21 { public static void main(String[] args) { for(Money m : Money.values()){ System.out.println(m + " " + m.ordinal()); } } }
在前面的例子中,爲enum寫一個switch語句,對於每個case,輸出該特訂貨幣的描述。
package net.mindview.initialization; enum Money{ ONE, TWO, FIVE, TEN, FIFTY, HUNDRED } public class Test22 { Money value; public Test22(Money value){ this.value = value; } public void printValue(){ switch(value){ case ONE: System.out.println("1元面值"); break; case TWO: System.out.println("2元面值"); break; case FIVE: System.out.println("5元面值"); break; case TEN: System.out.println("10元面值"); break; case FIFTY: System.out.println("50元面值"); break; case HUNDRED: System.out.println("100元面值"); break; } } public static void main(String[] args) { Test22 t = new Test22(Money.ONE); Test22 t2 = new Test22(Money.TWO); Test22 t3 = new Test22(Money.HUNDRED); t.printValue(); t2.printValue(); t3.printValue(); } }