第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決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貢獻(xiàn)1906條經(jīng)驗 獲得超3個贊

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

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?}

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

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

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


查看完整回答
反對 回復(fù) 2019-05-27
?
Helenr

TA貢獻(xiàn)1780條經(jīng)驗 獲得超4個贊

匿名類是內(nèi)部類,嚴(yán)格規(guī)則適用于內(nèi)部類 (JLS 8.1.3)

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

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

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


查看完整回答
反對 回復(fù) 2019-05-27
  • 3 回答
  • 0 關(guān)注
  • 856 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號