JAVA編程思想學習總結:第五章——初始化與清理

/*此總結的主要內容是我在學習JAVA過程中,認爲需要記憶的知識點。並結合之前自己學習C++及javascript的相關知識,註明JAVA在一些情況下與這兩門語言的相同及不同之處。*/

(1)方法重載

JAVA區分重載方法的方式有:(1)參數個數。(2)參數類型。(3)參數順序。(注意:返回值並不能作爲函數重載的區分方式)

在重載過程中,基本類型能從一個較小類型自動提升到一個較大的類型。整型常數值會被當作int值處理,所以會調用接受int型參數的重載方法。char型如果無法找到恰好接受char參數的方法,就會直接提升至int型。對於其它類型的參數,如果存在多個類型大於該參數類型的重載函數,會爲其匹配提升類型最小的重載函數。比如一個short型參數,有三個重載函數分別接受int型,float型,double型參數,會爲其匹配接受int型的重載函數,而不是直接提升到float和double型。

public class initialize {
	boolean Boolean;//默認初始化爲false
	static int a;
	static int b;
	static{//在第一次創立對象或者第一次調用靜態成員時初始化一次
		a=0;
		b=1;
		System.out.print("a and b initialized.a="+a+",b="+b+"\n");
	}
	int c;
	int d;
	int e=4;
	{
		System.out.print("Boolean initialized"+Boolean+"\n");
		System.out.print("c and d not initialized.c="+c+",d="+d+"\n");
		System.out.print("e initialized e="+e+"\n");
		c=2;
		d=3;
		System.out.print("c and d initialized.c="+c+",d="+d+"\n");
	}
	initialize(){
		e=5;
		System.out.print(" constructor e initialized e="+e+"\n");
	}
	static public void printfF(){
		System.out.print("static f is initialized?f="+f+"\n");
	}
	static int f;//靜態數據成員在靜態方法調用前先一步被初始化,與其定義位置無關。
	public static void main(String[] args){
		initialize.printfF();
		new initialize();
	}

}

輸出爲:

a and b initialized.a=0,b=1
static f is initialized?f=0
Boolean initializedfalse
c and d not initialized.c=0,d=0
e initialized e=4
c and d initialized.c=2,d=3
 constructor e initialized e=5

(2)對象構造器及初始化

當一個對象沒有定義構造器時,編譯器會創建一個默認構造器,。如果對象已經定義了構造器時,編譯器不會再自動創建默認構造器,在創建對象時,一定要調用其定義的構造器,否則編譯器報錯。

對象中沒有被初始化的數據成員會進行自動的初始化,數值型的參數賦值爲0,布爾型參數賦值爲false,對象的引用賦值爲null

如果不想java對數據成員默認初始化,又不使用自定義的構造器初始化,可以有定義類成員變量的地方爲其賦值進行初始化。甚至調用方法來提供初值,該方法可以帶參數,但參數必須是已經被初始化的(使用這種方法須注意參數初始化順序,使用未初始化的參數程序報錯)

使用自定義的構造器進行初使化並不能阻止自動初始化的進行,自動初始化在構造器調用之前發生。

靜態初始化只有在必要時刻纔會進行——第一個該類對象創建或者第一次訪問靜態數據的時候纔會被初始化,之後靜態對象不會再次被初始化。還可以通過static靜態塊對多個 靜態數據同時初始化。

初始化的順序是先靜態對象(只有當該對象中的靜態數據還未被初始化時纔會發生),而後是非靜態對象。

java中也有被稱爲實例初始化的類似語法,用來初始化每一個對象的非靜態變量。它與static靜態塊很類似,除了沒有static 關鍵字。實例初始化子句是在構造器之前執行,這樣可以保證無論調用 了哪個顯式構造器,某些操作都會發生。

數組初始化由一對花括號{ }括起來的值組成。(JS使用[ ]來完成)。

(3)this關鍵字

this關鍵字在方法內部使用並指用該方法本身。

