2012-05-19 5 views
4
public class A{ 
    public static final int j; 
    public static int x; 
    static{ 
     j=9; 
    } 
    public A(int j) 
    { 
     j = j; 
    } 
    protected void print() 
    { 
      System.out.println(j); 
    } 
} 

이클립스에서 위의 코드를 시도하면 이클립스에서 "변수 j에 대한 할당이 효과가 없습니다"라는 표시가 생성자에 "j"를 초기화하는 데 사용됩니다.정적 최종 변수에 값 할당

변수 j가 효과가없는 이유를 말해주십시오.

+0

어쨌든이 코드는 무엇입니까? 나는 네가 원하는대로 할 것이라고 생각하지 않는다. – UNECS

+1

최종 변수는 나중에 변경 될 수 없습니다. 즉, 정적이 아닌 것으로 선언하면 최종 점이됩니다. 그런 다음 생성자 내에서 초기화해야하지만 인수 나 로컬 변수와 동일한 varname을 사용하면 해당 변수를 호출해야합니다. 인스턴스 변수에 대한 특정 참조 (이 경우 Aj 또는 j가 정적이 아닌 경우 this.j). – porfiriopartida

답변

0

final 변수는 한 번만 값을 할당 할 수 있습니다. 이는 static 변수에 대해 JVM을 실행하는 동안 한 번 의미하는 반면 생성자는 객체가 생성 될 때마다 실행됩니다.

+0

그렇다면 최종 필드 j가 이미 할당되었지만 표시되지 않지만 인스턴스 변수에는 해당하지 않는다는 오류가 표시되어야합니다. – chaitu

+0

오류가 표시되지 않는 이유를 설명해 주시겠습니까? – chaitu

+1

은 섀도 잉하지 않습니다. – UNECS

3

자체에 변수를 지정하면 nett 값에 아무것도 수행하지 않습니다.

0

this에 읽음을 갖고 싶을 수도 있습니다. 어떤 경우에는 경고가 생성 된 경우 귀하의 경우와 마찬가지로이 잘못 표시됩니다.

+0

이것은 'volatile'변수에 대해서만 유지됩니다. 여기서는 그렇지 않습니다. – michael667

+0

'x = x;'의 행에 뭔가가 생길 때마다 식 경고는 경고를 발생시킵니다. 그러나 모든 경우에 그것이 정확하지는 않습니다. 그들은 '휘발성'변수의 예를 제시함으로써 정당화된다.그러나이 경우에 볼 수 있듯이 여기에는 '최종 필드가 이미 할당되었을 수 있습니다.'또는 이와 비슷한 오류가 표시되어야합니다. –

+0

아니요. 연결된 기사에서 "변수가 휘발성 인 경우 경고가 잘못되었습니다"라고 표시됩니다. 휘발성 물질은 여기에 사용되지 않습니다. – michael667

6

파라미터 j섀도우 잉 클래스 구성원 j입니다. 다음 코드를 변경하려고하면

public A(int j) 
{ 
    A.j = j; 
} 
+1

또는'this.j' 아마도? – UNECS

+2

@UNECS 정적 멤버는 클래스가 아니라 인스턴스에 속합니다. – michael667

4

클래스 변수 J (정적 최종 INT의 J)가 정적 블록 값 9가 할당된다. 그것은 모두 유효합니다.

생성자에서 매개 변수 j는 자체에 할당되며 아무 효과가 없습니다. 대안 (그리고 당신이 의미하는 것으로 의심됩니다)은 다음과 같습니다.

public A(int j) 
{ 
    A.j = j; 
} 

여기서 매개 변수 j는 클래스 변수 j에 할당됩니다. 그러나 Java는 class 변수가 final이기 때문에 여기에서 불평 할 것입니다. 최종 키워드를 삭제하면 물론 효과가 있습니다. 그러나 지금은 흥미로워집니다 :

클래스 A의 인스턴스가 생성되지 않는 한 클래스 j의 값은 9가됩니다. 클래스의 인스턴스가 new 연산자를 통해 생성되는 순간 클래스 A의 모든 인스턴스는 클래스 변수 j에 대해 동일한 값을가집니다 (생성자를 보낸 것에 따라 다릅니다). j = j을 useing 동안

0

this.j = j;

를 사용하십니까 당신이의 필드 J를 원하는 경우, 두 개의 "J"들 같은, 단지 생성자의 매개 변수가 아니라 클래스 A의 필드하시기 바랍니다 있습니다 this.j을 사용하십시오.

+1

또는'A.j'는 클래스 멤버이므로 인스턴스 멤버가 아닙니다. –

관련 문제