Java学习笔记四:static关键字
1.static表示什么?
static表示“全局”或者“靜態”的意思。在Java中沒有全局變量的概念,static 可以簡單的理解為全局的,獨立的一個功能。
(1)當我們在使用 static 修飾成員變量或者成員方法的時候,通常會在Java內存中為這些變量或者方法指定了一塊獨立的區域(這塊區域可能在棧中,也有可能在堆中)。
(2)如果靜態的變量或方法在不出其作用域的情況下,其 引用句柄是不會發生改變的。
(3)這塊區域是內存共享的,它的引用都指向同一個位置,就是說如果我們修改引用指向的的值,這個值就被改變了;當其他對象使用這個值時,就是修改后的值。
代碼:
public class Lesson_02_Static {public static int staticFiled = 0;public int notStaticFiled = 0;static{int staticBolckFiled = 0;}public Lesson_02_Static(){staticFiled++;notStaticFiled++;}public void print(){System.out.println("StaticFiled:" + staticFiled + ", NotStaticFiled:" + notStaticFiled);}public static void main(String[] args){Lesson_02_Static ls1 = new Lesson_02_Static();ls1.print();Lesson_02_Static ls2 = new Lesson_02_Static();ls2.print();} }輸出結果:
StaticFiled:1, NotStaticFiled:1 StaticFiled:2, NotStaticFiled:1?
它不依賴類特定的實例,被類的所有實例共享。只要這個類被加載,Java虛擬機就能根據類名在運行時數據區的方法區內定找到他們。
因此,static對象可以在它的任何對象創建之前訪問,無需引用任何對象
?
2.static使用場景?
1.修飾靜態變量(注意:不能是局部變量)。如:
public static int staticFiled = 0;說明:
靜態變量:被static修飾的變量,在內存中只有一份,在加載類的過程中完成靜態變量的內存分配,不會隨著類的實例化和增加。
實例變量:被static修飾的變量,當實例化類時,可以在內存中存在多個拷貝。
?
2.靜態方法。如:
public static void main(String[] args){Lesson_02_Static ls1 = new Lesson_02_Static();ls1.print();Lesson_02_Static ls2 = new Lesson_02_Static();ls2.print();}說明:
(1)靜態方法中不能用this和super關鍵字,不能直接訪問所屬類的實例變量和實例方法。
靜態方法中調用非靜態方法提示錯誤,編譯不通過;
非靜態方法可以調用靜態方法。
(2)因為static方法獨立于任何實例,因此static方法必須被實現,而不能是抽象的abstract。
?
3.靜態塊。如:
static{int staticBolckFiled = 0;}說明:
靜態塊位置可以隨意放置,初始化順序時不會隨著位置變化而變化。一般情況下,會放在成員變量結束,類方法的開始的地方,方便理解。
?
3.static初始化
(1)初始化順序是從類的開始到結尾查找static塊,并且比類自身構造函數要早。
class StaticInit {public static int staticFiled = 0;public int notStaticFiled = 0;static{System.out.println("First Init");}public StaticInit(){System.out.println("structure Init");}public static void main(String[] args){new StaticInit();}static{System.out.println("Second Init");} }輸出結果:
First Init Second Init structure Init(2)static變量的初始化僅能一次
class StaticInt2 {T1 t1 = new T1(2);T1 t3 = new T1(4);T1 t2 = new T1(3);public StaticInt2(){System.out.println("t1: " + t1.t);System.out.println("t2: " + t2.t);System.out.println("t3: " + t3.t);}public static void main(String args[]){new StaticInt2();} }class T1 {static int t = 1;T1(int b){t = b;} }輸出結果:
t1: 3 t2: 3 t3: 3t的值在最后被設置為3,說明靜態變量不會根據new 實例化而初始化(即不會在new時初始化值1).
說明:
在實際debug過程中,靜態塊中的方法先執行,然后在執行構造函數,最后執行成員變量的初始化。
?
總結:
static 指定的是一個固定的位置,在內存中只有一份;
在初始化時,優先執行static塊。
轉載于:https://www.cnblogs.com/winlrou/p/3997153.html
總結
以上是生活随笔為你收集整理的Java学习笔记四:static关键字的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 黑客与画家 part1 版权声明 par
- 下一篇: 一些常被你忽略的CSS小知识