2013-06-13 1 views
1

는 나는 다음을 수행 할 수 있다고 알고왜 정적 최종 변수는 내부 classees에서 허용됩니다?

public class Indeed{ 
    private class inner { 
     static final int try1 = 10; 
    } 
} 

이유는 무엇입니까? 그러한 선언을 허용하는 것은 무엇입니까?

public void doThing() { 
    class LocalClass { 
     static final int try1 = 10; 
    } 
} 

코드의 그 비트의 정적 최종의 사용은 무엇을 : 은 또한 그것은 로컬 클래스에서 같은 일을 여전히 가능? 그러나 나는 내가 할 수있는 OCPJP7 시험이 그들이 사용하는 이유를 이해할 필요가, 내가 그들을 사용하지 않을 것입니다 확신합니다.

미리 감사드립니다.

+0

'static'과'final'을 이해합니다. 클래스가 삽입되면 정적 변수가 삽입되고 변경되지 않습니다. 해당 범위 내에서 액세스 할 수 있습니다. –

+3

글쎄, 여기에 다른 어떤 정적 변수가 있는데, 여기에는 수수께끼가 없습니다. – fge

+0

IMO, 정적 최종 변수가 내부 클래스 또는 메인 클래스에있는 경우 구별하는 이유는 무엇입니까? 그들은 보통 수업에서와 마찬가지로 내부 수업에서 같은 방식으로 사용되도록되어 있습니다. – RandomQuestion

답변

3

정적 변수의 목적은 클래스의 모든 인스턴스에 의해 공유 될 것입니다. 두 예제 모두에서 private 클래스/local 클래스의 여러 인스턴스를 가질 수 있으므로 지정된대로 인스턴스간에 정적 변수를 공유합니다. 무의미한 점은 한 번만 수업을 인스턴스화 할 수 있다는 것입니다. 그들은 상수 변수 (§4.12.4), 또는 컴파일시 에러가 발생하지 않는

JLS 8.1.3. : Inner Classes and Enclosing Instances

내부 클래스는 정적 멤버를 선언 할 수있다. (내부 클래스

  • 정적 변수가 동일한 외측 클래스 인스턴스의 모든 인스턴스들 사이에서 공유된다

I의 사양에 표시하는 방법은 다음 딜레마 대답하지 않아도되고 하지만 그들은 다른 외부 클래스 인스턴스에서 다른 값) 내부 클래스의

  • 정적 변수는 VM의 모든 기존 인스턴스, 무엇이든 자신의 외부 클래스 인스턴스 사이에 공유를 할 수 있습니다. 다행히
  • , 당신이 마지막을 선언 할 때, 당신은 모든 인스턴스에 대해 동일합니다 알고, 그래서 당신은이 문제에 대해 걱정할 필요가 없습니다. 그것이 허용 된 이유입니다. 질문에 대한

    +0

    왜 final이 허용 되나? – Rollerball

    1

    "왜 내부 클래스의 정적 필드가 최종해야 할"이 제한은 정적 멤버를 선언하지 않을 수 있습니다 in the JLS

    내부 클래스가 적혀있다

    , 그들은 일정하지 않는 변수 (§4.12.4) 또는 컴파일 타임 오류가 발생합니다. 왜

    그러나 이것은 우리에게 이야기하지 않습니다. 내부 클래스를 사용하는 방법에 대해 생각해 봅시다. 내가 이것을 쓰려고한다고 상상해보십시오. 나는이

    A one = new A(); 
    A two = new A(); 
    one.doStuff(1); 
    two.doStuff(2); 
    one.printX(); 
    two.printX(); 
    

    이 무엇을 을

    인쇄해야 할 때

    public class A{ 
        private class B{ 
        static x; 
        } 
        public void updateX(int y){ 
        B.x=y; 
        } 
        public void printX(){ 
        System.out.println(x); 
        } 
    } 
    

    어떻게됩니까? 1 번, 2 번 또는 2 번? X는 단 (B의 Klass 객체) 한 위치에 있어야하므로 정적이지만 B가 내부 클래스이기 때문에 그것은 A.의 인스턴스에 특정되어야static final final 필드가 허용되면 외부 클래스의 인스턴스 당 인스턴스 특정 Klass 개체를 만들어야합니다. 우리는하고 싶지 않아!

    고정 최종 필드는 따라서 B의 Klass 개체에 행복하게 살 수 있으며 변경할 수 없으므로 (최종) 외부 클래스의 모든 인스턴스에서 공유 할 수 있습니다.