[Java入門筆記] 面向對象編程基礎(三):成員變量和局部變量

在類中,變量根據定義的位置不一樣,能夠分爲成員變量和局部變量。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

再次判斷循環,條件不成立,循環結束。向下執行,方法結束,清空該方法中全部變量。

相關文章
相關標籤/搜索