研究問題:
- 主方法中靜態代碼塊、構造代碼塊、構造方法順序?
要點:
- A:靜態代碼塊->main方法->構造代碼塊->構造方法
B:靜態內容隨着類的加載而加載,靜態代碼塊會優先執行
C:若存在繼承關係,子類初始化之前先會進行父類初始化 - super僅僅表示先初始化父類數據,再初始化子類數據。
- 構造塊:直接在類中定義且沒有加static關鍵字的代碼塊稱爲{}構造代碼塊。構造代碼塊在創建對象時被調用,每次創建對象都會被調用,並且構造代碼塊的執行次序優先於類構造函數。
截圖展示區:
-
1.
package com.java.JiCheng;
/*
* A:靜態代碼塊->main方法->構造代碼塊->構造方法
* B:靜態內容隨着類的加載而加載
* 靜態代碼塊內容會優先執行
* C:子類初始化之前先會進行父類初始化
*/
class FU{
public FU(){
System.out.println("父類構造被調用");//5
}
static{
System.out.println("靜態代碼塊FU");//1
}
{
System.out.println("構造代碼塊FU");//4
}
}
class ZI extends FU{
public ZI(){
System.out.println("子類構造被調用");//7
}
static{
System.out.println("靜態代碼塊ZI");//2
}
{
System.out.println("構造代碼塊ZI");//6
}
}
class SUN extends ZI{
public SUN(){
System.out.println("子類的子類還是子類構造被調用");//9
}
static{
System.out.println("靜態代碼塊SUN");//3
}
{
System.out.println("構造代碼塊SUN");//8
}
}
class extend{
public static void main(String[] args){
SUN s=new SUN();
}
}
運行結果:
2. //靜態代碼塊:在java中使用static關鍵字聲明的代碼塊。
//靜態塊用於初始化類,爲類的屬性初始化。每個靜態代碼塊只會執行一次。
//由於JVM在加載類時會執行靜態代碼塊,所以靜態代碼塊先於主方法執行。
//如果類中包含多個靜態代碼塊,那麼將按照”先定義的代碼先執行,後定義的代碼後執行”。
//注意:1 靜態代碼塊不能存在於任何方法體內。
//2 靜態代碼塊不能直接訪問靜態實例變量和實例方法,需要通過類的實例對象來訪問。
class Code{
{
System.out.println("Code的構造塊");//4//6
}
static{
System.out.println("Code的靜態代碼塊");//3//每個靜態代碼塊只加載一次
}
public Code(){
System.out.println("Code的構造方法");//5//7
}
}
public class CodeBlock03{
{
System.out.println("CodeBlock03的構造塊");//8//10
}
static{
System.out.println("CodeBlock03的靜態代碼塊");//1
}
public CodeBlock03(){
System.out.println("CodeBlock03的構造方法");//9//11
}
public static void main(String[] args){
System.out.println("CodeBlock03的主方法");//2
new Code();
new Code();
new CodeBlock03();
new CodeBlock03();
}
}
運行結果: