1. 程式人生 > >java面向物件(類與物件,區域性變數成員變數,基本型別和引用型別作為引數傳遞)

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方法彈棧。

由於是兩個引用指向同一個物件,不管是哪一個引用改變了引用的所指向的物件的中的值,其他引用再次使用都是改變後的值