Java之靜態變數和靜態方法
阿新 • • 發佈:2019-02-10
靜態變數 和 靜態方法(使用static修飾)
靜態變數 儲存在 方法區的靜態區(共享區)
靜態變數 是共享的區間
靜態變數 是如何呼叫 ?
1.可以使用物件來呼叫
2.推薦 使用類名來呼叫
為什麼靜態變數 要使用類名去呼叫 ?
只要載入了.class檔案 就載入了靜態變數 這時還沒有物件產生
靜態變數(屬於類 也叫類變數) 和 非靜態變數(屬於物件 物件變數) 的區別
1.呼叫方式不同
靜態變數: 物件或類名去呼叫(推薦 類名)
非靜態變數: 只能使用物件去呼叫
2.記憶體中存在的位置不同
靜態變數 : 方法區的靜態區
非靜態變數: 堆記憶體
3.載入的時機不同
靜態變數: 隨著類的載入而載入(不依賴物件而載入)
非靜態變數: 隨著物件的建立而建立(依賴物件)
4.生命週期不同
靜態變數: 隨著類的銷燬而銷燬(相當於程式結束)
非靜態變數: 隨著物件的銷燬而銷燬
當你在設計類的時候 需要考慮成員變數是否需要共享
靜態變數在記憶體中載入步驟
1.載入.class檔案(位元組碼檔案)到方法區
2.main方法入棧
3.要建立 AVGril 的物件 先要載入 AVGril.class
AVGril.class中 分為 靜態區和非靜態區
這時初始化靜態變數conutry初值為null;
4.建立物件(堆區開闢空間)
5.把物件的地址 賦值給 gril1 變數 儲存
6.通過類名 修改 類變數的值
7.sayHi 方法入棧 列印
8.sayHi 出棧
9.main 出棧
public static void main(String[] args) {
AVGirl girl1 = new AVGirl();
girl1.name = "蒼老師";
AVGirl.country = "日本";
girl1.sayHi();
AVGirl girl2 = new AVGirl();
girl2.name = "波多老師";
AVGirl.country = "日本213";
girl2.sayHi();
}
class AVGirl{
String name; // 姓名
static String country; // 國籍
public void sayHi() {
System.out.println(name + "..." + country);
}
}
靜態方法 (使用static修飾方法)
非靜態方法:
1.可以使用靜態變數 和 非靜態變數
2.可以使用靜態方法 和 非靜態方法
靜態方法:
1.只能使用靜態變數
2.只能使用靜態方法
public static void main(String[] args) {
Man man = new Man();
man.fun();
}
class Man{
int num1 = 10;
static int num2 = 5;
// 非靜態方法 可以訪問 靜態變數 和 非靜態變數
// 靜態方法 可以訪問啥 ? (加上靜態 相當於 隨著類改變 和物件沒關係)
public void fun() {
System.out.println(num1);
System.out.println(num2);
// 呼叫靜態方法 (類方法) 推薦使用 類名調方法
Man.sayHi();
}
public static void sayHi() {
System.out.println("我是sayHi");
}
// 靜態方法
// 靜態方法中 不能訪問 非靜態變數(因為載入類的時候 還沒有物件)
// 簡單記: 靜態只能使用靜態
public static void fun1() {
// System.out.println(this.num1);
System.out.println(num2);
Man.sayHi();
}
}