面試題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)用於存儲已被虛擬機加載的類信息、常量、靜態變量、即時編譯器編譯後的代碼等數據。