1. 程式人生 > >靜態程式碼塊,構造程式碼塊,構造方法的載入執行順序研究

靜態程式碼塊,構造程式碼塊,構造方法的載入執行順序研究

構造程式碼塊是給所有的物件進行初始化,也就是說,所有的物件都會呼叫同一個程式碼塊。只要物件一創立,就會呼叫這個程式碼塊。

package com.inphase.construct;


public class Demo {
    private static int a = 0;
    
    /*
     * 靜態程式碼塊隨著類被jvm虛擬機器載入而載入
     */
    static{   
        a = 10 ;
        System.out.println("靜態程式碼塊在執行a="+a);
    }
    
    /**
     * 非靜態程式碼塊, 需要建立物件才會隨之載入到堆記憶體
     */
    {
        a = 8;
        System.out.println("非靜態程式碼塊(構造程式碼塊)在執行a=" + a);
    }
    /*
     * 空引數構造
     */
     public Demo() {
            this("呼叫帶參構造方法1,a=" + a);
            System.out.println("無參構造方法在執行a=" + a);
        }
     /**
      * 有參構造
      * @param n
      */
     public Demo(String n) {
            this(n, "呼叫帶參構造方法2,a=" + a);
            System.out.println("帶參構造方法1在執行a=" + a);
        }
         /**
          * 有引數構造
          * @param s1
          * @param s2
          */
        public Demo(String s1, String s2) {
            System.out.println(s1 + ";" + s2);
        }
        
        public static void main(String[] args) {
            Demo demo = null;   //JVM載入類進入java虛擬機器
            System.out.println("下面new一個Test例項:");
            demo = new Demo();
        }

}

執行構造器(構造方法)的時候,在執行方法體之前存在隱式三步
1,super語句,可能出現以下三種情況:
1)構造方法體的第一行是this語句,則不會執行隱式三步,
2)構造方法體的第一行是super語句,則呼叫相應的父類的構造方法,
3)構造方法體的第一行既不是this語句也不是super語句,則隱式呼叫super(),即其父類的預設構造方法,這也是為什麼一個父類通常要提供預設構造方法的原因;
2,初始化非靜態變數
3,構造程式碼塊
由此可知,構造程式碼塊優先於構造方法的方法體,但是this關鍵字跟super關鍵字不能同時出現,而且只能在程式碼的第一行。如果出現了this關鍵字,隱式三步就不會執行。

當遞迴呼叫多個構造方法的時候,構造程式碼塊只會在最後的(也即方法體第一行不是this語句的)那個構造方法執行之前執行!


相關推薦

靜態程式碼構造程式碼構造方法載入執行順序研究

