Java中static使用方法一:Java中的static使用之靜態變數;二:Java中的static使用之靜態方法;三:Java中的static使用之靜態初始化快; ...
Java中static使用方法
一:Java中的static使用之靜態變數;
我們都知道,我們可以基於一個類創建多個該類的對象,每個對象都擁有自己的成員,互相獨立。然而在某些時候,我們更希望該類所有的對象共用同一個成員。此時就是 static 大顯身手的時候了!!
Java 中被 static 修飾的成員稱為靜態成員或類成員。它屬於整個類所有,而不是某個對象所有,即被類的所有對象所共用。靜態成員可以使用類名直接訪問,也可以使用對象名進行訪問。當然,鑒於他作用的特殊性更推薦用類名訪問~~
使用 static 可以修飾變數、方法和代碼塊。
我們先認識一下靜態變數。
例如,我們在類中定義了一個 靜態變數 hobby
代碼如下所示:
public class HelloWorld { //static修飾的變數為靜態變數,所有的類的對象共用hobby static String hobby ="cnblogs"; public static void main(String[]args){ //靜態變數可以直接使用類名來訪問,無需創建類的對象 System.out.println("通過類名訪問hobby:"+HelloWorld.hobby); //創建類的對象 HelloWorld hello = new HelloWorld(); //使用對象名來訪問靜態變數 System.out.println("通過對象名訪問hobby:"+hello.hobby); //使用對象名的形式修改靜態變數的值 hello.hobby="博客園"; //再次使用類名訪問靜態變數,值已被修改 System.out.println("通過類名訪問hobby:"+HelloWorld.hobby); } }
運行結果為:
註:靜態成員屬於整個類,當系統第一次使用該類時,就會為其分配記憶體空間直到該類被卸載才會進行資源回收!
二:Java中的static使用之靜態方法;
與靜態變數一樣,我們也可以使用 static 修飾方法,稱為靜態方法或類方法。其實之前我們一直寫的 main 方法就是靜態方法。靜態方法的使用如:
public class HelloWorld { //使用static關鍵字聲明靜態方法 public static void print(){ System.out.println("歡迎您:博客園!"); } public static void main(String[]args){ //直接使用類名調用靜態方法 HelloWorld.print(); //也可以通過對象名調用 HelloWorld demo = new HelloWorld(); demo.print(); } }
運行結果為:
註:1、 靜態方法中可以直接調用同類中的靜態成員,但不能直接調用非靜態成員。如:
如果希望在靜態方法中調用非靜態變數,可以通過創建類的對象,然後通過對象來訪問非靜態變數。如:
2、 在普通成員方法中,則可以直接訪問同類的非靜態變數和靜態變數,如下所示:
3、 靜態方法中不能直接調用非靜態方法,需要通過對象來訪問非靜態方法。如:
代碼如下:
public class HelloWorld { String name = "博客園";//非靜態變數name static String hobby = "cnblogs";//靜態變數hobby //普通成員方法 public void show(){ System.out.println("welcome to cnblogs"); } //靜態方法 public static void print(){ System.out.println("歡迎來到博客園"); } public static void main(String[]args){ //普通成員方法必須通過對象來調用 HelloWorld hello = new HelloWorld(); hello.show(); //可以直接調用靜態方法 print(); } }
三:Java中的static使用之靜態初始化快;
Java 中可以通過初始化塊進行數據賦值。如:
在類的聲明中,可以包含多個初始化塊,當創建類的實例時,就會依次執行這些代碼塊。如果使用 static 修飾初始化塊,就稱為靜態初始化塊。
需要特別註意:靜態初始化塊只在類載入時執行,且只會執行一次,同時靜態初始化塊只能給靜態變數賦值,不能初始化普通的成員變數。
我們來看一段代碼:
public class HelloWorld { int num1;//聲明變數num1 int num2;//聲明變數num2 static int num3;//聲明靜態變數num3 public HelloWorld(){ num1 = 91; System.out.println("通過構造方法為變數num賦值"); } {//初始化快 num2 = 74; System.out.println("通過初始化塊為變數num2賦值"); } static{//靜態初始化快 num3 = 83; System.out.println("通過靜態初始化塊為靜態變數num3賦值"); }public static void main(String[]args){ HelloWorld hello = new HelloWorld();//創建類的對象hello System.out.println("num1:"+hello.num1); System.out.println("num2:"+hello.num2); System.out.println("num3:"+num3); HelloWorld hello2 = new HelloWorld();//創建類的對象hello2 } }
運行結果為:
通過輸出結果,我們可以看到,程式運行時靜態初始化塊最先被執行,然後執行普通初始化塊,最後才執行構造方法。由於靜態初始化塊只在類載入時執行一次,所以當再次創建對象 hello2 時並未執行靜態初始化塊。