一.JAVA類的定義
JAVA里面有class關鍵字定義一個類,后面加上自定義的類名即可。如這里定義的person類,使用class person定義了一個person類,然后在person這個類的類體里面定義person這個類應該具有的成員變量(即屬性)和方法,如這里定義的int id和int age這個兩個成員變量,或者叫屬性,這個id表示人的身份證號碼,人應該具有這個屬性,age表示人的年齡,這也是人應該具有的。這樣就在person這個類里面定義了兩個人應該有的屬性,接下來就是定義方法了,這里定義了三個方法,分別是getAge()、setAge(int i)和getId(),分別用來獲取人的年齡,設置人的年齡,獲取人的id,getAge()方法獲取了人的年齡后,將獲取到的值返回,所以使用了return age語句,getId()方法也使用了return id語句用於返回獲取到的id的值。
二. 成員變量
在JAVA里面的任何變量首先應該要聲明,然后再賦值,然后再使用。成員變量和局部變量有一個重要區別:成員變量在類里面聲明時如果不進行初始化,那么JAVA會默認給它初始化,而局部變量JAVA不會默認給它初始化,所以在方法里面聲明一個局部變量如果不給它初始化時就會出錯。默認初始化大多數都是0,boolean類型的為false,引用類型的為null,如過不記得JAVA對成員變量默認的初始化是多少的話,那就這樣做,定義一個成員變量,不給它初始化,然后直接打印這個成員變量,打印出來的結果就是JAVA默認的初始化的值。
三、Java面向對象的基本概念——引用
引用類型和基本類型有着巨大的區別,當聲明一個int i=0時,系統會馬上給這個i分配一個內存空間(在棧內存里面分配一小塊區域用來裝數字0),里面裝着一個值為0,以后使用i這個名字馬上就可以訪問這個內存空間里面的值,這就是基本數據類型,所以基礎類型就只占一塊內存。基礎類型之外的類型全都叫引用類型,我們定義一個Mouse m,這個m就是一個引用類型的數據。引用類型有什么重要的特征——引用類型占2塊內存。我們定義好這個類之后,需要使用new關鍵字把這個類的對象實例化出來,也就是真真正正造出一個對象出來才能使用這個對象。
如何在內存中區分類和對象
類是靜態的概念,是位於代碼區里面。對象是new出來的,它是位於堆內存,為什么對象要位於堆內存?因為堆內存是用來動態分配內存的,只有在運行當中才會new一個對象放堆內存里面,那這個對象到底有多大個,這個東西你不知道,你沒有辦法提前知道,所以你沒有辦法提前分配內存給這個對象,你只有在運行期間才能去分配它。什么叫運行期間?敲JAVAC這個命令那是在編譯期間,編譯完成后再敲JAVA命令,那就是運行期間了。只有在運行期間,才能夠明白這個對象到底要分配多大的空間給它,所以把它放在堆內存里面,堆內存比較大,動態分配內存用它。如果這個對象不用了,那它就是垃圾,那么就等着垃圾收集器把它收集回去,釋放掉占用的內存。
記住,以后一提到引用,腦子里馬上浮現引用那就是一小塊內存指向一大塊內存。
四、對象的創建和使用
使用new關鍵字來創建一個新的對象。
五、類和對象的關系
在內存中分析類和對象的關系
假設這里有一個類C,我們定義了一個類class C,然后在這個類里面定義了兩個成員變量: int i和int j。定義好了這兩個成員變量以后,我們寫了一個main()方法(public static void main(Strng[] args)),程序開始執行。第一句我們寫了 C c1 = new C(),這句的代碼是我們相當於在堆內存里創建了一個對象,同時也創建了這個對象的一個引用對象c1,c1位於棧內存中,c1這個引用對象指向堆中一大塊內存,這一大塊內存里面裝着new出來的那個對象。這里面我們一般來說是new出來兩個對象c1和c2,當然,實際上,嚴格來講,c1和c2叫做對象的引用,有時候,簡稱new出來了兩個對象,c1和c2。你腦子里馬上要浮現出兩塊內存,c1指向一塊,c2指向一塊。局部變量是分配在棧內存里面的,main方法里面的c1和c2都是局部變量,所以在棧里面分配了兩小塊內存出來,一塊是c1的,一塊是c2的,c1這塊內存里面裝着一個值,或者叫裝着一個地址,這個地址是什么,我們不知道,我們只知道根據這個值就能找到new出來的C這個類里面的一個對象,而在這個對象里面有它自己的成員變量i和j,里面的兩小塊內存是分別用來裝i和j的值的,因為每一個對象都有自己不同的成員變量的值,所以c1指向的那塊對內存里面又分成一小塊一小塊內存,每一個小塊的內存都裝着這個對象的成員變量(或者叫屬性)。如這里的第一小塊裝着i的值,第二小塊裝着j的值,所以當我們去訪問第一小塊里面裝着的成員變量時,我們應該這樣寫:c1.i,這樣就拿到了i的值,c1.j,這樣就拿到了j的值。同理,c2這個對象也指向了一個new出來的C這個類里面的另一個對象,這個對象也有成員變量i和j,只不過和c1指向的那個對象里的i和j的值不同而已。要訪問這個這個對象的成員變量時 ,也是要c2.i,c2.j這樣去訪問。
六、構造方法
在面向對象里面有一個特殊的方法,叫構造方法。
構造方法是用來創建一個新的對象的,與new組合在一起用,使用new+構造方法創建一個新的對象。你new一個東西的時候,實際上你調用的是一個構造方法,構造方法就是把自己構造成一個新的對象,所以叫構造方法,構造一個新對象用的方法叫構造方法。
構造方法比較特殊,構造方法的名字必須和類的名字完全一模一樣,包括大小寫,並且沒有返回值。如原來定義的一個person類,在類里面聲明了兩個成員變量id與age,這時候你可以再為這個person類定義一個它的構造方法person(int n,int i),這個方法的名字和類名完全相同,並且沒有返回值,也就是在這個方法前面不能寫任何的方法的返回類型修飾符,連void都不可以寫。
構造方法范例:
1 public class Person { 2 int id; //在person這類里面定義兩個成員變量id和age, 3 int age=20; //給成員變量age賦了初值為20 4 5 /**這里就是person這個類的一個構造方法 6 * 構造方法的規則很簡單,和類名要完全一樣,一點都不能錯,包括大小寫。 7 * 並且沒有返回值,不能寫void在它前面修飾 8 * @param _id 9 * @param _age 10 */ 11 public Person(int _id,int _age ) { 12 id = _id; 13 age = _age; 14 } 15 }
構造方法寫好后就和new組合在一起使用,new的作用是構建一個新對象,創造一個新對象,所以new的時候實際當中調用的是構造方法。只有調用了這個構造方法才能構造出一個新的對象。例如:
1 public static void main(String[] args) { 2 Person tom = new Person(1, 25); // 調用person這個構造方法創建一個新的對象,並給這個對象的成員變量賦初始值 3 }
下面是在main方法里面調用person構造方法時的內存分析情況:
當方法調用完成之后,棧里面為它分配的空間全部都要消失,即把這個方法調用時分配給它的內存空間釋放出來,所以這個構造方法person調用完成之后,棧內存里面分配的兩小塊內存_id和_age自動消失了。這樣就把它們所占的空間讓了出來,讓其他的方法去占用。而new出來的對象則永遠留在了堆內存里面。
聲明一個類,若沒有在類中指定其構造方法(構造函數)時,編譯器會為這個類自動添加形如類名( ){ }的構造函數。
如:
1 class point{//這里聲明一個類時並沒有給它指定其構造方法。 2 int x; 3 int y; 4 }
但在main方法里面我們卻可以這樣使用:
1 public static void main(String[] args){ 2 point p = new point(); 3 }
這里這樣寫是可以的,當沒有給這個類指明構造方法時,系統會默認地給這個類加上point ( ) { }這樣一個空的構造方法。所以才可以在main方法中使用
point p = new point(); 實際上你調用的就是編譯器默認給它加上的point ( ) { }這個構造方法,在這個構造方法當中,默認地把類里面的成員變量x和y初始值設為0。正是因為系統給它默認加上這么一個構造方法,所以才能在main方法里面調用。但要記住一點,一旦給這個類里面指定了構造方法,那么系統就不會再給這個類添加構造方法了。