天天看點

【Java程式設計思想】(1)初始化與清理

1. 基本類型大小:char<byte<short<int<long<float<double

2. 基本類型傳遞給重載方法時發生的情況: 常數值5被當做int值處理,如果有某個重載方法接受int型參數,它就會被調用。至于其他情況,如果傳入的資料類型(實際參數類型)小于方法中聲明的形式參數類型,實際資料類型就會被提升。char型略有不同,如果無法找到恰好接受char參數的方法,就會吧char直接提升至int型。 如果傳入的實際參數類型較大,就得通過類型轉換來執行窄化轉換。如果不這樣做,編譯器就會報錯。

3. 在構造方法中,如果需要調用其它的構造方法,必須将構造器的調用放在起始處。編譯器禁止在其它任何方法中調用構造方法。

4. 類成員變量的預設初始值: boolean          false; char                ''; byte                0; short               0; int                   0; long                0; float                0.0; double            0.0; 對象                null; 類中基本類型的變量的初始化取決于他們的順序,而與編譯方式無關。即使變量定義散布于方法定義之間,它們仍舊會在任何方法(包括構造器)被調用之前得到初始化。

5. 靜态初始化隻有在必要時刻才會進行,如果不建立對象,或者不引用靜态對象,那麼它們永遠都不會被建立。隻有當一個對象被建立,靜态對象才會被初始化,而且不會再次被初始化。 初始化的順序是:靜态對象(如果它們尚未因前面的對象建立過程而被初始化)-->非靜态對象-->構造方法。

6. 靜态代碼塊初始化:

static {
		int a = 4;
		int b = 4;
	}
           

跟在static關鍵字後面的代碼,與其他靜态初始化動作一樣,這段代碼隻執行一次:當首次生成這個類的一個對象時,或者首次通路屬于那個類的靜态資料成員時(即便從未生成過那個類的對象)。 非靜态執行個體初始化:

{
		B b = new B();
		B b2 = new B();
	}
           

這個看起來和靜态初始化幾乎一樣,隻不過少了static關鍵字,這種文法對于支援“匿名内部類”的初始化是必須的,但是它也使得你可以保證無論調用了哪個顯示的構造方法,某些操作都會發生。

7. Arrays.toString()方法屬于java.util标準類庫,它将産生一維數組的可列印版本。

8. 初始化數組的兩種方法:

Integer[] a = new Integer[] { new Integer(4), 5 };
		Integer[] b = { new Integer(4), 5 };
           

第二種方法使用很受限,隻能用于數組被定義處,第一種可以在任何地方使用,甚至是在方法調用内部:

function(new Integer[] { new Integer(4), 5 });
           

9. 可變參數的方法可以接受空參數的傳遞:

public class TestConstructor {

	public static void main(String[] args) {
		A a = new A();
		a.printArray(4, 5);
		a.printArray(new Integer(4), new Float(4.5));
		a.printArray(new A());
		a.printArray();
		a.printArray((Object[]) (new Integer[] { 4, 5 }));
	}
}

class A {
	void printArray(Object... args) {
		for (Object o : args) {
			System.out.print(o + " ");
		}
		System.out.println();
	}
}
           

運作結果:

4 5 
4 4.5 
[email protected] 

4 5 
           

如果兩個方法參數類型都是可變參數,那麼這是後調用任意一個的不傳參數的方法都會報錯。為了區分它們,通常在可變參數前面,再加上一個類型非可變參數就可以解決問題。

10. 枚舉類型定義:

public enum Type {
		FIRST, SECOND, THIRD
	};
           
public enum Type {
		FIRST, SECOND, THIRD
	};

	public static void main(String[] args) {

		Type t = Type.SECOND;
		System.out.println(t);
		System.out.println(t.ordinal());
		for (Type type : Type.values()) {
			System.out.println(type);
		}
	}
           

輸出:

SECOND
1
FIRST
SECOND
THIRD
           

ordinal()傳回的是枚舉類型的聲明順序,values()方法傳回按照枚舉聲明順序産生的一個枚舉數組。

11. switch()參數類型的問題: 可以傳byte、char、short、int、枚舉,JDK1.7以後新增String。