Java面向物件的基本知識
歡迎來到Java的世界裡,這裡萬物皆物件。
一. 類與物件
剛開始接觸Java的時候,肯定會有同學會對類和物件兩個概念糾結很久,為什麼我會知道呢? 因為我就是其中一個。
下面我來介紹一下類和物件吧:
類是具有相同屬性和服務的一組物件的集合 物件是系統中用來描述客觀事物的一個實體
.......什麼鬼?下面兩個比喻應該會對你有點幫助:
1.類就是類別,指的是一類東西,比如雞這個類,而具體的一隻只雞就是物件,也就是物件。
2.類就是一個模板,比如你去買手機,跟銷售員說你要一個螢幕多大的,價錢多少的,有什麼功能的手機,你描述中的這種手機就是一個類,銷售員給你的具體的手機就是一個物件。
二、包(Package)import和import static
Java中的包Package是類的容器,包相當於是一個資料夾,類相當於是這個資料夾的子檔案。如果沒有指定包名,所有示例都屬於一個預設的無名包。
1.把功能相似或者相關的類或者介面組織在同一個包中,方便類的查詢和使用。
2.如同資料夾一樣,包也採用了樹形目錄的儲存方式,同一個包中的類名字是不同的,不同的包中的類的名字是可以相同的,當同時呼叫兩個不同包中的相同類名的類的時候,
應該加上包名加以區別。因此,包可以避免名字衝突。
3.包也限定了訪問許可權,擁有包訪問許可權的類才能訪問某個包。
import可以向某個Java檔案中匯入指定包層次下的某個類或者全部類。
import static可以向某個java檔案匯入指定類的某個靜態變數、靜態方法或者全部靜態變數、靜態方法。
三、訪問修飾符
public : 可以被任何類訪問。
protected : 可以被同一個包中的所有類訪問;也可以被子類訪問,即使子類沒有在同一個包內。
private :只能被當前類的方法訪問。
預設:無訪問修飾符,可以被同一個包中的所有類訪問;如果子類沒有在同一個包中不可訪問。
四、垃圾回收機制
如果沒有任何引用指向堆記憶體中的某個物件,那麼程式就無法再訪問該物件,這個物件也變成了垃圾,Java垃圾回收機制將回收該物件,釋放該物件所佔記憶體區。因此,如果希望通知Java垃圾回收機制收回某個物件,只需要切斷所有應用變數與這個物件的關係,也就是將這些引用變數賦值為null。
五、this,static關鍵字
Java中的this關鍵字總是指向呼叫該方法的物件,這個方法可以是構造方法,也可以是普通方法。也就是說某個方法有this,這個時候它代表的物件是不確定的,但是它代表的物件必然是當前這個類的物件,只有當這個方法被呼叫的時候,這個物件才確定下來。這個方法如果是構造方法,那麼就是this指向正在用該構造方法初始化的物件,如果是普通方法,那麼this就引用呼叫該方法的物件。
對於使用static修飾的方法而言,可以使用類來直接呼叫該方法,static修飾的方法中如果有this,那麼this無法指向物件,所以:
static修飾的方法中不能使用this關鍵字。
如果在static修飾方法中呼叫非static修飾的成員變數或者方法,那麼預設呼叫了this,這也會報錯,所以:
static修飾的方法不能呼叫非靜態的成員變數或方法。
六、Java中的方法
1.方法的引數傳遞機制
Java中方法的傳遞機制只有一種:值傳遞。值傳遞就是將實際引數的副本也就是複製品傳入方法內,而引數本身不會受到影響。
假設有兩個整數int a=1,b=2,傳入一個方法swap(int a,int b),傳入的是a,b的副本,而不是a,b本身,所以將有四個變數儲存在記憶體中,分別是main棧區中的a,b和swap棧區中的a,b,經過swap方法後的副本a,b的值交換,但交換的只是swap棧區的a,b,而main棧區中的a,b則不變。
如果傳入的不是數值型別,而是引用型別,如一個Test類中有兩個成員變數int a=1,b=2,將這個類的引用變數test傳入一個方法swap(Test test),傳入的也是test這個引用變數的副本,所以記憶體中將有三個部分,堆記憶體中的Test物件,main棧區中的test引用變數,swap棧區中的引用變數,因為兩個引用變數均指向Test,所以不管操作哪個引用變數都是操作同一個物件,因此,swap中交換test引用指向的物件的成員變數a,b的值,main中的test引用指向物件的成員變數的值a,b也被交換了。
2.形參個數可變的方法
如果傳入方法的引數個數是不確定,那麼可以定義長度可變形參,在方法內部當做陣列來處理,長度可變形參必須在引數列表的最後一項,格式為型別...變數,如String...books。一個方法中最多隻能包含一個長度可變形參,這個長度可變形參可傳入多個引數,也可以傳入一個數組。
3.成員變數與區域性變數
成員變數分為靜態變數和例項變數。
靜態變數在類載入的準備階段分配記憶體並初始化為預設值,在類初始化階段對靜態變數賦予初始值,也就是靜態變數初始化。靜態變數作為類的一個成員,直至系統銷燬這個類,與這個類共存亡。
例項變數在該類的例項建立後隨物件一起分配在記憶體中,同時初始化預設值,接著為例項變數賦予初始值,也就是例項變數的初始化,例項變數作為例項的一個成員,直到系統銷燬這個例項,與例項共存亡。
區域性變數分為三種:形參、方法區域性變數和程式碼塊區域性變數。
形參:在定義方法簽名是定義的變數,形參的作用域為整個方法。
方法區域性變數:在方法體內定義的區域性變數,這個區域性變數的作用域從定義該變數的地方生效,到該方法結束時失效。
程式碼塊區域性變數:在程式碼塊中定義的區域性變數,這個區域性變數的作用域從定義該方法的地方生效,到該程式碼塊結束時失效。
定義區域性變數後,系統並未為這個變數分配記憶體空間,知道這個程式為這個變數賦初始值,系統才會為區域性變數分配記憶體空間,並將初始值儲存到記憶體空間。
成員變數不需要顯式初始化,因為它有預設初始化。但是區域性變數中除了形參外,都必須顯式初始化,也就是說必須給方法區域性變數和程式碼塊區域性變數指定初始值,否則不可以訪問它們。
能用區域性變數代替成員變數就使用區域性變數,因為成員變數記憶體開銷大,在使用區域性變數的儘量縮小它的作用範圍,因為範圍小,它在記憶體中停留的時間越短,程式的效能魚越好。
七、構造方法
當呼叫構造方法時,系統為物件分配記憶體空間,也就是說,在構造方法的執行體執行之前這個物件就已經存在了,當構造方法執行完後,這個物件作為返回值賦予引用變數。
.