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

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

不能引用在不同方法中定義的內部類中的非final變量

不能引用在不同方法中定義的內部類中的非final變量

不能引用在不同方法中定義的內部類中的非final變量編輯:我需要更改幾個變量的值,因為它們通過計時器運行幾次。我需要通過計時器每次迭代不斷更新值。我無法將值設置為final,因為這會阻止我更新值,但是我收到了我在下面的初始問題中描述的錯誤:我以前寫過以下內容:我收到錯誤“不能引用在不同方法中定義的內部類中的非final變量”。這種情況發生在雙重調用價格和價格調用priceObject上。你知道我為什么會遇到這個問題。我不明白為什么我需要最后的聲明。此外,如果你能看到我想要做的是什么,我該怎么做才能解決這個問題。public static void main(String args[]) {     int period = 2000;     int delay = 2000;     double lastPrice = 0;     Price priceObject = new Price();     double price = 0;     Timer timer = new Timer();     timer.scheduleAtFixedRate(new TimerTask() {         public void run() {             price = priceObject.getNextPrice(lastPrice);             System.out.println();             lastPrice = price;         }     }, delay, period);}
查看完整描述

4 回答

?
侃侃爾雅

TA貢獻1801條經驗 獲得超16個贊

為避免奇怪的副作用,由匿名委托引用的java變量中的閉包必須標記為final,因此要lastPrice在計時器任務中引用和定價,需要將它們標記為final。

這顯然不適合你,因為你想改變它們,在這種情況下你應該考慮將它們封裝在一個類中。

public class Foo {
    private PriceObject priceObject;
    private double lastPrice;
    private double price;

    public Foo(PriceObject priceObject) {
        this.priceObject = priceObject;
    }

    public void tick() {
        price = priceObject.getNextPrice(lastPrice);
        lastPrice = price;
    }}

現在只需創建一個新的Foo作為final,并從計時器調用.tick。

public static void main(String args[]){
    int period = 2000;
    int delay = 2000;

    Price priceObject = new Price();
    final Foo foo = new Foo(priceObject);

    Timer timer = new Timer();
    timer.scheduleAtFixedRate(new TimerTask() {
        public void run() {
            foo.tick();
        }
    }, delay, period);}


查看完整回答
反對 回復 2019-05-28
?
隔江千里

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

在使用匿名類時,您只能從包含類訪問最終變量。因此,您需要聲明最終使用的變量(由于您要更改lastPriceprice,因此不適合您),或者不使用匿名類。

因此,您可以選擇創建一個實際的內部類,您可以在其中傳遞變量并以正常方式使用它們

要么:

對你的lastPriceprice變量有一個快速(在我看來很丑陋)的黑客攻擊,這就是聲明它如此

final double lastPrice[1];final double price[1];

在您的匿名類中,您可以像這樣設置值

price[0] = priceObject.getNextPrice(lastPrice[0]);System.out.println();lastPrice[0] = price[0];


查看完整回答
反對 回復 2019-05-28
?
汪汪一只貓

TA貢獻1898條經驗 獲得超8個贊

很好的解釋為什么你不能做你想要做的事已經提供。作為解決方案,可以考慮:

public class foo{
    static class priceInfo    {
        public double lastPrice = 0;
        public double price = 0;
        public Price priceObject = new Price ();
    }

    public static void main ( String args[] )
    {

        int period = 2000;
        int delay = 2000;

        final priceInfo pi = new priceInfo ();
        Timer timer = new Timer ();

        timer.scheduleAtFixedRate ( new TimerTask ()
        {
            public void run ()
            {
                pi.price = pi.priceObject.getNextPrice ( pi.lastPrice );
                System.out.println ();
                pi.lastPrice = pi.price;

            }
        }, delay, period );
    }}

似乎你可以做一個比這更好的設計,但想法是你可以將更新的變量分組到一個不會改變的類引用中。


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

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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