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、都沒有,系統將會在執行子類構造器之前,隱式呼叫父類無引數的構造器;