java--static關鍵字
阿新 • • 發佈:2020-11-29
package com.xiaoai.test; public class Test_static { public String name; //非靜態變數,每個物件擁有各自的變數,變數不被共享,在記憶體中會建立多個 public static int age; //靜態變數,在記憶體中只會建立一次,所有物件共享,隨著類的載入而存在,隨著類檔案的消失而消失 public static void sttc_1(){ //靜態方法 System.out.println("靜態"); } //靜態方法 public static void static_syso(){ System.out.println("靜態方法中---輸出"); //可以引用靜態變數 age = 12; //--無法引用this // this.name = "xiaoai"; //--無法引用非靜態變數 // name = "nihao"; //--無法引用非靜態方法 // sys1(); //--可以引用靜態方法 sttc_1(); } //非靜態方法 public void sys1(){ System.out.println("非靜態方法中---輸出"); //可以引用this和非靜態變數 this.name = "xiaoai"; //可以引用靜態變數 age = 12; //可以引用靜態方法 sttc_1(); } @Override public String toString() { return "Test_static [name=" + name + ",age=" +age + "]"; } public static void main(String[] args) { Test_static t1 = new Test_static(); t1.sys1();//可引用,物件可以呼叫非靜態方法 t1.static_syso();//可引用,物件可以呼叫靜態方法,但是不推薦 System.out.println(t1); // Test_static.sys1(); //不可引用,類名不可直接呼叫非靜態方法 Test_static.static_syso(); //可引用,類名可直接呼叫靜態方法 System.out.println(t1.name); //可引用,非靜態變數可以被物件.引用 // System.out.println(Test_static.name); //不可引用,非靜態變數無法直接類名.引用 System.out.println(t1.age); // 可引用,靜態變數可以被物件.引用 System.out.println(Test_static.age); //可引用,靜態變數可以直接類名.引用 } }
- 結果截圖
注意
- 靜態函式可直接訪問靜態成員變數,不能直接訪問非靜態成員變數。
靜態函式可使用類名直接呼叫,這時候可能還沒有存在物件,而非靜態成員資料是隨物件的存在而存在。
- 為什麼非靜態函式可直接訪問靜態與非靜態成員變數。靜態函式不能訪問非靜態的成員資料?
非靜態函式只能由物件呼叫,物件存在時,說明非靜態與靜態的資料都已載入好了,所以非靜態函式可隨便呼叫。
靜態函式不能訪問非靜態成員,是因為靜態成員資料隨物件存在而存在,靜態函式可直接由類名呼叫,此時可能沒有物件建立,也就沒有非靜態成員資料,所以靜態函式無法訪問非靜態成員。
*靜態函式只要存在有物件,那麼也可以訪問非靜態的資料,只是不能直接訪問而已。
- 為什麼靜態函式不能使用this或super關鍵字。
因為靜態的函式可用類名呼叫,類名呼叫時可能不存在物件,而this關鍵字代表了一個函式的呼叫者物件,這時就產生了衝突。