在了解了java的基本數據結構后,開始學習java的類。
java中的類也是一種數據結構,我認為它和C中的結構體挺像。類中可以有屬性和方法。類的方法中比較特別的是構造方法。
java中類的構造方法要和類名相同,且沒有返回值。構造方法主要用于為類的對象定義初始化狀態,在new一個對象時,就會調用構造方法。每個java類都至少有一個構造方法,如果沒有顯式的定義構造方法,java編譯器會為我們提供一個默認的不帶參數的構造方法。構造方法不能夠直接調用,必須通過new關鍵字自動調用。
在學習構造方法的過程中,為了能夠看到默認的構造方法,使用了jdk提供的工具javap。這個反編譯工具在JDK安裝目錄的bin目錄下,使用javap反編譯工具,在控制臺下輸入javap point(類名,javap加載的一個類),就會將類的屬性和方法輸出。
在使用new關鍵字創建類的實例時,主要分為三個步驟,即為對象分配內存空間,引起對象構造方法的調用,并為對象返回一個引用。
當使用默認的構造方法初始化對象時,系統會默認的初始化對象的屬性,各個數據類型的默認值是:數值-0、boolean-false、char-‘\0’、對象-null。
this變量代表對象本身,當類中有兩個同名變量,一個是類的屬性,一個是方法中的局部變量,則用this區分類的屬性和局部變量。另外,也可以使用this簡化構造函數的調用,如:
Point(int n)
{
this.n = n;
}
Point()
{
this(1);
}
有了this的特性,一個類所有的對象調用的方法在內存中就可以只有一份拷貝,盡管在內存中可能有多個對象。但是數據成員在每個對象所在內存中都有一份拷貝。this允許了相同的方法為不同的對象工作。當一個對象調用一個方法時,this變量將被設置為引用該方法的特定的類對象。方法的代碼接著會與this所代表的對象的特定數據相關聯。
static關鍵字
在方法的返回值前或者變量的類型前加上static修飾,這些方法叫靜態方法,變量叫靜態變量。
靜態方法和靜態變量都屬于一個類,而不是屬于類的對象,也就是說,它在內存中只有一份拷貝。
靜態方法和靜態變量的可以通過類名直接引用,當然也可以通過對象調用靜態的方法。如靜態方法static void staticMethod(){} 引用方式可以為:A.staticMethod()、obj.staticMethod(),其中A為類名,obj為類的對象。
需要注意的是在靜態方法中不能夠調用非靜態的方法和使用非靜態的成員變量,假如靜態方法中使用了非靜態的變量或者調用了非靜態的方法,那么在使用類名引用該靜態方法時,系統無法知道這些非靜態的方法和變量如何處理。
final關鍵字
在java中沒有define,如果要定義常量的話,可以使用final來定義。常量在運行的時候不能被修改,所以常量需要在定義的時候賦值,如final int a = 3;另外一種方式是在構造函數中賦初值,如果有多個構造函數,則需要在每個構造函數中都賦值,但是如果某個構造函數中調用了其他的構造函數,則需要注意的是,要保證只能賦值一次。例如:
final int a;
Point(int n)
{
a = 3;
}
Point()
{
a = 4;
this(2);
}
如果沒有this(2)這句,上面的代碼編譯可以通過。如果有了this(2)這句,因為在Point()構造函數中調用了Point(int n)這個構造函數,而Point(int n)這個構造函數也對常量a賦值了,所以相當于對常量a進行了兩次的賦值,編譯就會報錯了。
為了節省內存,通常把常量也聲明為static。