2012-09-14 20 views

回答

23

final變量可以包含任何值,但一旦賦值,最終變量就不能被重新分配給任何其他值。

例如:

main() { 
    final msg = 'hello'; 
    msg = 'not allowed'; // **ERROR**, program won't compile 
} 

final也可以在一個對象用於實例變量。在構造函數體運行之前,必須設置類的最後一個字段。最終字段將爲而不是有一個爲其創建的隱式setter,因爲您無法在最終變量上設置新值。

class Point { 
    final num x, y; 
    Point(this.x, this.y); 
} 

main() { 
    var p = new Point(1, 1); 
    print(p.x); // 1 
    p.x = 2; // WARNING, no such method 
} 

重要的是要認識到,final影響變量是很重要的,但不是通過對象指向的變量。也就是,final不會使變量的對象不可變。

例如:

class Address { 
    String city; 
    String state; 
    Address(this.city, this.state); 
} 

main() { 
    final address = new Address("anytown", "hi"); 
    address.city = 'waikiki'; 
    print(address.city); // waikiki 
} 

在上面的例子中,變量address被標記爲最終,所以它將總是指向由new Address("anytown", "hi")構造實例化的對象。但是,對象本身的狀態是可變的,所以改變城市是完全有效的。 final阻止的唯一的事情是重新分配address變量。

+0

「在構造函數體運行之前,必須設置類的最後一個字段。」 - 這是我投擲得最多的部分。儘管我在構造函數中設置了最終變量,但它並沒有出現,這是我得到錯誤的原因。 –

+0

@KevinSheehan我也是通過在構造函數之前設置最後一個字段而拋棄它的。對於那些試圖在構造函數級別執行此操作的人,如果state是最終變量,則可以這樣設置:Address(this.city):state =「Hawaii」; – djm