構造程式碼塊是給所有的物件進行初始化,也就是說,所有的物件都會呼叫同一個程式碼塊。只要物件一創立,就會呼叫這個程式碼塊。 package com.inphase.construct; public class Demo {     private static int

SpringIOC容器初始化之後和銷燬之前幾種方法執行順序

1.搭建一個簡單的Spring環境 2.定義一個介面及其實現類 package com.roger.service; public interface SpringLifeCycleService { void springLifeCycle(); } package co

當沒有繼承關係時靜態靜態方法、非靜態方法構造方法、普通方法執行順序

<span style="font-size:18px;">package test; /** * 不含有繼承時,各種方法(靜態塊,靜態方法,非靜態程式碼塊,構造方法,普通方法)的執行順序 * */ public class uExt

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

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

JAVA父類子類靜態程式碼靜態變數、構造方法執行順序

1、第一個檔案Print.java public class Print {    public Print(String s){        System.out.print(s + " ");    }} 2、第二個檔案Test1.java public 

靜態程式碼程式碼構造器、main方法執行順序

java物件的初始化順序 (1)類載入之後,按從上到下(從父類到子類)執行被static修飾的語句; (2)當static語句執行完之後,再執行main方法; (3)如果有語句new了自身的物件,將從上到下執行構造程式碼塊、構造器(兩者可以說繫結在一起)。 看程式碼:

java類載入和例項化:靜態程式碼、初始化程式碼構造方法執行順序

java中第一次例項化一個物件時,靜態程式碼塊、初始化塊、屬性的初始化、構造方法,再加上如果父類也有這些東西,天,到底執行順序是什麼? 來一段程式碼試一試就知道了: public class LoadingTest { public static void main(

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

        在學習Java基礎期間,子父類的靜態程式碼塊、構造程式碼塊、構造方法的執行順序容易混淆,現在通過一段程式來說明它們的執行順序。 一、先看一個簡單的靜態測試程式: class Fa

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

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

Java面試題 靜態代碼 構造代碼 構造方法執行順序

ons col 繼承 ring end bsp const extends div JAVA中的靜態代碼塊 構造代碼塊 構造方法執行順序: 靜態代碼塊(類加載時執行)>>構造代碼塊>>構造方法 下面展示一個簡單的例子,推薦大家動手運行一遍: pub

淺析java中靜態方法靜態方法構造方法執行順序問題

https://blog.csdn.net/qq_42401622/article/details/81190406 對於java中的靜態方法,非靜態方法和構造方法的理解: 靜態方法是隨著的java中虛擬機器的類的載入而載入,是跟隨繫結在一起的。 public class Main{ s

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

sys spa 靜態 tro oid 代碼 繼承 system line class A { public A() { System.out.println("class A"); } { System.out.println("I‘m A class"); } s

Java類中的靜態屬性、靜態程式碼塊塊、非靜態屬性、非靜態程式碼塊塊、建構函式在初始化時的執行順序

序言   前幾天在複習J2SE的時候,看到了這個Java類在new的過程中,靜態域、靜態塊、非靜態域、非靜態塊、建構函式的執行順序問題。就想著自己總結寫一下,便於以後查閱總結:    以下是我整理好的結果;在java類new一個物件的過程中,它們的執行順序如下:     (當

關於類中靜態、非靜態構造方法執行順序

幾大原則   一、靜態成員變數(Static)  1、靜態成員變數為類變數,所有物件共享同一記憶體空間 2、靜態成員變數的宣告和定義僅在首次載入類時執行一次 3、首次載入類時首先對所有靜態成員變數根據型別預設賦初值,然後再對有右值的附右值 二、靜態初始塊 1、靜態初始

測試框架Unitest的執行原理以及多個測試類中的執行順序以及簡化方法

單元測試單元測試(unit testing)是指對軟體中的最小可測試單元進行檢查和驗證。對於單元測試中單元的含義,一般來說,要根據實際情況去判定其具體含義,如C語言中單元指一個函式,Java裡單元指一個類,圖形化的軟體中可以指一個視窗或一個選單等。總的來說,單元就是人為規定的

多繼承父類構造方法執行順序

code pri span 都是 例子 父類 一次 沒有 pan 1 class a: 2 def __init__(self): 3 print(‘a‘) 4 5 class b(a): 6 def __init__(sel

【Java基礎】程式碼構造程式碼靜態程式碼

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

Java中動態程式碼構造程式碼靜態程式碼之間的執行順序

Java中動態程式碼塊,構造程式碼塊,靜態程式碼塊之間的執行順序 /** * Java中動態程式碼塊,構造程式碼塊,靜態程式碼塊之間的執行順序 * @author Administrator * */ class HelloA { public HelloA() { Sys

Java基礎---面向物件(面向物件物件匿名物件封裝建構函式構造程式碼thisstaticmain幫助文件靜態程式碼單例)

一. 面向物件概念: 面向物件其實是一種思考的思想,早期思想是面向過程。 面向過程注重的是過程,過程所涉及的行為,也就是功能。 【例項】:面向過程: 1. 把冰箱開啟 2. 把大象放入 3. 冰箱關起來      面向物件: 開啟冰箱,儲存,關閉都是對冰箱的操作,是冰箱的行為

Java中構造方法程式碼靜態執行順序

class A{ public A(){ System.out.println("class A");//父類構造方法 } { System.out.println("I am A class ");//父類構造塊