JAVA關鍵字——static的使用
static的使用
一、static:靜態的;
二、static可以用來修飾類的結構,即修飾屬性、方法、程式碼塊、內部類;
三、修飾屬性:屬性就成了靜態變數(或者說類變數)
屬性:按是否使用static修飾,又分為:靜態屬性和非靜態屬性
1、非靜態屬性也叫例項變數;
2、例項變數:我們建立了類的多個物件,每個物件都獨立地擁有一套類中的非靜態屬性。當修改其中一個物件中的非靜態屬性值的時候,不會導致其他物件中同樣的屬性值的修改;
3、靜態變數:我們建立了類的多個物件,多個物件共享同一個靜態變數。當通過某一個物件修改靜態變數時,會導致其他物件呼叫此靜態變數時,呼叫到的值是修改過的;看完下面的講解再回來看這條講解就會清楚,因為靜態變數是在靜態域中的,一個物件修改了這個變數,別的物件呼叫到這個變數的時候呼叫到的就是修改後的了。
4、靜態變數隨著類的載入而載入,可以通過“類.靜態變數”的方式進行呼叫,所以也叫類變數;
5、例項變數是隨著物件的建立而載入的,所以也叫例項變數;
6、因為是先載入了類,後面才去建立物件,而靜態變數是隨著類的載入而載入,所以靜態變數的載入要早於物件的建立;
7、由於類只會載入一次,則靜態變數在記憶體中也只會存在一份,這也就是為什麼多個物件共享同一個靜態變量了。它存在方法區的靜態域中。
8、關於類和物件呼叫靜態變數和例項變數的情況:
8.1類可以呼叫靜態變數,因為靜態變數是在類載入的時候載入的,但類不能呼叫例項變數,因為例項變數是後面物件載入後才有的;
8.2物件可以呼叫靜態變數,因為物件建立的時候靜態變數已經存在了,也可以呼叫例項變數,因為例項變數是隨著物件的建立而載入的。
public class Static1 {
public static void main(String[] args) {
// TODO Auto-generated method stub
//通過帶參構造器建立一個物件
Chinese p1 = new Chinese("中國","fft");
System.out.println(p1.nation);
//再建立一個新的物件
Chinese p2 = new Chinese();
System.out.println(p2.nation);
}
}
class Chinese {
static String nation;//這個就是靜態變數(或者說類變數)
String name;//例項變數;
public Chinese() {}
public Chinese(String nation,String name) {
this.nation = nation;
this.name = name;
}
}
四、修飾方法:靜態方法;
1、隨著類的載入而載入,可以通過“類.靜態方法”的方式進行呼叫;
2、同屬性一樣,類可以呼叫靜態方法、不能呼叫非靜態方法;
物件可以呼叫靜態方法和非靜態方法;
3、
①靜態方法中,只能呼叫靜態的方法或靜態的屬性,因為它在類載入的時候就載入,不能呼叫後面才載入的東西;
②非靜態方法中,既可以呼叫非靜態的方法或屬性,也可以呼叫靜態的方法或屬性;
4、注意點:
①在靜態的方法內,不能使用this、super關鍵字;this和super都是用來呼叫當前物件或父類的屬性、方法、構造器的,這三者都是隨著物件的載入而載入的,自然不可以使用this和super來操作它們。
②關於靜態屬性和靜態方法的使用,應該從生命週期的角度去理解(即先後載入和先後銷燬的問題:靜態的是隨著類的載入(載入在快取區,不會輕易銷燬)而載入,類的銷燬而銷燬,類在jvm關掉的時候銷燬;非靜態的是隨著物件的載入而載入,隨著物件的銷燬而銷燬)。
五、什麼時候要用static?
1、屬性是可以被多個物件所共享的,不會隨著物件的不同而不同;
2、類中的常量也常常宣告為static;
3、操作靜態屬性的方法,通常設定為static,如set和get方法;
4、工具類中的方法,習慣上宣告為static,如Math、Arrays、Collections。
以上便是筆者對static的理解總結,有不足之處還望各位朋友指出呀!