在java中,靜態變數指的是被static修飾的類別的變數;靜態變數被所有類別實例物件所共享,在記憶體中只有一個副本,當且僅當在類別初次載入時會被初始化。
本教學操作環境:windows7系統、java8版、DELL G3電腦。
1. JVM運行時資料區域
- #Java堆存放幾乎所有的物件實例,被所有執行緒共享
- 方法區(永久代)與Java堆一樣,是各個執行緒共享的記憶體區域,它用來儲存已經被虛擬機器載入類別的類別資訊、常數、靜態變數(static variable)等
2. static變數
被static修飾的類別的變量,也稱為靜態變數。 非靜態變數也稱為實例變數
靜態變數和實例變數的差異是:
- 靜態變數被所有類別實例物件所共享,在記憶體中只有一個副本,當且僅當在類別初次載入時會被初始化。
- 實例變數是實例物件所擁有的,在創建物件的時候被初始化,存在多個副本,各個實例物件擁有的副本互不影響
public class MyStatic { // 静态变量 private static int index = 0; // 实例变量 private int count = 0; public void inc() { index++; count++; } public String get() { return "静态变量index = " + index + ", 实例变量count = " + count; } }
/** * index是静态变量 * count是实例变量 * */ public class StaticVariableTest { public static void main(String[] args) { MyStatic myStatic1 = new MyStatic(); MyStatic myStatic2 = new MyStatic(); MyStatic myStatic3 = new MyStatic(); myStatic1.inc(); System.out.println("myStatic1的index、count增加1:"); System.out.println("myStatic1的" + myStatic1.get()); System.out.println("myStatic2的" + myStatic2.get()); System.out.println("myStatic3的" + myStatic3.get() + "\n"); myStatic2.inc(); System.out.println("myStatic2的index、count增加1:"); System.out.println("myStatic1的" + myStatic1.get()); System.out.println("myStatic2的" + myStatic2.get()); System.out.println("myStatic3的" + myStatic3.get() + "\n"); myStatic3.inc(); System.out.println("myStatic3的index、count增加1:"); System.out.println("myStatic1的" + myStatic1.get()); System.out.println("myStatic2的" + myStatic2.get()); System.out.println("myStatic3的" + myStatic3.get()); } }
運行結果:
可以看出:
- 靜態變數index是多個物件實例共享的
- 實例物件count是多個物件實例私有的
myStatic1的index、count增加1: myStatic1的静态变量index = 1, 实例变量count = 1 myStatic2的静态变量index = 1, 实例变量count = 0 myStatic3的静态变量index = 1, 实例变量count = 0 myStatic2的index、count增加1: myStatic1的静态变量index = 2, 实例变量count = 1 myStatic2的静态变量index = 2, 实例变量count = 1 myStatic3的静态变量index = 2, 实例变量count = 0 myStatic3的index、count增加1: myStatic1的静态变量index = 3, 实例变量count = 1 myStatic2的静态变量index = 3, 实例变量count = 1 myStatic3的静态变量index = 3, 实例变量count = 1
3. static變數誤解
3.1 static無法作用於局部變量
- C/C 中static是可以作用域局部變數的
- Java中static是不允許用來修飾局部變數。
不要問為什麼,這是Java語法的規定。
3.2 this可以存取靜態變數
靜態變數雖然獨立於對象,但是不代表不可以透過物件實例去訪問,所有的靜態方法和靜態變數都可以透過物件實例存取(只要存取權限足夠)。
this表示目前物件實例,而static靜態變數被所有物件所共享,所以可以透過this存取靜態變數
public class StaticVariable { public static int index = 1; public static void main(String[] args) { StaticVariable staticVariable = new StaticVariable(); staticVariable.get(); } private void get() { int index = 2; System.out.println(this.index); } }
運行結果:
3.3 static不會改變類別成員的存取權
Java中的static關鍵字不會影響到變數或方法的作用域。在Java中能夠影響到存取權限的只有private、public、protected(包括包存取權)這幾個關鍵字
public class MyStatic { public static int index1 = 1; // 静态变量 private static int index2 = 0; } public class StaticVariableTest { public static void main(String[] args) { System.out.println(MyStatic.index1); System.out.println(MyStatic.index2); } }
相關影片教學推薦: Java影片教學
以上是java靜態變數是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!
陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章
R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 個月前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
1 個月前By尊渡假赌尊渡假赌尊渡假赌
刺客信條陰影:貝殼謎語解決方案
2 週前ByDDD
R.E.P.O.如果您聽不到任何人,如何修復音頻
1 個月前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.聊天命令以及如何使用它們
1 個月前By尊渡假赌尊渡假赌尊渡假赌

熱工具

MinGW - Minimalist GNU for Windows
這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

EditPlus 中文破解版
體積小,語法高亮,不支援程式碼提示功能

SublimeText3漢化版
中文版,非常好用

SublimeText3 Linux新版
SublimeText3 Linux最新版

禪工作室 13.0.1
強大的PHP整合開發環境