static靜態,作為修飾符,最初是由c引入,一開始static表示退出一個塊後依然存在的局部變數。隨後,static表示不能被其他文件訪問的全局變數和函數。到了C++和java,static表示屬於類且不屬於類對象的變數和函數。 從具體用法來看,主要用到5個方面。 一、靜態域。 static修飾類 ...
static靜態,作為修飾符,最初是由c引入,一開始static表示退出一個塊後依然存在的局部變數。隨後,static表示不能被其他文件訪問的全局變數和函數。到了C++和java,static表示屬於類且不屬於類對象的變數和函數。
從具體用法來看,主要用到5個方面。
一、靜態域。
static修飾類的域(欄位,成員變數),被static修飾的域在類中只有一個,它屬於類,也稱為類域。它只能被類操作,不能由對象操作。比如
pubic class Employee
{
private static int nextId=1;
private int id;
…
}
這裡nextId是靜態域,id就是實例域。nextId在Employee這個類中只有一份,所有Employee的對象共用這個靜態域,即使沒有對象,nextId依然存在。而實例域id,不同的對象可以都擁有一份id,id屬於對象,不屬於類。操作的時候,用類操作靜態域,也就是Employee.nexdId。用對象操作實例域,也就是tom.id(tom是Employee的一個對象)。
對於靜態域而言,一般靜態變數用的較少,靜態常量用的比較多。比較典型的就是數學中的PI。
public class Math
{
public static final double PI=3.14159265358979323846;
}
程式中通過Math.PI來獲取這個常量。
二、靜態方法
static修飾的方法就是靜態方法,靜態方法是屬於類的。比較典型的還是Math裡面的方法,如pow(x,a),表示x的a次冪,調用的時候直接寫Math.pow(x,a)。
靜態方法不能操作對象,也不能訪問實例域,只能訪問自身所在類的靜態域。比如
public static int getNextId()
{
return nextId;//返回靜態域
}
三、靜態代碼塊
在類的內部,用static修飾的一個代碼塊,也稱為靜態初始化塊。主要用於對類內部的靜態域進行初始化。它在第一次使用類的時候執行,只執行一次,而且在構造函數之前執行。比如,連接資料庫之前,需要對連接資料庫用到的字元串初始化,並且只載入一次驅動,就把這些都放到靜態代碼塊中。示例代碼如下:(摘了能夠說明問題的部分代碼)
static
{
//需載入驅動的名字
drivername=prop.getProperty("drivername");
//資料庫地址
dburl=prop.getProperty("dburl");
//資料庫用戶名
dbusername=prop.getProperty("dbusername");
//資料庫密碼
dbpassword=prop.getProperty("dbpassword");
//載入驅動,驅動只需要載入一次
Class.forName(drivername);
}
四、靜態導入
import導入類的時候,如果加上static,就可以導入靜態域和靜態方法。
在源文件頂部加入這樣一行代碼:
import static java.lang.Math.*;
我們在後面的程式中就可以直接使用Math的靜態域和靜態方法了。
比如double i=pow(PI,3);
這樣代碼比沒有靜態導入之前的代碼
double b=Math.pow(Math.PI, 3);
要清晰了很多,也簡潔了不少,更易於理解。
五、靜態內部類
在內部類的前面加上static修飾,就是靜態內部類。這樣使用,只是把這個類隱藏在另外一個類的內部,不需要引用外圍類對象。靜態內部類的對象除了不能引用外圍類的對象外,和其他的內部類是完全一樣的。
以上是我閱讀Java核心技術 捲I時,結合學習其它內容,個人總結的static的用法,有不當之處,請大家指正。