Java深入講解static操作符
前言
這篇文章主要是從類中static修飾的成員變量,static修飾的成員方法這兩個方面來講解static,static成員變量的初始化會在代碼塊中講解
static修飾成員變量
在Java中,被static修飾的成員,稱之為靜態(tài)成員,也可以稱為類成員,其不屬于某個具體的對象,是所有對象所共享的。
舉個例子:
class Animal{ String name; int age; static String type = "Dog"; //構(gòu)造方法 public Animal(String name,int age){ this.name = name; this.age = age; } public void SetAnimal(){ System.out.println(this.name+" "+this.age+" "+type); } } public class Test { public static void main(String[] args) { Animal animal1 = new Animal("小白",1); Animal animal2 = new Animal("大黃",2); animal1.SetAnimal(); animal2.SetAnimal(); } }
運行結(jié)果如下圖所以:
我定義了一個動物類,成員變量有名字和年齡,還有一個被static修飾的變量type(種類),以及一個構(gòu)造方法。我在主函數(shù)中創(chuàng)建了兩個對象,對象的種類都是狗。并用構(gòu)造方法為我創(chuàng)建的兩個變量進行賦值。而種類type是我實現(xiàn)在定義定義變量的時候就進行初始化的,這種初始化變量叫做就地初始化。
注意: s t a t i c 修 飾 的 成 員 變 量 不 是 一 定 要 就 地 初 始 化 \color{#FF0000}{static修飾的成員變量不是一定要就地初始化} static修飾的成員變量不是一定要就地初始化
在我們用完static修飾完type之后,type就是靜態(tài)成員變量,靜態(tài)成員變量也叫類變量。沒被static修飾的成員變量叫做普通成員變量。靜態(tài)成員變量有個特點就是 不 屬 于 對 象 \color{#FF0000}{不屬于對象} 不屬于對象。
什么是不屬于對象?
也就是說static修飾過的變量,是不依賴對象的。舉個例子:
class Animal{ String name; int age; static String type = "Dog"; //構(gòu)造方法 public Animal(String name,int age){ this.name = name; this.age = age; } public void SetAnimal(){ System.out.println(this.name+" "+this.age+" "+type); } } public class Test { public static void main(String[] args) { Animal animal1 = new Animal("小白",1); Animal animal2 = new Animal("大黃",2); System.out.println(animal1.type); System.out.println(Animal.type); } }
仍然是上面的代碼,我們都知道 對象名.成員變量可以訪問成員變量,而訪問static修飾的成員變量不需要創(chuàng)建對象,可以直接通過 類名.靜態(tài)成員變量進行訪問。運行結(jié)果結(jié)果如圖所示:
兩個打印的結(jié)果都是Dog,所以static修飾的變量不屬于對象,因為不需要創(chuàng)建對象也可以訪問。如果大家是想訪問static修飾的變量,建議大家就直接用類名.靜態(tài)成員變量就可以了,不建議使用對象.變量名進行訪問。
靜態(tài)成員變量的特性
- 不屬于某個具體的對象,是類的屬性,所有對象共享的,不存儲在某個對象的空間中
- 既可以通過對象訪問,也可以通過類名訪問,但一般更推薦使用類名訪問
- 類變量存儲在方法區(qū)當中
- 生命周期伴隨類的一生(即:隨類的加載而創(chuàng)建,隨類的卸載而銷毀)
- 可以不初始化,如果就地初始化了如果沒被final修飾也是可以通過方法進行修改的
static修飾的成員方法
static修飾的成員方法和成員變量一樣 ,不屬于對象。static修飾的成員方法也叫類方法。也就是說,如果我想調(diào)用static修飾的成員方法直接用 類名.成員方法 就可以了。舉個例子:
class Animal{ String name; int age; static String type = "Dog"; public static void staticFunc(){ System.out.println("static修飾的成員方法"); } } public class Test { public static void main(String[] args) { Animal animal1 = new Animal("小白",1); Animal animal2 = new Animal("大黃",2); Animal.staticFunc(); } }
我們平時寫的方法一般都是static修飾的,為什么要用static修飾我相信你的心里應(yīng)該也有答案了。
因為static修飾的方法不屬于對象,不需要創(chuàng)建對象就可以直接使用。你也可以把static修飾的成員方法看成我們平時寫的方法,只不過這是個在不同的類里面定義的一個成員方法罷了。
static修飾的成員方法是不依賴于對象的方法,所以在static修飾的方法中,不能直接訪問普通的成員變量,因為普通的成員方法是需要依賴對象的。如果不創(chuàng)建對象,直接在static中修飾的成員方法中訪問普通成員變量是不可以的。如果想要在static中修飾的成員方法中訪問成員變量,有兩種方法,第一種是直接在static修飾的成員方法中創(chuàng)建一個對象,這樣就可以訪問了。第二種是把創(chuàng)建好的對象作為static修飾成員方法的形參,這樣也可以直接訪問。
靜態(tài)方法特性
- 不屬于某個具體的對象,是類方法
- 可以通過對象調(diào)用,也可以通過類名.靜態(tài)方法名(…)方式調(diào)用,更推薦使用后者
- 不能在靜態(tài)方法中訪問任何非靜態(tài)成員變量
到此這篇關(guān)于Java深入講解static操作符的文章就介紹到這了,更多相關(guān)Java static內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
解決異常處理問題:getReader()?has?already?been?called?for?this
這篇文章主要介紹了解決異常處理:getReader()?has?already?been?called?for?this問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-01-01Spring中的注解@Value("#{}")與@Value("${}")的區(qū)別
這篇文章主要介紹了Spring中的注解@Value(“#{}“)與@Value(“${}“)的區(qū)別到底是什么,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-06-06Java面向?qū)ο笾^承、構(gòu)造方法、重寫、重載
本章具體介紹了什么是構(gòu)造方法、繼承、重寫、重載以及創(chuàng)建方法,整篇文章用老司機和人類來舉例,圖解穿插代碼案例,需要的朋友可以參考下2023-03-03springboot中RestTemplate發(fā)送HTTP請求的實現(xiàn)示例
RestTemplate是一個 spring-web 提供的執(zhí)行HTTP請求的同步阻塞式工具類,本文就來介紹一下RestTemplate發(fā)送HTTP請求,具有一定的參考價值,感興趣的可以了解一下2024-03-03MyBatis中resultMap和resultType的區(qū)別詳解
這篇文章主要介紹了MyBatis中resultMap和resultType的區(qū)別詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-07-07ArrayList和HashMap如何自己實現(xiàn)實例詳解
這篇文章主要介紹了 ArrayList和HashMap如何自己實現(xiàn)的相關(guān)資料,需要的朋友可以參考下2016-12-12Java中BigDecimal比較大小的3種方法(??compareTo()、??equals()??和??compar
這篇文章主要給大家介紹了關(guān)于Java中BigDecimal比較大小的3種方法,方法分別是??compareTo()、??equals()??和??compareTo()??,在Java中使用BigDecimal類來進行精確的數(shù)值計算,需要的朋友可以參考下2023-11-11