## **static基本概念:**
static 修飾符能夠與變量、方法一起使用,表示是“靜態”的。
靜態變量和靜態方法能夠通過類名來訪問,不需要創建一個類的對象來訪問該類的靜態成員,所以static修飾的成員又稱作類變量和類方法。靜態變量與實例變量不同,實例變量總是通過對象來訪問,因為它們的值在對象和對象之間有所不同。
請看下面的例子:
```
public class day09static{
static int i = 10;
int j;
day09static(){
this.j = 20;
}
public static void main(String [] args){
System.out.println("類變量i = " + day09static.i);
day09static de = new day09static();
System.out.println("實例變量j = " + de.j);
}
}
```
**運行結果:**
類變量i = 10
實例變量j = 20
<br>
<br>
## **static 的內存分配**
靜態變量屬于類,不屬于任何獨立的對象,所以無需創建類的實例就可以訪問靜態變量。之所以會產生這樣的結果,是因為編譯器只為整個類創建了一個靜態變量的副本,也就是只分配一個內存空間,雖然有多個實例,但這些實例共享該內存。實例變量則不同,每創建一個對象,都會分配一次內存空間,不同變量的內存相互獨立,互不影響,改變 a 對象的實例變量不會影響 b 對象。
```
public class day10static{
static int i;
int j;
public static void main(String [] args){
day10static obj1 = new day10static();
obj1.i = 10;
obj1.j = 20;
day10static obj2 = new day10static();
System.out.println("obj1.i = " + obj1.i + " obj1.j = " + obj1.j);
System.out.println("obj2.i = " + obj2.i + " obj2.j = " + obj2.j);
}
}
```
**運行結果:**
obj1.i = 10 obj1.j = 20
obj2.i = 10 obj2.j = 0
:-: 
注意:static 的變量是在類裝載的時候就會被初始化。也就是說,只要類被裝載,不管你是否使用了這個static 變量,它都會被初始化。
小結:類變量(class variables)用關鍵字 static 修飾,在類加載的時候,分配類變量的內存,以后再生成類的實例對象時,將共享這塊內存(類變量),任何一個對象對類變量的修改,都會影響其它對象。外部有兩種訪問方式:通過對象來訪問或通過類名來訪問。
## 靜態方法
靜態方法是一種不能向對象實施操作的方法。例如,Math 類的 pow() 方法就是一個靜態方法,語法為 Math.pow(x, a),用來計算 x 的 a 次冪,在使用時無需創建任何 Math 對象。
因為靜態方法不能操作對象,所以不能在靜態方法中訪問實例變量,只能訪問自身類的靜態變量。
以下情形可以使用靜態方法:
* 一個方法不需要訪問對象狀態,其所需參數都是通過顯式參數提供(例如 Math.pow())。
* 一個方法只需要訪問類的靜態變量。
讀者肯定注意到,main() 也是一個靜態方法,不對任何對象進行操作。實際上,在程序啟動時還沒有任何對象,main() 方法是程序的入口,將被執行并創建程序所需的對象。
關于靜態變量和靜態方法的總結:
* 一個類的靜態方法只能訪問靜態變量;
* 一個類的靜態方法不能夠直接調用非靜態方法;
* 如訪問控制權限允許,靜態變量和靜態方法也可以通過對象來訪問,但是不被推薦;
* 靜態方法中不存在當前對象,因而不能使用?this,當然也不能使用?super;
* 靜態方法不能被非靜態方法覆蓋;
* 構造方法不允許聲明為 static 的;
* 局部變量不能使用static修飾。
- Java自動化測試
- 第一章:Java:基礎內容
- 1.1:Java:Hello Word
- 1.2:Java:熱身
- 1.3:Java:注釋
- 1.4:Java:標識符
- 1.5:Java:常量
- 1.6:Java:基本數據類型
- 1.7:Java:引用類型
- 1.8:Java:String類
- 第二章:Java:運算符
- 2.1:Java:算數運算符
- 2.2:Java:關系運算符
- 2.3:Java:邏輯運算
- 2.4:Java:賦值運算符
- 2.5;Java:三元運算符
- 2.6:Java:位運算符
- 第三章:Java:循環控制語句
- 3.1:Java:for循環
- 3.2:Java:while循環
- 3.3:Java:switch
- 3.4:Java:if else
- 3.5:Java:練習題
- 第四章:Java:函數與全局/局部變量
- 4.1:Java:局部變量
- 4.2:Java:全局變量
- 第五章:Java:方法
- 5.1:Java:初識方法
- 5.2:Java:方法調用
- 5.3:Java:方法重載
- 5.4:Java:構造方法
- 5.5:Java:方法的注意事項
- 第六章:Java:面向對象
- 6.1:Java:小案例
- 6.2:Java:this 關鍵字
- 6.3:Java:super 關鍵字
- 6.4:Java:static 關鍵字
- 6.5:Java:final關鍵字
- 6.6:Java:instanceof 運算符
- 6.7:Java:面向對象之封裝
- 6.8:Java:面向對象之繼承
- 6.9:Java:面向對象之多態
- 第七章:Java:面向對象高級進階
- 7.1:Java:抽象類
- 7.2:Java:Java中String類
- 7.3:Java:interface接口
- 7.4:Java:ArrayList
- 7.5:Java:HashSet
- 7.6:Java:HashMap
- 7.7:Java:反射(reflection)
- 第八章:Java:日志以及異常捕獲
- 8.1:Java:log4j
- 8.2:Java:異常初識基礎
- 8.3:Java:未被捕獲的異常
- 8.4:Java:try和catch的使用
- 8.5:Java:多重catch語句的使用
- 8.6:Java:throws/throw 關鍵字
- 8.7:Java:finally關鍵字
- 8.8:Java:自定義異常
- 第九章:Java:xml and IO
- 9.1:Java:IO基本概念
- 9.2:java:properties
- 9.3:Java:xml基本介紹
- 9.4:Java:xml操作實例
- 第十章:Java:JDBC編程
- 10.1:Java:JDBC介紹
- 10.2:Java:JDBC查詢
- 10.3:Java:JDBC插入
- 10.4:Java:Batch
- 10.5:Java:JDBC連接池
- 第十一章:Java:TestNG
- 11.1:java:TestNG簡介
- 11.2:Java:TestNG小實例
- 11.3:Java:TestNG.xml文件配置
- 11.4:Java:TestNG基本注解
- 11.5:Java:TestNG注解代碼
- 11.6:Java:TestNG預期異常
- 11.7:Java:TestNG忽略測試
- 11.8:Java:TestNG超時測試
- 11.9:Java:TestNG分組測試