- 代碼塊概念
- 代碼塊分類
- 普通代碼塊
- 構造代碼塊
- 靜態代碼塊
- 同步代碼塊
代碼塊概念
在java中,{ } 括起來的代碼被稱為代碼塊
代碼塊分類
普通代碼塊
類中方法的方法體
public class Main{
public static void main(String[] args) {
{
...普通代碼塊
}
}
}
普通代碼塊使用不多,這里不過多講解
構造代碼塊
也叫:實體代碼塊
定義在類中的代碼塊(不加修飾符)
構造代碼塊一般用于初始化實體成員變數
public class Person {
String name;
String sex;
int age;
{ //構造代碼塊
name = "花花";
sex = "女";
age = 3;
}
}
構造代碼塊會在創建物件時被呼叫,每次創建時都會被呼叫,優先于類建構式執行
驗證:
public class Person {
String name;
String sex;
int age;
{
this.name = "花花";
this.sex = "女";
this.age = 3;
}
public static void main(String[] args) {
Person person1 = new Person();
Person person2 = new Person();
Person person3 = new Person();
}
}
打斷點除錯代碼,你會發現:person物件均被初始化

使用列印再次驗證:
{
this.name = "花花";
this.sex = "女";
this.age = 3;
System.out.println("我是實體代碼塊!!");
}

提供構造方法:
public Person() {
System.out.println("我是構造方法!!!");
}
輸出結果:

以上驗證了 構造代碼塊會在創建物件時被呼叫,每次創建時都會被呼叫,優先于類建構式執行
JVM層面理解:

編譯器在編譯代碼時,會將實體代碼塊中的內容拷貝到構造方法第一條陳述句前
多個實體代碼塊最侄訓按照定義的先后順序合并成一份,并將其拷貝到每個構造方法中
驗證:
public class Demo {
int a;
{
a = 10;
System.out.println("實體代碼塊1");
}
{
System.out.println("實體代碼塊2");
}
public static void main(String[] args) {
Demo demo = new Demo();
}
}

就地初始化
//就地初始化
public class Person {
String name = "嗯哼";
String sex = "Unknown";
int age = 0;
//
{ //實體代碼塊
this.name = "花花";
this.sex = "女";
this.age = 3;
System.out.println("我是實體代碼塊!!");
}
//構造方法
public Person(){
System.out.println("我是構造方法!!!");
}
public static void main(String[] args) {
Person person1 = new Person();
Person person2 = new Person();
Person person3 = new Person();
}
}
JVM層面理解:


編譯期間,編譯器會將就地初始化的內容拷貝到構造方法中,且拷貝在實體代碼塊之前
靜態代碼塊
用 static{ } 包裹起來的代碼片段
只會執行一次,靜態代碼塊優先于構造代碼塊執行,一般用于初始化靜態成員變數
//靜態代碼塊
static {
System.out.println(money);
money = 100;
System.out.println(money);
System.out.println("我是靜態代碼塊!!!");
}
輸出結果:

打斷點,看除錯程序:

靜態代碼塊在類加載時只執行一次
在類加載階段執行,在編譯階段時,編譯器會將多個靜態代碼塊按照定義的先后次序依次合并,最終放在生成的方法中
驗證:
public class Demo {
static int b;
static {
b = 20;
System.out.println("靜態代碼塊1");
}
static {
System.out.println("靜態代碼塊2");
}
public static void main(String[] args) {
Demo demo = new Demo();
}
}

總結:
- 靜態代碼塊不管生成多少個物件,其只會執行一次
- 靜態成員變數是類的屬性,因此是在JVM加載類時開辟空間并初始化的
- Java代碼在經過編譯器編譯之后,如果要運行必須先要經過類加載子系統加載到JVM中才能運行
- 如果一個類中包含多個靜態代碼塊,在編譯代碼時,編譯器會按照定義的先后次序依次合并,最終放在生成的<>方法中,該方法在類加載時呼叫,并且只呼叫一次
補充:

javac:
用純 Java 語言撰寫的一個編譯器
.
按照 Java 語言的語法對源檔案進行檢測,是否違反語法規范
若不符合Java語法規范,則編譯失敗—報錯;
若符合,則按照位元組碼檔案規范生成相對應的位元組碼檔案
編譯程序:簡單了解Java編譯原理
同步代碼塊
(后面再來進行補充~~)

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/301275.html
標籤:java
