static 靜態詳解
不加static關鍵字時,程式碼對應的記憶體圖

因為明星國家都為日本,所以country屬性不需要每次建立物件都賦值,這時候可以加入static關鍵字。

static關鍵字的特點
- 對著類的載入二載入
- 優先於物件存在
- 被類的多有物件共享
- 可以通過類名呼叫
1.其實它本身也可以通過物件名呼叫
2.推薦使用類名呼叫
3.靜態修飾的內容一般我們稱之為:與類相關的,類成員
//類名呼叫 public class Demo1_Static { public static void main(String[] args){ Person.country = "china"; System.out.println(Person.country); } } class Person{ String name; static String country; public void speak(){ System.out.println(name + "..." + country); } } 輸出結果; china
static關鍵字的注意事項
A:在靜態方法中是沒有this關鍵字的
理解:靜態是隨著類的載入而載入,this是隨著物件的建立而存在。靜態比物件先存在。
B:靜態方法只能訪問靜態的成員變數和靜態的成員方法
- 靜態方法:
成員變數:只能訪問靜態變數
成員方法:只能訪問靜態成員方法 - 非靜態方法
成員變數:可以使靜態,也可以是非靜態的
成員方法:可以使靜態,也可以是非靜態的
靜態只能訪問靜態
public class Demo1_Static { public static void main(String[] args){ Demo d = new Demo(); d.print1(); } } class Demo{ int num1 = 10; static int num2 = 20; public void print1(){//非靜態的成員方法 System.out.println(num1); System.out.println(num2); } //public static void print2(){//靜態的成員方法 //System.out.println(num1); //System.out.println(num2); //} } 輸出結果 10 20
public class Demo1_Static { public static void main(String[] args){ Demo.print2(); } } class Demo{ int num1 = 10; static int num2 = 20; //public void print1(){//非靜態的成員方法 //System.out.println(num1); //System.out.println(num2); //} public static void print2(){//靜態的成員方法 System.out.println(num1); System.out.println(num2); } } Error:(17, 28) java: 無法從靜態上下文中引用非靜態 變數 num1 把System.out.println(num1);註釋掉之後,num2可以正常輸出。
靜態變數和成員變數的區別
靜態變數也叫類變數,成員變數也叫物件變數
A:所屬不同
- 靜態變數屬於類,所以也叫類變數
- 成員變數屬於物件,所以也稱為例項變數
B:記憶體中位置不同
- 靜態變數儲存於方法區的靜態區
- 成員變數儲存於堆記憶體
C:記憶體出現時間不同
- 靜態變數隨著類的載入而載入,隨著類的消失而消失
- 成員變數隨著物件的建立而存在,隨著物件的消失而消失。
D:呼叫不同
- 靜態變數可以通過類名呼叫,也可以通過物件呼叫
- 成員變數只能通過 物件呼叫
tips:
如果一個類中所有方法都是靜態方法,則需要多做一步,建立一個私有構造方法。目的是不讓其他類建立本類物件。