2014-03-12 3 views
6

다음은 최종 변수의 값을 변경하려고 시도한 코드입니다. 먼저 "a"다음에 "ab"를 인쇄합니다. 따라서 최종 변수의 값을 변경할 수 있다면 변수를 최종 변수로 선언 할 때 어떤 이점이 있습니까? 최종 키워드의 사용은 무엇입니까? 제발 도와 줄 수있는이 ???? ?????변경 가능한 클래스의 최종 변수 값을 변경할 수 있습니까?

package test_new; 
public class FinalVarValueChange { 
    public static void main(String[] args){ 
     final StringBuffer s=new StringBuffer("a"); 
     System.out.println("s before appending :"+s); 
     s.append("b"); 
     System.out.println("s after appending :"+s);  
    } 
} 
+2

https://stackoverflow.com/questions/2435163/why-can-final-object-be-modified – Brian

답변

14

final 컴파일 시도 (이것은 하지 C++ const에서와 동일하다).

변수를 final으로 표시하면 해당 변수에 다른 개체 참조를 할당 할 수 없다는 의미입니다.

예를 들어,이 코드는 컴파일되지 않습니다 :보다 Runnable, Callables를 사용하여 숙어를 잠글 때

final StringBuffer s=new StringBuffer("a"); 
s = new StringBuffer("another a"); /*not possible to reassign to s*/ 

그것은 유용 할 수 있습니다.

1

최종 변수/참조 의미는 다른 값을 해당 참조로 다시 지정할 수는 없지만 개체 상태를 변경할 수는 있습니다. 여기

, 당신은 StringBuffer 객체 s 내부 상태를

+0

예 먹 재 할당 어차피 ... 저를 도와 –

1

를 변경하는 마지막 키워드는 reference가 변경되지 않습니다 변수에 의해 유지되도록합니다. 참조 된 인스턴스의 state이 변경 될 수 있습니다. 찾으려는 대상은 참조 된 인스턴스의 immutability입니다. 이것은 인스턴스의 책임입니다.

3

final 수정 자란 변수를 변경할 수 없다는 의미입니다. 즉, 개체에 대한 참조, 즉 다른 변수를 동일한 변수에 할당합니다. 그러나 객체 자체의 상태를 변경할 수 있습니다.

0

'final'은 StringBuffer에 대한 참조 인 변수 sb를 참조합니다. 그것이 final이기 때문에 sb가 다른 StringBuffer를 참조하도록 할 수 없습니다. 그러나 sb가 현재 참조하고있는 StringBuffer 객체를 변경할 수 있습니다. 참조가 참조되는 오브젝트의 불변 중 어느 정도를 적용하지 않는 코드

final StringBuffer sb = new StringBuffer(); 
sb.append("abc"); 
sb.append("xyz"); 
sb = new StringBuffer(); 
+0

감사합니다 사람들을 refernce를하지 :)를 – Eagle

5

StringBuffer는 디자인에 따라 변경할 수 있으며 append 메서드는 내용을 변경하는 데 사용되는 메서드입니다. 이 객체의 호출 방법에서 당신을 중지하지 않습니다

객체의 경우
  • , 그것은 이 참조에 다른 객체를 할당 할 수 없습니다를 의미하지만 : 자바에서 최종이 어떤 변수

    입니다 .

  • 기본 유형 변수 (int, float, boolean 등)의 경우 여기에는 참조와 포인터 및 객체 메소드가 없기 때문에 변수의 값을 변경할 수 없다는 것을 의미합니다.

타고 추적 코드

final ObjectA objA = new ObjectA(); 

당신은 물론

objA.setXXX() //legal for a final variable objA 

의 setXXX의 부작용 아래() 메소드가 final 키워드에 의해 제어되지처럼이 객체의 메소드를 호출 할 수 이리.

그러나 후속 코드

final int a = 123; 

당신은

a = 234; //Not legal if a has been defined as a final int variable. 

다음과 같이이 변수에 새 값을 할당 할 수 없습니다 그러나 당신이 정의하는 경우가

다음과 같이 정수를 사용

아래와 같이 객체 a의 메소드를 호출 할 수 있습니다.

a.xxx() 

일반 말하기 최종 정의는 개체 및 기본 변수가 다릅니다.

+0

감사 로렌스에 대한 상세 설명... – Eagle