面向對象——類的成員之成員變量、構造器


面向對象——類的成員之成員變量、構造器

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
構造器

根據執行結果可以看出:創建對象時屬性初始化的順序爲:

靜態變量、靜態代碼塊(隨類加載)==>普通變量、初始化塊(順序執行)==>構造器

注:如果子父類都含有靜態變量,加載順序爲:

父類靜態結構(靜態塊、靜態變量)=>子類靜態結構=>父類其他結構=>子類其他結構

對象實例化的全過程

  1. jvm讀取.class文件,並加載進內存,先加載子類的父類
  2. 堆開闢內存,分配地址
  3. 在對象的空間內,對對象空間屬性進行默認初始化(各種類型數據默認值)
  4. 構造函數初始化
  5. 在構造函數中,先調用父類構造器初始化
  6. 在調用子類構造器初始化
  7. 初始化完畢,把地址賦值給對象的引用。




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章