在類中,變量根據定義的位置不一樣,能夠分爲成員變量和局部變量。spa
成員變量是在類體內,方法以外定義的變量,局部變量是在方法中定義的參數。對象
成員變量分爲類屬性和實例屬性,定義時沒有static修飾的稱爲實例屬性,有static修飾的稱爲類屬性,類屬性和實例屬性的區別就是類屬性是屬於類的,它並不屬於哪個對象,它從這個類的準備階段就一直存在,一直到這個類徹底銷燬。實例屬性屬於對象,只有某個對象被建立時,它才被建立,對象被回收,從屬於該對象的實例屬性也就被銷燬了。blog
[修飾符] static 數據類型 變量名 [ = 值];
修飾符能夠是public、protected、private和不寫內存
數據類型能夠是基本數據類型和引用數據類型字符串
static是修飾類屬性必須的修飾符class
變量名由本身定義,不過要遵循標識符定義規則變量
值能夠一開始就設置一個默認值,也能夠不填,不填系統會分配一個默認值循環
byte、short、int、long默認爲0數據類型
double、float默認爲0.0語法
char默認爲'\u0000'
boolean默認爲false
引用類型默認爲null
訪問:
類名.類屬性名
固然,在Java中也可使用對象名訪問類屬性,可是不推薦這樣使用,由於在邏輯上來講,類屬性是屬於類的,而不該該用屬性來訪問它。
[修飾符] 數據類型 變量名 [ = 值];
規則相似類屬性,只是沒有static修飾。
訪問:
對象名.屬性名
public class Person{ //定義兩個實例屬性 public String name; public int age; //定義兩個類屬性,併爲其設置默認值 public static int eyeNum = 2; public static int mouthNum = 1; }
訪問
public class Test{ public static void main(String[] args){ Person p = new Person(); p.name = "張三"; p.age = 20; System.out.println("個人名字是:" + p.name); System.out.println("我有" + Person.mouthNum + "個嘴巴"); Person p2 = new Person(); p2.name = "李四"; p2.age = 25; System.out.println("個人名字是:" + p2.name); System.out.println("我有" + Person.mouthNum + "個嘴巴"); } }
運行後輸出:
個人名字是:張三
我有1個嘴巴
個人名字是:李四
我有1個嘴巴
前面咱們說過,類屬性在類準備加載時就被加載到了內存中,存儲在數據區(data segment),他們從類被加載以後就存在。
當咱們的代碼執行到 Person p = new Person(); 建立對象,會爲對象建立好實例變量,若是沒有賦默認值就有系統分配默認值:
由上面咱們能夠看到,儘管eyeNum和mouthNum屬於Person類的類屬性,可是其實p對象仍是能夠經過引用找到類屬性,可是咱們前面提到過,不建議使用對象得到或修改類屬性。
咱們能夠經過p對象設置或得到name和age屬性
name是一個不可變的字符串引用數據類型String,後面的blog咱們再詳細看看它,歡迎你們圍觀,它如今在內存中大體是這樣的。
繼續建立p2對象:
咱們能夠看到,不管建立多少個Person對象,都只有一個eyeNum和mouthNum。
爲p2賦值:
因此,改變p2時,是不會影響到p對象的值的,可是,若是咱們修改了類屬性的值呢?
咱們在上面的例子中再加上幾句句代碼:
public class Test{ public static void main(String[] args){ Person p = new Person(); p.name = "張三"; p.age = 20; //System.out.println("個人名字是:" + p.name); //System.out.println("我有" + Person.mouthNum + "個嘴巴"); Person p2 = new Person(); p2.name = "李四"; p2.age = 25; //System.out.println("個人名字是:" + p2.name); //System.out.println("我有" + Person.mouthNum + "個嘴巴"); //新加的代碼,修改類屬性的值 p.mouthNum = 2; System.out.println("個人名字是:" + p.name); System.out.println("我有" + p.mouthNum + "個嘴巴"); System.out.println("個人名字是:" + p2.name); System.out.println("我有" + p2.mouthNum + "個嘴巴"); } }
輸出:
個人名字是:張三
我有2個嘴巴
個人名字是:李四
我有2個嘴巴
咱們能夠看到,新的代碼咱們使用 對象名.類屬性 的方式訪問類屬性,獲得的是一個值,因此也能夠看書,類屬性是屬於類的,修改類屬性,相互之間是有影響的。
局部變量能夠分爲三種:
形參:在定義方法時方法所須要的參數值,在整個方法內有效。
方法局部變量:在方法體內定義的變量,在變量定義開始到方法結束時有效。
代碼塊局部變量:在代碼塊中定義的變量,在變量定義開始到代碼塊結束時有效。例如循環或者判斷中定義的變量
例:
public class Test{ public static void main(String[] args){ new Test().printHello(2); } public void printHello(int i1){ //i1是一個形參,在整個方法執行過程當中一直有效 int i2 = 1; //i2是一個方法局部變量,從這裏開始,到方法結束一直有效 while(i2 <= i1){ int i3 = 1; //i3是一個代碼塊局部變量,從這裏開始,到循環體結束有效 System.out.println("Hello"); i3++; i2++; } } }
當執行到 new Test().printHello(2); 時,調用printHello方法,傳入一個參數:
向下執行:int i2 = 1;
向下執行,循環判斷,i2小於i1,進入循環,執行 int i3 = 1;
繼續執行,輸出,i2,i3自加1
語句塊結束,i3被清除,繼續判斷循環語句,i2<=i1知足條件,繼續進入循環體
向下執行,再次定義i3,賦值1
繼續向下執行,輸出,i2,i3自加1
再次判斷循環,條件不成立,循環結束。向下執行,方法結束,清空該方法中全部變量。