2012-09-14 2 views

답변

23

final 변수는 값을 가질 수 있지만 일단 할당되면 최종 변수를 다른 값으로 재 할당 할 수 없습니다. 예를 들어

:

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

final은 객체 인스턴스 변수에 사용될 수있다. 클래스의 마지막 필드는 생성자 본문이 실행되기 전에 설정되어야합니다. 마지막 필드에는 이 아니며에는 최종 변수에 새 값을 설정할 수 없으므로 암시 적 설정자가 생성됩니다.

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

관련 문제