2011-04-24 6 views
5

내부 클래스는 클래스 내부에 정의 된 클래스이며 내부 클래스는 public, private, protected로 선언 할 수 있습니다. 내부 클래스가 private 및 protected로 정의 된 경우 외부 클래스가 내부 클래스의 멤버에 액세스 할 수 있습니까? 내부 클래스는 외부 클래스의 멤버에 액세스 할 수 있습니까?외부 클래스가 내부 클래스의 멤버에 액세스 할 수 있습니까?

+9

시도해 보셨습니까? 아마도 당신 자신처럼 빨리 시도 할 것입니다. – whirlwin

답변

13

, 할 수있는 외부 클래스 액세스 내부 클래스의 멤버?

예. 이러한 한정어는 외부 클래스에서 파생 된 클래스에서 내부 클래스의 가시성에만 영향을줍니다.

내부 클래스 액세스 멤버 외부 클래스 수 있습니까?

예, 어떤 인스턴스 메소드와 마찬가지로 private이 선언 된 것을 포함합니다.

+0

우리는 그냥 외부 클래스 또는 내부 클래스의 객체에 의해 내부 클래스 메서드를 호출 할 수 있습니다 @Hippo –

+0

@MuhammadBabar 내부 클래스의 객체로 – light

1

는 "A 중첩 된 클래스는 다른 클래스에서 정의 된 클래스입니다. 중첩 된 클래스 가 둘러싸는 클래스를 제공하는 유일한 존재한다. 중첩 클래스 이 다른 상황에서 유용 할 경우, 다음이해야 최상위 클래스가 네 중첩 클래스의 종류가 있습니다.. 정적 멤버 클래스, 비 정적 멤버 클래스, 익명 클래스, 지역 클래스를 제외한 모든 에게 제 1 종은 내부 클래스로 알려져있다 ".

는 (여호수아 블로흐, 책 효과적인 자바에서.) 질문에 대해서는

:이 직접 테스트하는 것은 매우 쉽습니다. 그러나 정적 컨텍스트에서 (참조가 아닌) 비 정적 멤버에 액세스하려고하거나 액세스 할 수없는 범위에있는 멤버에 액세스하려고하지 않는 한 대답은 예 (심지어 private 멤버의 경우)입니다. .

즉, =가 매우 기대됩니다. 내부 클래스는 개인 로 정의하고 보호하는 경우

21

일반적으로 내부 클래스의 비공개 필드에 액세스하거나 비공개 필드에 액세스 할 수 있습니다. 다음 코드는 이클립스에서 컴파일 :

이클립스에서 오류가 (이 설정은 바깥 쪽 형식의 액세스 할 수없는 멤버에 액세스 "라고, 당신이 치료하는 당신의 IDE/컴파일러는 필드에 대한 액세스를 구성 할 수 있습니다 말했다
public class Outer { 

    private int x; 

    public void f() { 
    Inner inner = new Inner(); 
    inner.g(); 
    inner.y = 5; 
    } 

    private class Inner { 
    private int y; 

    public void g() { x = 5; } 
    }  
} 

", 환경 설정 -> Java -> 컴파일러 -> 오류/경고 -> 코드 스타일)

+0

나는 이것을 시도하고, 안드로이드'에서이 오류를 줬어 읽기 시도 from field 'int com.backspace.memebook.MainActivity $ MyTask.counter'null 객체 참조에' –

1

예! 외부 클래스의 내부 클래스 멤버와 외부 클래스의 멤버 모두에 액세스 할 수 있습니다 (액세스 한정자와 관계 없음). 방금 필드 이름의 필드에 액세스 할 수 없습니다, 당신은 당신이 직접 내부 클래스에서 외부 클래스의 정적 필드에 액세스 할 수 있지만

InnerClass.staticInnerField 

처럼 접근 할 필요가 정적 중첩 클래스 그러나 , 필드 이름.

0

설명 일반 내부 클래스의 맥락에서 당신은 내부 클래스 직접에서 외부 클래스의 모든 필드에 액세스 할 수 있습니다

[정기적 인 내부 클래스가 그 내부에 선언 된 정적 멤버를 가질 수 없습니다]입니다.

class Outer { 
    private static int x = 0; 

    class Inner { 
    void print() { 
     System.out.println(x); // x can be directly accessed 
    } 
    } 

    public static void main(String[] args) { 
    new Outer().new Inner().print(); 
    } 
} 

Even Outer 클래스는 Inner 클래스의 모든 필드에 액세스 할 수 있지만 내부 클래스의 개체를 통해 액세스 할 수 있습니다.

class Outer { 
    private class Inner { 
    private int x = 10; 
    } 

    void print() { 
    Inner inner = new Inner(); 
    System.out.println(inner.x); 
    } 

    public static void main(String[] args) { 
    Outer outer = new Outer(); 
    outer.print(); 
    } 
} 
관련 문제