【static关键字的作用是什么?它用在什么场景?static关键字深度解析来袭】
2021/9/4/18:37
文章目錄
- 1、一般情況下類的創(chuàng)建
- 2.一般情況下類創(chuàng)建產生的問題
- 2.1、第一種情況如何使用static解決
- 2.2、第二種情況如何使用static解決
- 3.如何調用static修飾的屬性或方法
- 4.靜態(tài)變量、方法和非靜態(tài)變量、方法之間的調用問題
- 5、有關static相關的案例
- 6、靜態(tài)代碼塊
- 7、靜態(tài)代碼塊的作用以及需要注意的細節(jié)
1、一般情況下類的創(chuàng)建
一般情況下,只有當我們執(zhí)行new來創(chuàng)建對象時,才能為數(shù)據(jù)分配存儲空間;其中的方法或者屬性才能被外界調用
2.一般情況下類創(chuàng)建產生的問題
有兩種情況是上面無法解決的。第一種情況就是為某一特定域分配單一的存儲空間(域也可以理解為類屬性),不去考慮究竟要創(chuàng)建多少對象;第二種情況是希望某個方法不與類的任何對象聯(lián)系在一起,也就是即使沒有創(chuàng)建對象,也依舊可以調用這個方法。
2.1、第一種情況如何使用static解決
如上圖所示,nation變量的值永遠為china,創(chuàng)建一兩個對象還可以,如果創(chuàng)建了上百個對象,那么是不是很浪費資源。所以我們可以使用靜態(tài)關鍵字static進行標識該變量,就會變成如下
這就是使用static解決第一種情況(為特定域分配單一的存儲空間),這靜態(tài)區(qū)里的變量隨著類的加載就存在了。在程序的整個運行過程中都存在,當程序結束時,由系統(tǒng)進行清除。(因此由static修飾的屬性也可以成為全局變量)
2.2、第二種情況如何使用static解決
第二種情況我們都遇到過,比如工具類某某Utils,我們一般都是在其他類中直接類名.方法直接調用;
使用static修飾也要注意很多,不能過多的使用static修飾變量或者方法,因為static修飾的變量或方法是屬于類層級的,雖然類的加載而分配存儲空間,因此,你的static方法或者屬性越多,在一開始就會分配固定的內存空間,那么大部分的內存空間分配給了static,剩下的內存空間就不多了,就會造成內存負擔。
public static void main(String[] args) {..........}static方法在不創(chuàng)建對象的情況下就可以通過類名調用,這對于main方法很重要,main方法是運行一個應用的入口點。
3.如何調用static修飾的屬性或方法
1.類名.屬性
class Test{static String num = 1; } Test.num = 2;2.引用.屬性
Test test = new Test(); test.num = 2;由于靜態(tài)修飾的方法或屬性是類層級的,隨著類的加載而出現(xiàn),所以通過類名.方法調用應該都會明白;那么通過引用調用靜態(tài)變量該怎么理解呢?
這是因為static修飾的變量或方法是被類的所有對象共享的,也就是其中任何一個對象都可以調用進行修改。
4.靜態(tài)變量、方法和非靜態(tài)變量、方法之間的調用問題
1.無法在靜態(tài)方法中調用非靜態(tài)變量
這是因為靜態(tài)方法是隨著類的加載而加載,非靜態(tài)變量是new該類對象時而加載;前者出現(xiàn)過早,根本無法加載到其中的非靜態(tài)變量。
2.非靜態(tài)方法可以調用靜態(tài)變量
和第一個類似,靜態(tài)變量首先出現(xiàn),輪到加載非靜態(tài)方法時當然可以得到
3.無法在靜態(tài)方法中調用非靜態(tài)方法,可以在靜態(tài)方法中調用非靜態(tài)方法
總之,只要牢牢記住靜態(tài)和非靜態(tài)的加載順序就很容易理解了。
5、有關static相關的案例
class StaticTest {static int num = 10; } StaticTest test1 = new StaticTest(); StaticTest test2 = new StaticTest(); test1.num++; System.out.println(test2.num);結果:11
只要記住static修飾的變量被類的所有對象共享,那么這一類的題就會很容易就能解決!
6、靜態(tài)代碼塊
首先靜態(tài)代碼塊隨著類的加載而執(zhí)行,而且只運行一次;如果由多個靜態(tài)代碼塊,會按照順序來執(zhí)行。
看下面一段代碼是否在你的意料之中
public class StaticTest {static {System.out.println("靜態(tài)代碼塊執(zhí)行....");System.out.println(country);}private static String country = "china";public static void main(String[] args) {System.out.println(country);} }結果
當我該變順序之后
結果:
所以當在靜態(tài)代碼塊中調用靜態(tài)變量時,一定要將定義靜態(tài)變量的位置放在靜態(tài)代碼塊之前。
7、靜態(tài)代碼塊的作用以及需要注意的細節(jié)
如果一些代碼在項目啟動時就要執(zhí)行并且只需要執(zhí)行一次,那么就可以放到靜態(tài)代碼塊中。比如我們啟動一個項目要加載相應的配置文件,那么我們就可以將其放到靜態(tài)代碼塊中
需要注意的細節(jié)
1.靜態(tài)代碼塊不能出現(xiàn)在任何方法當中
無論是靜態(tài)方法還是非靜態(tài)方法都是如此
對于非靜態(tài)方法,這個很好理解,因為靜態(tài)代碼塊是在類加載之后就能運行的;而非靜態(tài)方法只能在new完對象之后,通過對象才能運行這個方法
對于靜態(tài)方法,在類加載時,雖然靜態(tài)方法也加載了,但是靜態(tài)方法必須通過類名或者對象名才能訪問。也就是說靜態(tài)方法是被動運行的,靜態(tài)代碼塊是主動運行的。
2、靜態(tài)代碼塊不能訪問普通變量
這個應該就不用說了。需要注意的是靜態(tài)代碼塊中能夠訪問靜態(tài)變量,但必須將靜態(tài)變量的位置放在靜態(tài)代碼塊前面。
2021/9/4/22:43
總結
以上是生活随笔為你收集整理的【static关键字的作用是什么?它用在什么场景?static关键字深度解析来袭】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 网站如何接入微信支付功能?微信支付详细教
- 下一篇: 整理Java相关的工具类Utils,持续