什麼是static?
static:是java中的關鍵字,表示”靜態的意思“,他可以用來修飾變量、方法、代碼塊。修飾的變量是靜態變量,修飾的方法時靜態方法,修飾的代碼塊是靜態代碼塊。在java中只要是static修飾的都是和類相關的,直接通過類名的方式進行訪問。
什麼時候將變量定義爲靜態變量?
靜態變量:被static修飾的成員變量就是靜態變量,沒有被static修飾的成員變量叫實例變量;靜態變量是類級別的,可以直接通過類名進行訪問,靜態變量存儲在方法區中,類加載的時候初始化;而實例變量是對象級別的,必須要通過引用纔可以訪問,實例變量存儲在堆內存中,在構造方法執行過程中初始化。
瞭解了基本概念,那麼它到底在什麼時候使用呢?當一個成員變量非常的穩定,基本不發生任何變化的時候,也就是說,不會因爲對象的不同而有所不同的時候,就可以把這個變量變爲靜態變量。這樣可以避免對堆內存空間的浪費,被訪問的時候還不需要實例化,直接用類名的方式進行訪問就行。
實例代碼:
/**
* @author Jason
* @create 2020-04-22 9:36
*/
public class ChineseTest {
public static void main(String[] args) {
Chinese c1 = new Chinese("Jason",28,true);
System.out.println("姓名:"+c1.getName());
System.out.println("年齡:"+c1.getAge());
System.out.println("性別:"+(c1.isGender() ? "男" : "女"));
System.out.println("國籍:"+ Chinese.country);
System.out.println("===========================================");
Chinese c2 = new Chinese("rose",26,false);
System.out.println("姓名:"+c2.getName());
System.out.println("年齡:"+c2.getAge());
System.out.println("性別:"+(c2.isGender() ? "男" : "女"));
System.out.println("國籍:"+ Chinese.country);
}
}
/**
* @author Jason
* @create 2020-04-22 9:32
*/
public class Chinese {
private String name;
private int age;
private boolean gender;
static String country="中國";
public Chinese() {
}
public Chinese(String name, int age, boolean gender) {
this.name = name;
this.age = age;
this.gender = gender;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public boolean isGender() {
return gender;
}
public void setGender(boolean gender) {
this.gender = gender;
}
public static String getCountry() {
return country;
}
public static void setCountry(String country) {
Chinese.country = country;
}
}
什麼時候把方法定義爲靜態方法?
當方法體中需要直接訪問當前對象的實例變量或實例方法的時候,該方法必須爲實例方法。
實例代碼:
/**
* @author Jason
* @create 2020-04-22 11:20
*/
public class CustomerTest {
public static void main(String[] args) {
Customer Jason = new Customer("Jason");
Jason.shopping();
Customer Rose = new Customer("Rose");
Rose.shopping();
}
}
/**
* @author Jason
* @create 2020-04-22 11:16
*/
public class Customer {
String name;
public Customer(String name) {
this.name = name;
}
public void shopping(){
System.out.println(this.name+"正在購物...");
pay();
}
public void pay(){
System.out.println(this.name+"正在支付...");
}
}
靜態代碼塊什麼時候使用?
靜態代碼塊:用static修飾的代碼塊,一般在類加載的時候執行,並且只執行一次。
那麼我們在什麼時候使用呢?很簡單,就是在類加載的時候需要執行一段代碼,一般情況是在main方法之前執行。當然有多個靜態代碼塊的時候,他們是按照自上而下的順序執行的。
實例代碼:
/**
* @author Jason
* @create 2020-04-22 11:02
* 測試靜態代碼塊的執行順序
* 下面代碼執行順序是:1/3/2
*/
public class StaticTest01 {
static {
System.out.println(1);
}
public static void main(String[] args) {
System.out.println(2);
}
static {
System.out.println(3);
}
}
類體中的代碼有執行順序要求嗎?
static修飾的靜態變量和靜態代碼塊是有先後執行順序的,自上而下的順序執行。
空引用訪問靜態變量和靜態方法會出現空指針異常嗎?
在實例變量和實例方法中必須先創建對象然後通過引用方式進行訪問,如果這個時候用空引用去訪問實例相關成員,必然會出現空指針異常。而靜態方法、靜態變量直接是使用類名去訪問,儘管靜態相關成員也能使用引用去訪問,而且用空引用去訪問也不會出現空指針異常,但是不建議樣做。