java中static關鍵字主要有兩種作用:
第一:為某特定數據類型或對象分配單一的存儲空間,而與創建對象的個數無關。
第二,實現某個方法或屬性與類而不是對象關聯在一起
簡單來說,在Java語言中,static主要有5中使用情況:成員變量、成員方法、代碼塊,內部類和靜態導包。
基本用法:
- static修飾成員變量:該成員變量屬於類變量,可以通過 ClassName.attributeName 直接引用,而不需要new出類的實例。
- static修飾成員方法:該方法屬於類的方法,可以通過 ClassName.methodName 直接引用,而不需要new出類的實例。
- static修飾代碼塊:僅在類初始化的時候執行一次,且加載順序是嚴格按照類中靜態資源的定義順序來加載的;靜態代碼塊對於定義在它之后的靜態變量,可以賦值,但是不能訪問。;父類代碼塊->子類代碼塊。
- static修飾內部類:static不能修飾普通類,只能修飾內部類,被static修飾的內部類的創建方式: new OuterClass.InnerClass()。
- static導入包:語法“import static java.lang.Math.*”,這樣在類中就可以直接使用Math類中的靜態方法而不需要寫類名,個人認為,在頻繁使用某個類的時候比較方便,但是降低了可讀性。並且不建議導入*
下面分別舉例說明static的各種用法
static修飾成員變量和成員方法
幾個結論:
/** * * Created by ascend on 2017/6/9 13:51. */ public class Test { public static void main(String[] args) throws ClassNotFoundException { Class.forName("net.liebao.test.A"); } } class A { static { System.out.println("A.static initializer"); } public A() { System.out.println("A.A"); } }
輸出:
A.static initializer
結論一:靜態資源屬於類,但是獨立於類,靜態資源在類初始化的時候被加載(早於new),比如通過:Class.forName(“xxx”)可以加載一個類的靜態資源,但是沒有new。

結論二:靜態資源(靜態成員變量,靜態成員方法,下同)不能訪問非靜態資源,非靜態資源是new時候才會產生,所以不能訪問,反之,非靜態資源則可以訪問靜態資源。

結論三:靜態資源可以訪問靜態資源,但是需要注意的是,靜態資源可以為定義在它之后的靜態資源賦值,但是不能訪問定義在它之后的靜態資源
另外一個常見的用途是static實現單例模式
我們都知道,單例模式的特點是該類只能有一個實例,為了實現這一功能,必須隱藏類的構造函數,即把構造函數聲明為private,並提供一個創建對象的方法,由於構造對象被聲明為private,外界無法直接創建這個類型的對象,只能通過該類提供的方法來獲取類的對象,要達到這樣的目的只能把創建對象的方法聲明為static,程序實例如下:
class Singleton { private static Singleton instance = new Singleton(); //私有化構造函數 private Singleton(){} public static Singleton getInstance(){ return instance; } }
上面的單例模式是餓漢模式;
碼字不易,尊重原創,轉載請注明:http://www.cnblogs.com/adeng/p/6971366.html
