j**a裡面有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的值。
在j**a裡面的任何變數首先應該要宣告,然後再賦值,然後再使用。成員變數和區域性變數有乙個重要區別:成員變數在類裡面宣告時如果不進行初始化,那麼j**a會預設給它初始化,而區域性變數j**a不會預設給它初始化,所以在方法裡面宣告乙個區域性變數如果不給它初始化時就會出錯。預設初始化大多數都是0,boolean型別的為false,引用型別的為null,如過不記得j**a對成員變數預設的初始化是多少的話,那就這樣做,定義乙個成員變數,不給它初始化,然後直接列印這個成員變數,列印出來的結果就是j**a預設的初始化的值。
引用型別和基本型別有著巨大的區別,當宣告乙個int i=0時,系統會馬上給這個i分配乙個記憶體空間(在棧記憶體裡面分配一小塊區域用來裝數字0),裡面裝著乙個值為0,以後使用i這個名字馬上就可以訪問這個記憶體空間裡面的值,這就是基本資料型別,所以基礎型別就只佔一塊記憶體。基礎型別之外的型別全都叫引用型別,我們定義乙個mouse m,這個m就是乙個引用型別的資料。引用型別有什麼重要的特徵——引用型別佔2塊記憶體。我們定義好這個類之後,需要使用new關鍵字把這個類的物件例項化出來,也就是真真正正造出乙個物件出來才能使用這個物件。
如何在記憶體中區分類和物件
類是靜態的概念,是位於**區裡面。物件是new出來的,它是位於堆記憶體,為什麼物件要位於堆記憶體?因為堆記憶體是用來動態分配記憶體的,只有在執行當中才會new乙個物件放堆記憶體裡面,那這個物件到底有多大個,這個東西你不知道,你沒有辦法提前知道,所以你沒有辦法提前分配記憶體給這個物件,你只有在執行期間才能去分配它。什麼叫執行期間?敲j**ac這個命令那是在編譯期間,編譯完成後再敲j**a命令,那就是執行期間了。只有在執行期間,才能夠明白這個物件到底要分配多大的空間給它,所以把它放在堆記憶體裡面,堆記憶體比較大,動態分配記憶體用它。如果這個物件不用了,那它就是垃圾,那麼就等著垃圾收集器把它收集回去,釋放掉占用的記憶體。
記住,以後一提到引用,腦子裡馬上浮現引用那就是一小塊記憶體指向一大塊記憶體。
使用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構造方法寫好後就和new組合在一起使用,new的作用是構建乙個新物件,創造乙個新物件,所以new的時候實際當中呼叫的是構造方法。只有呼叫了這個構造方法才能構造出乙個新的物件。例如:public
class
person
15 }
1 public static void main(string args)下面是在main方法裡面呼叫person構造方法時的記憶體分析情況:
當方法呼叫完成之後,棧裡面為它分配的空間全部都要消失,即把這個方法呼叫時分配給它的記憶體空間釋放出來,所以這個構造方法person呼叫完成之後,棧記憶體裡面分配的兩小塊記憶體_id和_age自動消失了。這樣就把它們所佔的空間讓了出來,讓其他的方法去占用。而new出來的物件則永遠留在了堆記憶體裡面。
宣告乙個類,若沒有在類中指定其構造方法(建構函式)時,編譯器會為這個類自動新增形如類名( )的建構函式。
如:
1 class point但在main方法裡面我們卻可以這樣使用:
1 public static void main(string args)這裡這樣寫是可以的,當沒有給這個類指明構造方法時,系統會預設地給這個類加上point ( ) 這樣乙個空的構造方法。所以才可以在main方法中使用
point p = new point(); 實際上你呼叫的就是編譯器預設給它加上的point ( ) 這個構造方法,在這個構造方法當中,預設地把類裡面的成員變數x和y初始值設為0。正是因為系統給它預設加上這麼乙個構造方法,所以才能在main方法裡面呼叫。但要記住一點,一旦給這個類裡面指定了構造方法,那麼系統就不會再給這個類新增構造方法了。
**:
物件導向2
6 static關鍵字 用法 是乙個修飾符,用於修飾成員 當成員被靜態修飾後,就多了乙個呼叫方式,除了可以被物件呼叫外,還可以直接被類名呼叫。類名.靜態成員 static特點 static成員 也叫 類變數 1 隨著類的載入而載入 也就是說 靜態會隨著類的消失而消失。說明它的生命週期最長 2 優先於...
物件導向2
一.昨日內容回顧 1.匿名函式 lambda 引數 返回值 def chi return 飽了 lambda 飽了 2.sorted 排序 sorted iterable,key function,reverse false 3.filter 篩選 filter function,iterable ...
物件導向 2
1.物件導向的三大特性 封裝 繼承 多型。一 封裝 1.封裝的學習就是學習類成員的訪問許可權的控制。是設計類的時候需要考慮的問題。概念 通過對類中的成員的訪問許可權的控制,實現對外部類的訪問的可見和隱藏的控制的過程。2.類成員的訪問許可權的控制,通過訪問許可權修飾符來控制。可以在類成員的前面新增訪問...