Java學習筆記-Static修飾符用法
阿新 • • 發佈:2019-01-06
使用static可修飾類屬性、方法、初始化塊,可通過類名直接進行訪問,用在類中公用的部分,需定義為static。
無static修飾的屬性、方法稱為例項屬性、例項方法,每個例項物件都一一對應自己的屬性或者方法;
由static修飾的屬性或者方法稱為類屬性、類方法,每個例項物件都共享該屬性或者方法。
靜態程式碼塊只能訪問靜態屬性,不能夠訪問例項屬性;或者說在靜態方法中,可以訪問靜態屬性,但不能訪問例項屬性和例項訪問,反之成立;
Why?
因為靜態屬性、靜態方法在Classloader時生效,相對形成靠前;而例項屬性、例項方法在建立物件之後方可生效,相對靠後;兩者之間為存在與不存在的關係;
一個子類在建立一個物件時父子類的JVM啟動過程中的形成如下:
父類過程
1、初始化靜態屬性
2、呼叫靜態初始化塊
3、給屬性分配記憶體空間,賦初始值
4、給屬性賦預設值
5、呼叫非靜態初始化塊
6、呼叫構造方法給屬性重新賦值
子類過程:
7、初始化靜態屬性
8、呼叫靜態初始化塊
9、給屬性分配空間,賦初始值
10、給屬性賦預設值
11、呼叫非靜態初始化塊
12、呼叫構造方法給屬性重新賦值
建立子類物件之前,系統先建立父類,靜態最先執行(原則:靜態優先、父類優先)
則建立一個子類物件正確的順序應該是:
1、2、7、8、3、4、5、6、9、10、11、12
小型別可以自動轉換成大型別,即子類建立的物件可以賦值於父類引用,如:
靜態方法不存在覆蓋問題:public class Car{ } public class QQ extends Car{ } pulic class Main{ public static void main(String args) { Car car = new QQ(); } }
public class Person{ public static void test1() {---------} public void test2() {---------} } public class Student extends Person{ public static void test1() {----------} public void test2() {----------} } public class Main{ public static void main(String args) { Person p = new Student(); p.test1();//呼叫靜態方法,以引用為準,呼叫引用所在的類方法,此處呼叫Person類test1方法 p.test2();//呼叫例項方法,以物件為準,呼叫物件所在的類方法,此處呼叫Student類test2方法 } }