>

클래스를 포함하는 인스턴스 필드의 가시성을 Anonymous 내부 클래스(AIC)에 더 잘 이해하고 싶습니다.

AIC가 포함하는 클래스의 인스턴스 ( (익명) 내부 클래스를 사용하는 것이 언제 누수 안전합니까? ). 이 논리를 사용하면 AIC가 정적 메소드 내에서 인스턴스화되는 경우에도 포함 클래스의 인스턴스 필드에 액세스 할 수 있어야합니다. 그러나 컴파일러에서 오류가 발생하여 이것을 테스트하는 방법을 찾을 수 없습니다.

예를 들어, 아래 코드에서 다음과 같은 결과를 얻습니다 :"정적 컨텍스트에서 정적 필드에서 's'를 참조 할 수 없습니다"AIC의 () 방법 :

public interface TestInterface {
    void print();
}

public class AICTest {
    public String s = "something";
    public static void main( String[] args ) {
        new TestInterface() {
            @Override
            public void print() {
                System.out.println( s ); **<-- compilation error**
            }
        }.print();
    }
}

위의 예에서 AIC 인스턴스가 's'에 액세스 할 수 있는지 제안 하시겠습니까?

편집/답변 정적 메소드가 클래스 멤버에 액세스하고 인스턴스 메소드가 인스턴스 및 클래스 멤버에 액세스 할 수 있음을 알고 싶습니다. 혼란은 AIC가 클래스 객체를 포함하는 것에 대한 암시 적 참조를 항상 가지고 있다는 일반적인 진술에 관한 것이 었습니다. 이것은 정적 방법 내에서 AIC가 초기화 된 경우가 아닙니다. @shmosel은 내 질문에 답변하는 링크를 공유했습니다 ( Java 정적에서 익명의 내부 클래스를 만들 수 있습니까? ) :"따라서 정적 컨텍스트의 익명 클래스는 정적 중첩 클래스와 거의 동일하므로 둘러싼 클래스에 대한 참조를 유지하지 않습니다. 기술적으로 정적 클래스는 아니지만 ".


  • 답변 # 1

    's'는 인스턴스 변수이므로에서 's'를 읽으려면 AICTest 인스턴스가 있어야합니다. 다음은 잠재적으로 어디서나 올 수있는 기존 AICTest 객체에 액세스하도록 수정 된 예제를 나타내는 예제입니다.

    class AICTest {
        public String s = "something";
        public static void main( String[] args ) {
            AICTest aic = new AICTest();
            new TestInterface() {
                @Override
                public void print() {
                    System.out.println(aic.s);
                }
            }.print();
        }
    }
    
    
    명확하게, 'main'을 실행해도 AICTest의 인스턴스가 생성되지 않습니다. AICTest의 인스턴스를 만들려면 어딘가에 '새로운'작업을 수행해야합니다.

    또 다른 옵션은 's'를 정적으로 만드는 것입니다. 그런 다음 특정 AICTest 객체와 연결되지 않으므로 AICTest 객체를 인스턴스화하지 않은 경우에도 존재합니다.

    class AICTest {
        public static String s = "something";
        public static void main( String[] args ) {
            new TestInterface() {
                @Override
                public void print() {
                    System.out.println(s);
                }
            }.print();
        }
    }
    
    

    알다시피, 가시성 수정자는 추가하지 않았습니다. 가시성에 대한 당신의 생각은 건전했습니다. 그렇지 않으면 's'에 액세스하는 것이 합리적이라면 코드에 가시성이 있습니다. 여기서 문제는 가시성과 아무 관련이 없습니다.

  • 답변 # 2

    원하는 것이 아닐 수도 있지만 다음과 같이 할 수 있습니다 :

    interface TestInterface {
        void print();
    }
    class AICTest {
        public String s="something";
        public static void main(String[] args) {
            AICTest aicTest=new AICTest();
            new TestInterface() {
                @Override public void print() {
                    System.out.println(aicTest.s);
                }
            }.print();
        }
    }
    
    

  • 답변 # 3

    혼란은 AIC가 클래스의 객체를 포함하는 것에 대한 암시 적 참조가 항상 가지고 있다는 일반적인 철학에 관한 것이 었습니다. 이것은 정적 방법 내에서 AIC가 초기화 된 경우가 아닙니다. @shmosel은 내 질문에 대답하는 링크를 공유했습니다 (Java에서 익명 내부 클래스를 정적으로 만들 수 있습니까?). "정적 컨텍스트의 익명 클래스는 정적 중첩 클래스와 거의 동일합니다. 기술적으로 정적 클래스가 아니더라도 포함 클래스입니다. ".

관련 자료

  • 이전 c++ - 파생 클래스에서 연산자 새로 만들기/삭제 재정의
  • 다음 angularjson에서 다른 모든 구성 설정에 대한 설명서를 어디서 찾을 수 있습니까?