一、 static代表着什麼
在Java中并不存在全局變量的概念,但是我們可以通過static來實作一個“僞全局”的概念,在Java中static表示“全局”或者“靜态”的意思,用來修飾成員變量和成員方法,當然也可以修飾代碼塊。
Java把記憶體分為棧記憶體和堆記憶體,其中棧記憶體用來存放一些基本類型的變量、數組和對象的引用,堆記憶體主要存放一些對象。在JVM加載一個類的時候,若該類存在static修飾的成員變量和成員方法,則會為這些成員變量和成員方法在固定的位置開辟一個固定大小的記憶體區域,有了這些“固定”的特性,那麼JVM就可以非常友善地通路他們。同時如果靜态的成員變量和成員方法不出作用域的話,它們的句柄都會保持不變。同時static所蘊含“靜态”的概念表示着它是不可恢複的,即在那個地方,你修改了,他是不會變回原樣的,你清理了,他就不會回來了。
同時被static修飾的成員變量和成員方法是獨立于該類的,它不依賴于某個特定的執行個體變量,也就是說它被該類的所有執行個體共享。所有執行個體的引用都指向同一個地方,任何一個執行個體對其的修改都會導緻其他執行個體的變化。
public class User {
private static int userNumber = 0 ;
public User(){
userNumber ++;
}
public static void main(String[] args) {
User user1 = new User();
User user2 = new User();
System.out.println("user1 userNumber:" + User.userNumber);
System.out.println("user2 userNumber:" + User.userNumber);
}
}
------------
Output:
user1 userNumber:2
user2 userNumber:2
二、 怎麼使用static
static可以用于修飾成員變量和成員方法,我們将其稱之為靜态變量和靜态方法,直接通過類名來進行通路。
ClassName.propertyName
ClassName.methodName(……)
Static修飾的代碼塊表示靜态代碼塊,當JVM裝載類的時候,就會執行這塊代碼,其用處非常大。(對于代碼塊的使用這幾天介紹,敬請關注)
2.1、static變量
static修飾的變量我們稱之為靜态變量,沒有用static修飾的變量稱之為執行個體變量,他們兩者的差別是:
靜态變量是随着類加載時被完成初始化的,它在記憶體中僅有一個,且JVM也隻會為它配置設定一次記憶體,同時類所有的執行個體都共享靜态變量,可以直接通過類名來通路它。
但是執行個體變量則不同,它是伴随着執行個體的,每建立一個執行個體就會産生一個執行個體變量,它與該執行個體同生共死。
是以我們一般在這兩種情況下使用靜态變量:對象之間共享資料、通路友善。
2.2、static方法
static修飾的方法我們稱之為靜态方法,我們通過類名對其進行直接調用。由于他在類加載的時候就存在了,它不依賴于任何執行個體,是以static方法必須實作,也就是說他不能是抽象方法abstract。
Static方法是類中的一種特殊方法,我們隻有在真正需要他們的時候才會将方法聲明為static。如Math類的所有方法都是靜态static的。
2.3、static代碼塊
被static修飾的代碼塊,我們稱之為靜态代碼塊,靜态代碼塊會随着類的加載一塊執行,而且他可以随意放,可以存在于該了的任何地方。
三、 Static的局限
Static确實是存在諸多的作用,但是它也存在一些缺陷。
1、它隻能調用static變量。
2、它隻能調用static方法。
3、不能以任何形式引用this、super。
4、static變量在定義時必須要進行初始化,且初始化時間要早于非靜态變量。
總結:無論是變量,方法,還是代碼塊,隻要用static修飾,就是在類被加載時就已經"準備好了",也就是可以被使用或者已經被執行,都可以脫離對象而執行。反之,如果沒有static,則必須要依賴于對象執行個體。
PS:如果你覺得文章對你有所幫助,别忘了推薦或者分享,因為有你的支援,才是我續寫下篇的動力和源泉!
-
作者:chenssy。一個專注于【死磕 Java】系列創作的男人
出處:https://www.cnblogs.com/chenssy/p/3386721.html
作者個人網站:https://www.cmsblogs.com/。專注于 Java 優質系列文章分享,提供一站式 Java 學習資料
目前死磕系列包括:
1. 【死磕 Java 并發】:https://www.cmsblogs.com/category/1391296887813967872(已完成)
2.【死磕 Spring 之 IOC】:https://www.cmsblogs.com/category/1391374860344758272(已完成)
3.【死磕 Redis】:https://www.cmsblogs.com/category/1391389927996002304(已完成)
4.【死磕 Java 基礎】:https://www.cmsblogs.com/category/1411518540095295488
5.【死磕 NIO】:https://www.cmsblogs.com/article/1435620402348036096
本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,否則保留追究法律責任的權利。