1. 程式人生 > >【Java基礎】繼承中的程式碼塊和構造方法的執行順序探索

【Java基礎】繼承中的程式碼塊和構造方法的執行順序探索

本文講述有關一個類的靜態程式碼塊,構造程式碼塊,構造方法的執行流程問題。首先來看一個例子

/**
 * Created by lili on 15/10/19.
 */

class Person{
    static {
        System.out.println("執行Person靜態程式碼塊");
    }

    {
        System.out.println("執行Person構造程式碼塊");
    }
    public Person(){
        System.out.println("執行Person構造方法");
    }
}

class Student extends Person{ static { System.out.println("執行Student靜態程式碼塊"); } { System.out.println("執行Student構造程式碼塊"); } public Student(){ System.out.println("執行Student構造方法"); } } public class ExtendsStaticConstruct { public static void
main(String args[]){ Student student = new Student(); } }

執行結果如下:

執行Person靜態程式碼塊
執行Student靜態程式碼塊
執行Person構造程式碼塊
執行Person構造方法
執行Student構造程式碼塊
執行Student構造方法

Process finished with exit code 0

說明程式的執行順序是:

  靜態程式碼塊 ---》    構造程式碼塊 ----》  構造方法

執行流程解釋:
  new的是Student類,但是Student是繼承子Person類,所以在載入Student類時先要載入Person類,而靜態的內容是隨著類的載入而載入的,所以先列印“執行Person靜態程式碼塊”,後執行Student的靜態程式碼塊。

  載入完類後,開始走main方法,執行Student構造方法上,即初始化Student,但是Student是繼承自Person,必須先初始化Person,所以先呼叫Person類的空參構造方法進行初始化,但是Person類的構造程式碼塊優先於構造方法執行,所以Person類的構造程式碼塊先執行,構造方法後執行。然後再執行Student類的構造程式碼塊和構造方法。

  這裡的執行順序同子類構造中有一個預設的父類構造super()無關,不是執行到隱藏的super()才開始初始化父類的,類的初始化是分層初始化,即先初始化父類,再初始化子類,初始化每個類的過程中,進行類的初始化工作,先進性成員變數的初始化,成員變數的初始化順序是:預設初始化,即int為0這種--》顯示初始化,例如給int型顯示初始化了值--》構造方法初始化,所以是這裡執行到了構造方法。

      但是一定要注意,父類初始化選擇的構造方法卻和子類中super 選擇的構造相關,下面程式碼很好的解釋了這點。

/**
 * Created by lili on 15/10/19.
 */

class Person{
    static {
        System.out.println("執行Person靜態程式碼塊");
    }

    {
        System.out.println("執行Person構造程式碼塊");
    }

    public Person(){
        System.out.println("執行Person無參構造方法");
    }

    public Person(String name){
        System.out.println("執行Person構造方法"+ name);
    }
}

class Student extends Person{

    static {
        System.out.println("執行Student靜態程式碼塊");
    }
    {
        System.out.println("執行Student構造程式碼塊");
    }
    public Student(String name){
        super(name);
        System.out.println("執行Student構造方法" + name);
    }
    public Student(){
        super();
        System.out.println("執行Student無參構造方法");
    }




}
public class ExtendsStaticConstruct {
    public static void main(String args[]){
        Student student1 = new Student("lili");

        System.out.println("--------------------");
        Student student2 = new Student();

    }

}

結果:

執行Person靜態程式碼塊
執行Student靜態程式碼塊
執行Person構造程式碼塊
執行Person構造方法lili
執行Student構造程式碼塊
執行Student構造方法lili
--------------------
執行Person構造程式碼塊
執行Person無參構造方法
執行Student構造程式碼塊
執行Student無參構造方法

Process finished with exit code 0

相關推薦

Java基礎繼承程式碼構造方法執行順序探索

