本篇淺析java中static的用法,主要五個方面:靜態成員變數,靜態方法,靜態塊,靜態內部類,靜態導包。 首先還是一張表格說一下靜態對象和非靜態對象的區別: 1 靜態變數,靜態方法,靜態塊 靜態對象,靜態方法都是在原對象和方法上加上static關鍵字修飾,表示類可以直接調用這些,而不需要實例化後再 ...
本篇淺析java中static的用法,主要五個方面:靜態成員變數,靜態方法,靜態塊,靜態內部類,靜態導包。
首先還是一張表格說一下靜態對象和非靜態對象的區別:
靜態對象 | 非靜態對象 | |
歸屬 | 類共同具有 | 類的各個實例獨立擁有 |
記憶體分配 | 記憶體空間上固定的 | 附屬類分配 |
分配空間順序 | 優先分配靜態對象空間 | 優先分配靜態對象空間,初始化也一樣 |
1 靜態變數,靜態方法,靜態塊
靜態對象,靜態方法都是在原對象和方法上加上static關鍵字修飾,表示類可以直接調用這些,而不需要實例化後再調用。具有的好處是: 1--靜態對象的數據是全局唯一的,一改都改,可以保證數據的唯一性 2--引用方便,直接用類名.方法(屬性)就可以了,不用再get和set 當然靜態方法(變數,塊)也有相應的限制: 1--不能調用其他非靜態方法(只能調用static方法) 2--只能訪問static數據 3--不能以任何方式引用this或super 示例代碼:public class StaticExercise { public static String sky="jeyson"; public static String getMySky(String sky){ return sky; } static { System.out.println("這是靜態塊中的內容--"); System.out.println("靜態塊:"+getMySky(sky)); } /** * ***靜態對象好處: * 1--靜態對象的數據是全局唯一的,一改都改,可以保證數據唯一。 * 2--引用方便,直接類名.方法就行了,不用set和get * ***分配空間順序: * 先分配靜態對象空間再分配非靜態。初始化順序也是這樣 * ***static final 修飾的成員變數和成員方法可以理解為全局變數(java中沒有全局變數概念) * ***靜態對象,方法,塊的限制: * 1--只能調用其他的static方法 * 2--只能訪問static數據 * 3--不能以任何方式引用this或super * 靜態對象測試 */ @Test public void testStatic1(){ System.out.println(sky); System.out.println("-----------------"); System.out.println(getMySky(sky)); System.out.println("-----------------"); System.out.println(StaticTest.getSms()); } }
2 靜態內部類
當一個類跟另一個類(外部類)有緊密的聯繫,一般只有用到外部類的時候才會用該類的話,可以將該類作為靜態的內部類。這樣就可以隨著類的載入而直接產生。不用再可以實例化。 使用方法:隨類一同被載入,調用直接外部類.內部類.靜態對象(方法) 示例代碼:class StaticTest{ public static String sms="to my sky"; public static String getSms(){ return sms; } /** * 靜態內部類 * ***使用場景: * 內部類跟外部類聯繫緊密,一般只有用到外部類的時候才會用到這個類 * ***使用 * 隨類一同被載入,直接外部類.內部類.靜態對象(方法) */ static class InnerStatic{ public static final String MYSKY="MY FINAL SKY"; } }
@Test public void testStatic2(){ System.out.println(StaticTest.InnerStatic.MYSKY); }
2 靜態導包
如果要用的靜態方法所在的類跟當前類不在同一個包下,可以使用靜態導包。這樣你想要用的靜態方法或變數就相當於在該類中直接可見,無需再類名.靜態變數的方式調用。 使用方法: import static 包名.類名.靜態成員變數(方法) 好處: 被導入的靜態變數和方法在該類中直接可見,直接用 壞處: 一定程度上降低了代碼的可讀性 代碼示例:public class MyStaticImportTest { public static final int number=55; public static void getMyWords(){ System.out.println("hello ,這是一個靜態導包的測試"); } }
import static com.generic.MyStaticImportTest.number; import static com.generic.MyStaticImportTest.getMyWords; /** * @Description: * 靜態 */ public class StaticExercise { /** * 靜態導包 * ***使用方法: * 直接靜態導入相應的變數和方法:(import static 包名.類名.靜態成員變數(方法) * import static com.generic.MyStaticImportTest.number; * import static com.generic.MyStaticImportTest.getMyWords; * *** 好處: * 被導入的靜態方法和變數在這個類中直接可見,無需再給出類名 * *** 壞處 * 一定程度上降低了代碼的可讀性 */ @Test public void testStatic3(){ //靜態導入後可以直接用 int myNumber=number; getMyWords(); } }