亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么在匿名類中只能訪問最終變量?

為什么在匿名類中只能訪問最終變量?

為什么在匿名類中只能訪問最終變量?a只能在這里決賽。為什么?如何a在onClick()不將其保留為私有成員的情況下重新分配方法?private void f(Button b, final int a){     b.addClickHandler(new ClickHandler() {         @Override         public void onClick(ClickEvent event) {             int b = a*5;         }     });}如何5 * a點擊它返回?我的意思是,private void f(Button b, final int a){     b.addClickHandler(new ClickHandler() {         @Override         public void onClick(ClickEvent event) {              int b = a*5;              return b; // but return type is void          }     });}
查看完整描述

3 回答

?
一只名叫tom的貓

TA貢獻1906條經驗 獲得超3個贊

有一個技巧允許匿名類更新外部作用域中的數據。

private void f(Button b, final int a) {
    final int[] res = new int[1];
    b.addClickHandler(new ClickHandler() {
        @Override
        public void onClick(ClickEvent event) {
            res[0] = a * 5;
        }
    });

    // But at this point handler is most likely not executed yet!
    // How should we now res[0] is ready?}

但是,由于同步問題,這個技巧不是很好。如果稍后調用handler,則需要1)如果從不同的線程調用處理程序,則同步對res的訪問2)需要有某種標志或指示res已更新

但是,如果在同一個線程中立即調用匿名類,這個技巧就可以了。喜歡:

// ...final int[] res = new int[1];Runnable r = new Runnable() { public void run() { res[0] = 123; } };r.run();System.out.println(res[0]);// ...


查看完整回答
反對 回復 2019-05-27
?
Helenr

TA貢獻1780條經驗 獲得超4個贊

匿名類是內部類,嚴格規則適用于內部類 (JLS 8.1.3)

使用但未在內部類中聲明的任何局部變量,形式方法參數或異常處理程序參數必須聲明為final。任何在內部類中使用但未聲明的局部變量必須在內部類的主體之前明確賦值。

我還沒有找到關于jls或jvms的原因或解釋,但我們知道,編譯器為每個內部類創建一個單獨的類文件,并且必須確保在此類文件上聲明的方法(在字節代碼級別上)至少可以訪問局部變量的值。

Jon有完整的答案 - 我保留這個未刪除的,因為有人可能對JLS規則感興趣)


查看完整回答
反對 回復 2019-05-27
  • 3 回答
  • 0 關注
  • 859 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號