1. 程式人生 > 其它 >Java 基礎(程式碼塊)

Java 基礎(程式碼塊)

類的成員之四: 程式碼塊(或初始化塊)

1.程式碼塊的作用:用來初始化類、物件

2.代面樹如果有修飾的話,只能使用 static.

3.分類:靜態程式碼塊 VS 非靜態程式碼塊

4.靜態程式碼塊

內部可以有輸出語句
隨著類的載入而執行,而且只執行一次
作用: 初始化類的資訊
如果一個類中定義了多個靜態程式碼塊,則按照宣告的先後順序執行
靜態程式碼塊的執行要優先於非靜態程式碼塊的執行
靜態程式碼塊內只能呼叫靜態的屬性、靜態的方法,不能呼叫非靜態的結構

5.非靜態程式碼塊

內部可以有輸出語句
隨著物件的建立而執行
每建立一個物件,就執行一次非靜態程式碼塊
作用:可以在建立物件時,對物件的屬性等進行初始化
如果一個類中定義了多個非靜態程式碼塊,則按照宣告的先後順序執行
非靜態程式碼塊內可以呼叫靜態的屬性、靜態的方法、或非靜態的屬性、非靜態的方法

對屬性可以賦值的位置:
① 預設初始化
② 顯式初始化/⑤ 在程式碼塊中賦值
③ 構造器中初始化
④ 有了物件以後,可以通過 "物件.屬性" 或 "物件.方法"的方式,進行賦值

執行的先後順序:① - ②/⑤ - ③ - ④

例項化子類物件時,涉及到父類、子類中靜態程式碼塊、非靜態程式碼塊、構造器的載入順序:
由父及子,靜態先行。

BlockTest.java

package com.klvchen.java3;

public class BlockTest {
    public static void main(String[] args) {
        String desc = Person.desc;
        
        Person p1 
= new Person(); Person p2 = new Person(); System.out.println(p1.age); Person.info(); } } class Person{ String name; int age; static String desc = "我是一個人"; public Person() { } public Person(String name, int age) {
this.name = name; this.age = age; } //非 static 的程式碼塊 { System.out.println("hello, block - 1"); age = 1; eat(); desc = "我是一個愛學習的人"; info(); } { System.out.println("hello, block - 2"); } //static 的程式碼塊 static { System.out.println("hello, static block-2"); } static { System.out.println("hello, static block-1"); desc = "我是一個愛學習的人"; info(); // eat(); // name = "Tom"; } public void eat() { System.out.println("吃飯"); } @Override public String toString() { return "Person [name=" + name + ", age=" + age + "]"; } public static void info() { System.out.println("我是一個快樂的人!"); } }

StaticBlockTest.java

package com.klvchen.java3;

public class StaticBlockTest {
    public static void main(String[] args) {
        System.out.println("total = " + MyPerson.total);
        System.out.println("total = " + MyPerson.total);
    }

}

class MyPerson{
    public static int total;
    
    static {
        total = 100;
        System.out.println("in static block!");
    }
}