本文講述有關一個類的靜態程式碼塊,構造程式碼塊,構造方法的執行流程問題。首先來看一個例子 /** * Created by lili on 15/10/19. */ class Person{ static { System.out.println("執行Per

java靜態變數,靜態方法,靜態程式碼構造程式碼構造方法...執行順序

public class TestExeOrder { public TestExeOrder(){ System.out.println("類的構造方法執行了..."); } { System.out.println("構造程式碼塊執行了

java四種許可權修飾符,靜態程式碼構造程式碼構造方法執行順序

一、java中類有四種許可權 1、要想僅能在本類中訪問使用private修飾。 2、要想本包中的類都可以訪問不加修飾符即可。 3、要想本包中的類與其他包中的子類可以訪問使用protected修飾。(不在同一包中時,只能在子類裡面可以呼叫,其他測試類建物件都不行,只給不同包中的子

unity 靜態程式碼構造方法執行時機次數

using UnityEngine; using System.Collections; public class test : MonoBehaviour { void Start () { person p01 = new person(); person p

父類與子類的靜態程式碼程式碼構造方法執行順序

StaticTest.java package com.staticTest; /** * 測試靜態程式碼塊執行順序 * 1、static能修飾的類只有靜態內部類 * 2、靜態方法不能直接訪問非

Java基礎Json字串轉物件轉List集合操作

to今天發現專案中需要拿到對接系統中傳值的Json,需要轉換成List集合。回顧下Json字串的操作,寫了個測試。 public class JsonToUtil {     private  static final  Logger log = LoggerFactor

Java基礎之重寫equals、hashCodecompareTo方法什麼時候需要重寫重寫equals方法?為什麼重寫equals方法,一定要重寫HashCode方法

1.何時需要重寫equals() 當一個類有自己特有的“邏輯相等”概念(不同於物件身份的概念)。 2.設計equals() [1]使用instanceof操作符檢查“實參是否為正確的型別”。 [2]對於類中的每一個“關鍵域”,檢查實參中的域與當前物件中對應的域值。 [2

Java構造,靜態代碼構造方法執行順序

構造方法 就會 -1 static關鍵字 demo args http cnblogs pub 構造塊:直接寫在類中的代碼塊 靜態代碼垮:使用static關鍵字聲明的代碼塊 靜態代碼塊先於構造塊,構造方法執行,而且只在類加載時候執行一次,後面在類實例化的時候會先執行構造塊,

靜態成員變數靜態程式碼構造方法執行順序

型別一:靜態成員變數+非靜態成員變數+構造方法 public class StaticInitialization { public static void main(String[] args) { System.out.print

小家java靜態程式碼構造程式碼、靜態變數執行順序繼承邏輯

相關閱讀 每篇一句 上帝給每個人都安排了幸福的一生,我們的任務就是把它走完 1、概述 誠如各位所知,java的三大特性:封裝、繼承、多型。其中繼承,是java中最有學問的一點也是最相對來說最難理解的一些東西,本文針對於此,做一些例項分析,希望能夠幫助大家

Java基礎程式碼構造程式碼,靜態程式碼

程式碼塊 public class Demo { public static void main(String[] args){ { int a = 1; System.out.println(a); }

JAVA基礎java繼承方法呼叫優先順序.順序:this.show(object)>super.show(object)>this.show((super)object)>super.show(

先上程式碼: public class ExtendsTest { public static void main(String args[]){ A a1 = new A(); A a2 = new B(); B b = new B(); C c = new C(); S

Java基礎----static關鍵字、程式碼、Main方法、匿名物件詳解

1.static關鍵字 static簡介 static是靜態的意思,是一個修飾符,能夠用於成員變數和成員屬性。 特點 能夠通過類名直接進行呼叫,被static修飾

Java基礎java繼承構造方法

小編現在學習了一下繼承中的構造方法,覺得還是總結一下比較好。【特點】1、子類的構造的過程中必須呼叫其基類的構造方法。2、子類可以在自己的構造方法中使用super(argument_list)呼叫基類的構

java基礎java的集合概述

1、為什麼要有集合          在實際開發中,除了單例的物件,我們可以知道其數量,其他物件的數量只能在程式執行時才可以知道建立多少個物件。如果在程式開發階段,我們並不知道物件的數量,以及物件的準確型別,那麼這些物件用什麼來容納呢?我們首先想到了陣列,但是眾所周知,陣列

java基礎執行緒匿名內部類lambda建立方式,及多執行的兩個面試題

一、可以用匿名類和lambda兩個種方式建立多執行緒。 1.利用匿名內部類建立多執行緒並開啟。 new Thread() {//建立方式1 public void run() { for(int x=0; x<50; x++) { System.out

java基礎單例設計模式:保證一個類在記憶體的物件唯一性

摘要:單例設計模式解決的問題就是可以保證一個類在記憶體中的物件唯一性,必須對於多個程式使用同一個配置資訊物件時,就需要保證物件的唯一性。 單例設計模式有兩個表現形式:餓漢式和懶漢式。餓漢式開發時常用,

Java基礎Java註解成員支援的型別說明

Java註解是java提供的一個很好的工具,那麼在自定義註解的時候,其內部成員可被允許的型別又有哪些呢? 根據 JLS中章節9.6.1 的說明,Java中註解成員的型別必須是如下幾類: 1. 基本資

java基礎collection介面toArray()的使用方法

Collection介面中有兩種toArray()方法 Object[] toArray()           Return an Array Containing all of the elements in this collection. <T> T[]

Java基礎Java的語法糖

目錄 Java中的語法糖 switch對String和列舉類的支援 對泛型的支援 包裝型別的自動裝箱和拆箱 變長方法引數 列舉 內部類 條件編譯