static關鍵字:
特點:
1.static是一個修飾符,用于修飾成員,(成員變數,成員函式)static修飾的成員變數 稱之為靜態變數或類變數,
2.static修飾的成員被所有的物件共享,
3.static優先于物件存在,因為static的成員隨著類的加載就已經存在,
4.static修飾的成員多了一種呼叫方式,可以直接被類名所呼叫,(類名.靜態成員),
5.static修飾的資料是共享資料,物件中的存盤的是特有的資料,
例如:
private static int age;//用static修飾的成員變數靜態變數或者叫做類變數
private String name; //成員變數
public static void show(){//靜態函式 可直接用類來呼叫
System.out.println("showStatic");
}
public void showDemo(){//成員函式 需要創建物件才可以呼叫
System.out.println("showDemo");
}
成員變數和靜態變數的區別:
1.生命周期的不同:
成員變數隨著物件的創建而存在隨著物件的回收而釋放,
靜態變數隨著類的加載而存在隨著類的消失而消失,
2.呼叫方式不同:
成員變數只能被物件呼叫,
靜態變數可以被物件呼叫,也可以用類名呼叫,(推薦用類名呼叫)
3.別名不同:
成員變數也稱為實體變數,
靜態變數稱為類變數,
4.資料存盤位置不同:
成員變數資料存盤在堆記憶體的物件中,所以也叫物件的特有資料,
靜態變數資料存盤在方法區(共享資料區)的靜態區,所以也叫物件的共享資料,
public class Demo {
private static int age;//用static修飾的成員變數靜態變數或者叫做類變數
private String name; //成員變數
public static void show(){//靜態函式 可直接用類來呼叫
System.out.println("showStatic");
}
public void showDemo(){//成員函式 需要創建物件才可以呼叫
System.out.println("showDemo");
}
public static void main(String[] args) {
Demo.age = 1;//靜態變數可以直接用類名呼叫,隨著類加載而存在類的消失而消失
Demo d = new Demo();
d.age = 10;//靜態變數也可以通過物件來呼叫(推薦用類名來呼叫)
d.name="張三";//成員變數只能通過物件來呼叫,隨著物件創建而存在隨著物件回收而釋放,
Demo.show();//靜態方法也可以直接用類名呼叫,
d.show(); //靜態方法也可以通過物件來呼叫,
d.showDemo();//非靜態方法只能通過物件來呼叫,
}
}
靜態使用時需要注意的事項:
1.靜態方法只能訪問靜態成員,(非靜態既可以訪問靜態,又可以訪問非靜態)
2.靜態方法中不可以使用this或者super關鍵字,
3.主函式是靜態的,
public class Demo {
private static int age;//用static修飾的成員變數靜態變數或者叫做類變數
private String name; //成員變數也叫做實體變數
public static void show(){//靜態函式
Demo d = new Demo();//因為靜態先于物件加載如果需要訪問必須要創建物件才能訪問
d.name = "張三";//靜態方法不能直接訪問非靜態的成員變數
d.showDemo();//靜態方法不能直接訪問非靜態的成員函式
System.out.println(d.name);
}
public void showDemo(){//成員函式
age = 10;//可以直接訪問靜態變數
show();//也可以直接訪問靜態函式
System.out.println(age);
}
}
什么時候使用static來修飾
1.靜態變數:
當分析物件中所具備的成員變數的值都是相同的,這時這個成員就可以被靜態修飾,
只要是資料在物件中都是不同的,就是物件的特有資料,必須存盤在物件中,是非靜態的,
如果是相同的資料,物件不需要做修改,只需要使用即可,不需要存盤在物件中,是靜態的,
2.靜態函式,
函式是否用靜態修飾,就參考一點,就是該函式功能是否有訪問到物件中特有的資料,
簡單來說,從源代碼看,該功能是否需要訪問非靜態的成員變數,如果需要,該功能就是非靜態的,如果不需要,就可以將該功能定義成靜態的,當然,也可以定義成非靜態,但是非靜態需要被物件呼叫,而僅創建物件是沒有意義的,
靜態代碼塊:
隨著類的呼叫或創建實體而執行,而且只執行一次,
作用:
用于給類進行初始化,
public class Demo {//如果想讓此類成為一個靜態類而類中需要用到一些引數需要初始化就需要靜態代碼塊
private static int age;
private static String name;
//省略get、set方法
static{//當類第一次呼叫或創建實體時給屬性初始化且只執行一次,
age = 10;
name = "張三";
}
public static void showNoen(){//呼叫此方法age為10name為張三(默認值)
System.out.println("年齡:"+age+"姓名:"+name);
}
public static void show(int age,String name){//呼叫此方法會覆寫掉默認值
Demo.age = age;
Demo.name = name;
System.out.println("年齡:"+Demo.age+"姓名:"+Demo.name);
}
public static void main(String[] args) {
Demo.showNoen();//結果為:年齡:10姓名:張三
Demo.show(50, "趙四");//結果為:年齡:50姓名:趙四
}
}
主函式特殊之處:
1.格式固定,
2.被jvm所識別和呼叫,
public static void main(String[] args){
}
public:因為權限必須是最大的,
static:jvm在呼叫時是不需要物件的,直接用主函式所屬的類名呼叫即可,
void:主函式沒有具體的回傳值 ,
main:函式名,不是關鍵字,只是一個jvm識別的固定名字,
String[] args:這是主函式的引數串列,是一個陣列型別的引數,而且袁術都是字串型別,
例如問題:
1、靜態方法能不能參考非靜態資源?不能,new的時候才會產生的東西,對于初始化后就存在的靜態資源來說,根本不認識它,
2、靜態方法里面能不能參考靜態資源?可以,因為都是類初始化的時候加載的,大家相互都認識,
3、非靜態方法里面能不能參考靜態資源?可以,非靜態方法就是實體方法,那是new之后才產生的,那么屬于類的內容它都認識,
靜態塊
靜態塊也是static的重要應用之一,也是用于初始化一個類的時候做操作用的,和靜態變數、靜態方法一樣,
靜態塊里面的代碼只執行一次,且只在初始化類的時候執行,
1.靜態代碼塊是嚴格按照父類靜態代碼塊->子類靜態代碼塊的順序加載的,且只加載一次,
2.靜態資源的加載順序是嚴格按照靜態資源的定義順序來加載的,
3.靜態代碼塊對于定義在它之后的靜態變數,可以賦值,但是不能訪問,
public class A
{
static
{
c = 3;
System.out.println(c); //報錯 無法訪問
}
private static int c;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/248846.html
標籤:Java
下一篇:java物件的序列化與反序例化
