1. 程式人生 > >Java 顯示呼叫和隱式呼叫

Java 顯示呼叫和隱式呼叫

舉個例子:
package com.test6;

//顯示呼叫和隱式呼叫原則

//定義一個生物類
class Creature{
{
System.out.println(“Creature的非靜態初始化塊”);
}
//兩個構造器
public Creature(){
/// 6
System.out.println(“Creature無引數的構造器”);
}
public Creature(String name){
//使用this呼叫另一個過載的、無引數的構造器 5
this();
System.out.println(“Creature帶有name引數的構造器,name引數:”+name);
}
}
class Animal extends Creature{
{
System.out.println(“Animal的非靜態初始化塊”);

}
public Animal(String name){
    //                         4
    super(name);
    System.out.println("Animal帶一個引數的構造器,name引數:"+name);
}
public Animal(String name , int age){
    //使用this呼叫另一個過載的構造器   3
    this(name);
    System.out.println("Animal帶兩個引數的構造器,age"+age);
}

}

class Wolf extends Animal{

{
    System.out.println("Wolf的非靜態初始化塊");
}
public Wolf(){
    //顯示呼叫父類帶兩個引數的構造器     2
    super("灰太狼",3);
    System.out.println("Wolf無引數的構造器");
}
public Wolf(double weight){
    //使用this 呼叫另一個過載的構造器     1
    this();
    System.out.println("Wolf的帶weight引數的構造器,weight引數:"+weight);
}

}
public class InitTest {

/**
 * @param args
 */
public static void main(String[] args) {
    // TODO Auto-generated method stub
    new Wolf(5.6);

}

}

執行結果:
Creature的非靜態初始化塊
Creature無引數的構造器
Creature帶有name引數的構造器,name引數:灰太狼
Animal的非靜態初始化塊
Animal帶一個引數的構造器,name引數:灰太狼
Animal帶兩個引數的構造器,age3
Wolf的非靜態初始化塊
Wolf無引數的構造器
Wolf的帶weight引數的構造器,weight引數:5.6

程式初始化步驟:執行非靜態初始化塊(如果有的話)->隱式或顯示呼叫類的一個或多個構造器執行初始化。
只要在程式中建立Java物件,系統總是先呼叫最頂層父類的初始化操作,包括初始化塊和構造器。然後依次向下呼叫父類初始化操作,最後執行本類的初始化操作。至於呼叫父類的哪個構造器來執行初始化,分為三種情況:
a、子類構造器執行體的第一行使用super顯示呼叫父類構造器,根據傳入的引數來確定呼叫父類的哪個構造器;
b、子類構造器執行庭的第一行使用this顯示呼叫本類中的過載構造器,根據傳入的引數確定本類的另一個構造器;
c、都沒有,系統將會在執行子類構造器之前,隱式呼叫父類無引數的構造器;