1. 程式人生 > 實用技巧 >內部類訪問外部類的方法

內部類訪問外部類的方法

  作為一個工作了8年的程式設計師,內部類也用過,但是內部類訪問外部類在看原始碼的時候都很少看到了,震驚之餘也感嘆自己的技術不行啊

  一 起因

  突然想起來自己在中興的時候做SDN,當時是自己寫netty定時往網元傳送心跳。突然就想到了當時用的是Jdk的ScheduledThreadPoolExecutor

  也是心血來潮就想著看看原始碼吧

  實現定時的邏輯在ScheduledFutureTask.run()

  

public void run() {
            boolean periodic = isPeriodic();
            if (!canRunInCurrentRunState(periodic))
                cancel(
false); else if (!periodic) ScheduledFutureTask.super.run(); else if (ScheduledFutureTask.super.runAndReset()) { setNextRunTime(); reExecutePeriodic(outerTask); } }

  注意了,這個 方法reExecutePeriodic是定義在ScheduledThreadPoolExecutor

中的,而ScheduledFutureTask是 定義在ScheduledThreadPoolExecutor中的內部類。看到這裡我懵了

  內部類的方法裡直接訪問外部類的方法??貌似我之前都沒有注意過。

void reExecutePeriodic(RunnableScheduledFuture<?> task) {
        if (canRunInCurrentRunState(true)) {
            super.getQueue().add(task);
            if (!canRunInCurrentRunState(true) && remove(task))
                task.cancel(
false); else ensurePrestart(); } }

二 驗證

  利用工具我們就驗證下

  程式碼如下 。在專案工程下產生兩個檔案Person.class,Person$InnerClass.class

public class Person {
    
    private class InnerClass {
        
    }

  執行javap結果如下

  

  能看到內部類中持有一個外部類型別的成員變數,這就說的通了可以直接訪問外部類的方法了