只有需要明確指出對當前對象的引用時,才需要ths關鍵字。如(1)返回當前對象的引用,即以return this作爲返回值。(實現對方法的鏈式調用需要用到這種方式)(JQuery中鏈式調用也是通過返回對象本身來實現的)(2)將當前對象作爲參數傳遞給其它函數。(3)解決對象中的方法使用的參數與對象中的數據成員同名的問題。(4)使用this在構造函數中調用其它構造函數。該構造器調用必需置於最起始處,否則編譯器報錯。示例如下:

public class Flower {
	int petalcount=0;
	String s="initial value";
	Flower(String s,int petalcount){
		this(petalcount);
		this.s=s;
		System.out.print("Second constructor  String s:"+s+"\n");
	}
	Flower(int petalcount){
		this.petalcount=petalcount;
		System.out.print("Constructor only patalCount:"+petalcount+"\n");
	}
	Flower(String s){
		this.s=s;
		System.out.print("Constructor only String s:"+s+"\n");
	}
	
	Flower(){
		this("hi",520);
		System.out.print("default constructor (no args)\n");
	}
	public static void main(String[] args){
		Flower x=new Flower();
	}
}
輸出爲Constructor w/ int arg only ,petalCount47

String & int args

default constructor (no args)

petalCount =47 s=hi

(4)static的含義與用法

static方法就是沒有this的方法。在static方法內部不能調用非靜態方法(其實可以將對象的引用作爲參數傳到靜態方法中使用非靜態方法或成員,但這樣做偏離了靜態方法的初衷)。可以通過類名調用靜態方法。它很像全局方法(當然實際中還是有很多不同。)

(5)清理:終結處理和垃圾回收

雖然記下了很多內容,但感覺對對JAVA的內存回收完全沒有了解的樣子,我需要抽時間進一步的瞭解內存的回收機制。
Java允許在類中定義一個名爲finalize()的方法。它的工作原理“假定”是這樣的:一旦垃圾回收器準備好釋放對象戰用的存儲空間,將首先調用其finalize()方法,並且在下一次垃圾回收動作發生時,纔會真正佔用的內存。所以要是打算用finalize(),就能在垃圾回收時刻做一些重要的清理工作。
在C++中,對象一定會被銷燬,而java裏的對象卻並非總是被垃圾回收,換句話說:
1、對象可能不被垃圾回收
2、垃圾回收並不等於析構。
3、垃圾回收只與內在有關。
也就是說,使用垃圾回收器的唯一原因是爲了回收程序不再使用的內存。所以對於與垃圾回收有關的任何行爲來說(尤其是finalize()),它們也必須同內存及其回收有關。

(6)可變參數列表

java中通過如下方式定義方法產生可變的參數列表,可變參數列表中可以使用任何類型的參數。重載方法中也可以使用可變參數列表,但是最好要麼只在其中一個版本中使用,要麼壓根不使用。
public class Newvarargs{
       static void printArray(Object... args){
               System.out.print(args.getClass());
               System.out.print(args.length);
               for(Object obj:args)  System.out.print(obj+"");
        }
}

(7)枚舉類型

使用enum關鍵字可以定義枚舉類型。在創建enum時,編譯器會自動添加一些有用的特性。它會創建toString()方法,以便顯示某個enum實例的名字。編譯器還會創建ordinal()方法,用來表示某個特定enum常量的聲明順序。以及static values()方法,用來按照enum常量的聲明順序,產生由這些常量值構成的數組。

enum Spiciness{
	NOT,MILD,MEDIUM,HOT,FLAMING
}
public class enumstudy {
	public static void main(String[] args){
		Spiciness howHot=Spiciness.MILD;
		System.out.print(howHot+"\n");
		for(Spiciness s:Spiciness.values()){
			System.out.println(s+",ordinal"+s.ordinal());
		}
	}
}

輸出值
MILD
NOT,ordinal0
MILD,ordinal1
MEDIUM,ordinal2
HOT,ordinal3
FLAMING,ordinal4


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