java面向物件(類與物件,區域性變數成員變數,基本型別和引用型別作為引數傳遞)
一.類和物件的區別
類是對某一類事物的抽象描述,而物件用於表示現實中該類事物的個體
可以將玩具模型看作是一個類,將一個個玩具看作物件,從玩具模型和玩具之間的關係便可以看出類與物件之間的關係。類用於描述多個物件的共同特徵,它是物件的模板。物件用於描述現實中的個體,它是類的例項
二.區域性變數和成員變數區別
1.定義的位置不同
定義在類中的變數是成員變數
定義在方法中或者{}語句裡面的變數是區域性變數
2.在記憶體中的位置不同
成員變數儲存在堆記憶體的物件中
區域性變數儲存在棧記憶體的方法中
3.生命週期不同
成員變數隨著物件的出現而出現在堆中,隨著物件的消失而從堆中消失
區域性變數隨著方法的執行而出現在棧中,隨著方法的彈棧而消失
4.初始化不同
成員變數因為在堆記憶體中,所有預設的初始化值
區域性變數沒有預設的初始化值,必須手動的給其賦值才可以使用。
三.基本型別和引用型別作為引數傳遞
class Demo { public static void main(String[] args) { int x = 4; show(x); System.out.println("x="+x); } public static void show(int a) { a = 5;
} } |
|
基本型別作為引數傳遞時,其實就是將基本型別變數x空間中的值複製了一份傳遞給呼叫的方法show(),當在show()方法中x接受到了複製的值,再在show()方法中對x變數進行操作,這時只會影響到show中的x。當show方法執行完成,彈棧後,程式又回到main方法執行,main方法中的x值還是原來的值
class Demo { int x ; public static void main(String[] args) {
Demo d = new Demo(); d.x = 5; show(d); System.out.println("x="+d.x); } public static void show(Demo d) { d.x = 6; } } |
|
當引用變數作為引數傳遞時,這時其實是將引用變數空間中的記憶體地址(引用)複製了一份傳遞給了show方法的d引用變數。這時會有兩個引用同時指向堆中的同一個物件。當執行show方法中的d.x=6時,會根據d所持有的引用找到堆中的物件,並將其x屬性的值改為6.show方法彈棧。
由於是兩個引用指向同一個物件,不管是哪一個引用改變了引用的所指向的物件的中的值,其他引用再次使用都是改變後的值