靜態程式碼塊,構造程式碼塊,構造方法的載入執行順序研究
構造程式碼塊是給所有的物件進行初始化,也就是說,所有的物件都會呼叫同一個程式碼塊。只要物件一創立,就會呼叫這個程式碼塊。
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基礎---面向物件(面向物件,類,物件,匿名物件,封裝,建構函式,構造程式碼塊,this,static,main,幫助文件,靜態程式碼塊,單例)
一. 面向物件概念: 面向物件其實是一種思考的思想,早期思想是面向過程。 面向過程注重的是過程,過程所涉及的行為,也就是功能。 【例項】:面向過程: 1. 把冰箱開啟 2. 把大象放入 3. 冰箱關起來 面向物件: 開啟冰箱,儲存,關閉都是對冰箱的操作,是冰箱的行為
Java中構造方法,程式碼塊,靜態塊的執行順序
class A{ public A(){ System.out.println("class A");//父類構造方法 } { System.out.println("I am A class ");//父類構造塊