1. 程式人生 > >Java學習筆記-Static修飾符用法

Java學習筆記-Static修飾符用法

使用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方法
        }
}