iT邦幫忙

2021 iThome 鐵人賽

DAY 10
0
自我挑戰組

Java SE系列 第 10

Day10:蛋糕上的櫻桃

今天來談談類別中的非主菜部分,沒有它們類別同樣可以運作,甚至可以說大部分的實務上不會用到這2個東西,但既然我們目標是要考證照,勢必需要了解一下的,那就是內部類別以及區塊。

  1. 內部類別(inner class)
    我們知道,在一個.java檔案中,可以定義多個類別,但僅能有一個類別定義為public。而一個class中可能包含有field,可能包含有method,甚至有static block以及non-static block。但就這樣而已嗎?
    其實在一個class裡面還可以定義class!這樣的class就稱為inner class。
class OuterClass{

    class InnerClass{
    
    }
    
}

而如果想要創建出inner class的實例,必須要先創建出外層class的實例後,才可創建inner class實例:

OuterClass outer = new OuterClass();
OuterClass.InnerClass inner = outer.new InnerClass();

以上的情況相當罕見,通常inner class會被定義為private,用來處理比較複雜的結構,不太會讓外部直接取用。若真要被外部取用的話,比較常見的是定義為static inner class:

class OuterClass{

    static class InnerClass{
 
    }
    
}

要注意只有內部類別才可以定義為static,外部類別沒辦法定義為static。而被定義為static的內部類別,就可以直接利用外部類別的類別名稱當作命名空間來創建實例:

OuterClass.InnerClass inner = new OuterClass.InnerClass();
  1. 區塊(block)
    在一開始學Java的時候,我們會很自然覺得{}只有用在定義class和method時才出現,通常要到JDBC時才會看到static block這樣的東西,然後就會看著它看很久,心想這鬼東西是合法的嗎?畢竟走到JDBC,通常代表學到滿後面了,我們會自以為對Java已經認識很多了XD
    這篇就來把這個騰空出現的{}來說明一下。
  • non-static block
    顧名思義就是非靜態的{},看看以下範例:
class Player{
 
    String name;
    
    {
        this.name = "Jack";
    }
    
}

這樣的block,代表在正要創建實例但尚未完成之前,就會先執行block裡面的內容,所以這個範例中,如果我們直接使用預設建構子來創建一個Player時,name會被指派為"Jack"。

  • static block
    靜態區塊則是在JVM載入.class檔時,就會先執行static block裡面的內容了,常見的用法就是當JDBC載入驅動的時候:
static{
    try{
        Class.forName("oracle.jdbc.driver.OracleDriver");
    } catch (ClassNotFoundException ce){
        ce.printStackTrace();
    }
}

上一篇
Day09:四驅車的殼
下一篇
Day11:伸縮自如的
系列文
Java SE30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言