Java | 面試題(3)

面試題1:成員變量與局部變量

以下代碼運行結果

/**
 * ClassName: Exam5
 * Date:      2020/2/27 22:53
 * author:    Oh_MyBug
 * version:   V1.0
 */
public class Exam5 {
    static int s;   // 成員變量,類變量
    int i;  // 成員變量,實例變量
    int j;  // 成員變量,實例變量
    {
        int i = 1;  // 非靜態代碼塊中的局部變量i
        i ++;   //就近原則,是第12行的i
        j ++;
        s ++;
    }
    public void test(int j){    // 形參,局部變量j
        j ++;
        i ++;
        s ++;
    }

    public static void main(String[] args) {    // 形參 局部變量args
        Exam5 obj1 = new Exam5();   // 局部變量obj1
        Exam5 obj2 = new Exam5();   // 局部變量obj2
        obj1.test(10);
        obj1.test(20);
        obj2.test(30);
        System.out.println(obj1.i + "," + obj1.j + "," + obj1.s);
        System.out.println(obj2.i + "," + obj2.j + "," + obj2.s);
    }
}

輸出

2,1,5
1,1,5

考點

  • 就近原則
  • 變量的分類
    • 成員變量: 類變量、實例變量
    • 局部變量
  • 非靜態代碼塊的執行:每次創建實例對象都會執行
  • 方法的調用原則:調用一次執行一次

局部變量與成員變量的區別

  • 聲明的位置
    • 局部變量:方法體{}中,形參,代碼塊{}中
    • 成員變量:類中方法外
      • 類變量:有static修飾
      • 實例變量:沒有static修飾
  • 修飾符
    • 局部變量:final
    • 成員變量:public、protected、private、final、static、volatile、transient
  • 值存儲位置
    • 局部變量:棧
    • 實例變量:堆
    • 類變量:方法區
  • 作用域
    • 局部變量:從聲明處開始,到所屬的}結束
    • 實例變量:在當前類中“this.”(有時this.可以缺省),在其它類中“對象名.”訪問
    • 類變量:在當前類中“類名.”(有時類名.可省略),在其它類中“類名.”或“對象名.”訪問
  • 生命週期
    • 局部變量:每一個線程,每一次調用執行都是新的生命週期
    • 實例變量:隨着對象的創建而初始化,隨着對象的被回收而消亡,每一個對象的實例變量都是獨立的
    • 類變量:隨着類的初始化而初始化,隨着類的卸載而消亡,該類的所有對象的類變量是共享的

當局部變量與xx變量重名時,如何區分

  • 局部變量與實例變量重名
    • 在成員變量前面加“this.”
  • 局部變量與類變量重名
    • 在類變量前面加“類名.”

Heap),此內存區域的唯一目的就是存放對象實例,幾乎所有的對象實例都在這裏分配。這一點在Java虛擬機規範中的描述是:所有的對象實例以及數組都要在堆上分配。

通常所說的Stack),是指虛擬機棧。虛擬機棧用於存儲局部變量表等。局部變量表存放了編譯器可知長度的各種基本數據類型(boolean、byte、char、short、int、float、long、double)、對象引用(reference類型,它不等同於對象本身,是對象在堆內存的首地址)。方法執行完,自動釋放。

方法區Method Area)用於存儲已被虛擬機加載的類信息、常量、靜態變量、即時編譯器編譯後的代碼等數據。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章