面向對象——類的成員之成員變量、構造器
1.成員變量
普通變量:權限修飾符 數據類型 變量名。如 private String name;
注:數據類型可以是8種基本數據類型,或者引用數據類型。
靜態變量:在普通變量的基礎上,加上static修飾符。如:public static int num;
注:靜態變量屬於類,在內存只有一份,不會隨着類的創建而創建。因此常用於計數!
靜態常量:既有static修飾,又有final修飾。public final static int num=1000;
注:static final可以交換位置,常用的還有Math.PI等。
成員變量如果聲明時沒有賦初始值,就是該數據類型的默認值。
final修飾成員變量:可以聲明時初始化,也可以在構造器中初始化,但是不能二次賦值。
2.構造器
構造器的格式要求:
- 名字與類名相同,
- 沒有返回值也不能有void
- 其中可以包含return;用於結束方法,但不能返回任何東西。
構造器必知:如果當前類不提供構造器,編譯器自動爲類添加一個空參構造器。如果當前類有其他的構造器,則編譯器不再提供空參構造器。
非常重要:由於構造子類前一定會先構造父類,這時候如果子類不顯示調用父類的構造器,則默認調用父類空參構造器。如果父類有其他構造器無空參構造器,這時候出現編譯異常(找不到父類的空參構造器)。
代碼示例:
class Creature{
public Creature(){
System.out.println("I'm a creature");
}
}
class Animal extends Creature{
public Animal(){
System.out.println("I'm a animal");
}
}
class Person extends Animal{
public Person(){
System.out.println("I'm a person");
}
}
public class Test{
public static void main(String[] args) {
Person person=new Person();
}
}
輸出:I'm a creature
I'm a animal
I'm a person
關於創建對象時的執行順序
代碼示例一:
public class Construct2 {
④ private String name="AA";
① private static int num=10;
② static{
System.out.println("靜態塊1");
}
⑤ {
System.out.println("初始化塊1");
}
③ static{
System.out.println("靜態塊2");
}
⑦ public Construct2(){
System.out.println("構造器");
}
⑥ {
System.out.println("初始化塊2");
}
public static void main(String[] args) {
Construct2 tCon=new Construct2();
}
}
圓圈代表步驟。執行結果:
靜態塊1
靜態塊2
初始化塊1
初始化塊2
構造器根據執行結果可以看出:創建對象時屬性初始化的順序爲:
靜態變量、靜態代碼塊(隨類加載)==>普通變量、初始化塊(順序執行)==>構造器
注:如果子父類都含有靜態變量,加載順序爲:
父類靜態結構(靜態塊、靜態變量)=>子類靜態結構=>父類其他結構=>子類其他結構
對象實例化的全過程
- jvm讀取.class文件,並加載進內存,先加載子類的父類
- 堆開闢內存,分配地址
- 在對象的空間內,對對象空間屬性進行默認初始化(各種類型數據默認值)
- 構造函數初始化
- 在構造函數中,先調用父類構造器初始化
- 在調用子類構造器初始化
- 初始化完畢,把地址賦值給對象的引用。