- static 是一個修飾符,用於修飾成員。
- static 修飾的成員被所有的對象所共享。
- static 優先於對象存在,因為static的成員隨著類的加載就已經存在了。
- static 修飾的成員多了一種調用方式,就可以直接被類名所調用。(類名.靜態成員)
- static 修飾的數據是共享數據,對象中存儲的是特有數據。
- 一般我們操作對象的特有數據較多,共享數據較少。
- 靜態方法中不可以使用 this 調用變量。
- 兩個變量的生命週期不同
成員變量隨著對象的創建而存在,隨著對象的被回收而釋放。
靜態變量隨著類的加載而存在,隨著類的消失而消失。
- 調用方式不同
成員變量只能被對象調用。
靜態變量可以被對象調用,還可以被類名調用(優先)。
- 別名不同
成員變量也稱為實例變量。
靜態變量稱為類變量。
- 數據存儲位置不同
成員變量數據存儲在堆內存的對象中,所以也較對象的特有數據。
靜態變量數據存儲在方法區(共享數據區)的靜態區,所以也較對象的共享數據。
- 靜態方法只能訪問靜態成員(變量,方法)。(非靜態既可以訪問靜態,又可以訪問非靜態)
- 靜態方法中不可以使用 this 或者 super 關鍵字。
- 主函數是靜態的。(如要訪問非靜態成員則可以使用實例化的方式調用)
- 格式是固定的。
- 被 jvm 所識別和調用。
- public static void main(String[] args) {}
public: 因為權限必須是最大的。
static: 不需要對象,直接用主函數所屬類名調用即可。
void: 主函數沒有具體的返回值。
main: 函數名,不是關鍵字,只是一個 jvm 識別的固定的名字。
String[] args: 這是主函數的參數列表,是一個數組類型的參數,而且元素都是字符串類型。
- 靜態變量
當分析對象中所具備的成員變量的值都是相同的。
這時這個成員就可以被靜態修飾。
只要數據在對象中都是不同的,就是對象的特有數據,必須存儲在對象中,是非靜態的。
如果是相同的數據,對象不需要做修改,只需要使用即可,不需要存儲在對象中,定義成靜態的。
- 靜態函數
函數是否用靜態修飾,只要參考一點,就是該函數功能是否有訪問到對象中的特有數據。
簡單來講,從源代碼看,該功能是否需要訪問非靜態成員變量,如果需要,該功能就是非靜態的。
如果不需要,就可以將該功能定義成靜態的。
當然,也可以定義成非靜態,但是非靜態需要被對象調用,而僅創建對象調用非靜態且沒有訪問特有數據的方法,該對象的創建是沒有意義的。
- 隨著類的加載而執行,而且只執行一次。(較少用)
- 作用: 用於給類進行初始化。(構造函數給對象初始化,有的類不需要創建對象)
- 形式:
static
{
System.out.println("Hello World");
}
- 隨著對象的加載而執行,優先於構造函數。
- 作用: 如果某成員在每次對象加載都須執行,則可將其置於構造代碼塊中。
- 形式:
class Person {
{
//構造代碼塊
}
Person() {
//構造函數
}
}
public class Person {
private int age;
private String name;//成員變量或實例變量,對象特有數據
static String country = "China";//靜態變量或類變量,對象共享數據
//定義一個Person類的構造函數
Person(String name, int age){
this.name = name;
this.age = age;
}
}
public class PersonDemo {
int x = 3;
public static void main(String[] args) {
Person p = new Person("Jack", 19);
System.out.println(p.country);//被對象調用
System.out.println(Person.country);//以類名調用
//實例化以調用非靜態成員
PersonDemo p1 = new PerosnDemo();
p1.show();
}
public void show() {
System.out.println(x);
}
}