Java中靜態跟非靜態的區別總結
版權宣告:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/qq_34173549/article/details/79926923
一.靜態變數跟例項變數的區別:
1.靜態變數:由static修飾,在JVM中,靜態變數的載入順序在物件之前,因此靜態變數不依附於物件存在,可以在不例項化類的情況下直接使用靜態變數,如下程式碼所示。
public class StaticTest {
static int a = 13;
int b = 14;
public static void main(String[] args) {
int c = StaticTest.a;
System.out.println(c);
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
靜態變數屬於類,不屬於類中任何一個物件,因此靜態變數又叫做類變數,一個類不管建立多少個物件(物件是類的一個例項),靜態變數在記憶體中有且僅有一個。
2.例項變數:必須依附於物件存在,只有例項化類後才可以使用此類中的例項變數。
public class StaticTest {
static int a = 13;
int b = 14;
public static void main(String[] args) {
int d = new StaticTest().b;
System.out.println(d);
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
二.靜態方法跟例項方法的區別:
1.靜態方法:方法用static關鍵字修飾,靜態方法與靜態成員變數一樣,屬於類本身,在類裝載的時候被裝載到記憶體,不自動進行銷燬,會一直存在於記憶體中,直到JVM關閉。使用時也是不需要例項化類,能夠直接使用。靜態方法無法被重寫。
public class StaticTest {
public static void MyStatic(){
System.out.println("這是StaticTest的一個靜態方法");
}
public static void main(String[] args) {
StaticTest.MyStatic();
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
需要注意的是:在靜態方法中只能訪問類中的靜態成員跟靜態方法,不能直接訪問類中的例項變數跟例項方法,原因是靜態方法在JVM中的載入順序也在物件之前,直接使用例項變數跟例項方法的話,可能例項變數跟例項方法所依附的物件並沒有被建立,會導致無法找到所使用的例項變數跟例項方法。
要想使用例項變數跟例項方法可以採用如下方法:在靜態方法中建立例項變數和例項方法所在的物件,通過這個物件來使用例項變數跟例項方法。如程式碼所示:
public class StaticTest {
int b = 14;
public void MyMethod(){
System.out.println("這是StaticTest的一個例項方法");
}
public static void MyStatic(){
StaticTest st = new StaticTest();
int e = st.b;
st.MyMethod();
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
2.例項化方法:屬於例項物件,例項化後才會分配記憶體,必須通過類的例項來引用。不會常駐記憶體,當例項物件被JVM 回收之後,也跟著消失。
public class StaticTest {
public void MyMethod(){
System.out.println("這是StaticTest的一個例項方法");
}
public static void main(String[] args) {
new StaticTest().MyMethod();
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
附加:
1.執行緒安全:靜態方法是共享程式碼段,靜態變數是共享資料段。既然是“共享”就有併發的問題。非靜態方法是針對確定的一個物件的,所以不會存線上程安全的問題。
2.如果靜態方法在系統中定義太多,會佔用大量的資源,最後造成記憶體溢位,所以靜態方法不能濫用。
相關文章
- 靜態內部類和非靜態內部類區別
- 偽靜態、靜態和動態的區別
- 區域性變數和全域性變數(靜態和非靜態)區別變數
- c#物件導向- 靜態成員和非靜態成員的區別C#物件
- 網站偽靜態和純靜態區別網站
- net 靜態方法與非靜態方法
- java中的靜態繫結與動態繫結Java
- 靜態變數和非靜態變數變數
- 動態連結庫和靜態連結庫的區別
- .NET偽靜態使用以及和純靜態的區別
- 靜態SDRAM和動態SDRAM的區別
- 動態庫和靜態庫的區別
- ios 開發中 動態庫 與靜態庫的區別iOS
- 動態IP與靜態IP的主要區別
- ios靜態庫與動態庫的區別iOS
- Java中的靜態代理和動態代理Java
- Hive中靜態分割槽和動態分割槽總結Hive
- Win32動態連結庫與靜態連結庫的區別Win32
- 注意!非靜態內部類和非靜態方法的匿名類的this$0屬性
- 靜態網頁與動態網頁的區別網頁
- 動態圖和靜態圖的程式碼區別
- 靜態網頁和動態網頁的區別網頁
- 動態分佈與靜態分佈的區別
- Effective Java 3rd 條目24 靜態成員類優於非靜態Java
- apache動態編譯/靜態編譯區別Apache編譯
- Java靜態代理Java
- java繼承-靜態繫結和動態繫結Java繼承
- 【知識分享】動態ip和靜態ip的區別
- DELPHI中的靜態虛擬及動態方法函式的區別。 (轉)函式
- Vue中的靜態型別檢查Vue型別
- JAVA 靜態代理 & 動態代理Java
- 動態IP和靜態IP有什麼區別?
- PHP 中 static 靜態屬性和靜態方法的呼叫PHP
- linux下靜態連結庫和動態連結庫的區別有哪些Linux
- Java的方法靜態方法Java
- Java中的靜態代理模式詳解Java模式
- 靜態註冊和動態註冊總結(zt)
- listener靜態註冊和動態註冊總結