2014-03-30 1 views
1

호기심에 다음 코드개인 변수 내부 클래스 : 값 설명?

public class OuterClass{ 
    int i; 
    public void printme(){ 
    System.out.println("Outerclass"); 
    i+=20; 
    System.out.println(i); 
     class InnerClass extends OuterClass { 
      public void printme(){ 
       System.out.println("InnerClass"); 
       i+=10; 
       System.out.println(i); 
      } 
     } 

     InnerClass second = new InnerClass(); 
     second.printme();  
     System.out.println("Outerclass-2"); 
     System.out.println(i); 

     return; 
    } 

    public static void main(String []args){ 
     System.out.println("start"); 
     OuterClass first = new OuterClass(); 
     first.printme(); 

    } 


} 
에 대한

출력은 이유에

시작 InnerClass 10 20 Outerclass Outerclass-2 20

그러나 INT 경우 내가 출력을 개인 선언 is

start 외부 클래스 20 InnerClass 30 Outerclass-2 30

누군가 설명 할 수 있습니까?

답변

3

필드에 액세스 한정자가 없으면 기본 표시가 있습니다.

InnerClass#printme()의 범위에서 하위 클래스의 메서드로 액세스 할 수 있습니다. 그래서

i+=10; 

은 0

private 분야에 초기화 된 InnerClass 인스턴스의 필드를 액세스하는 그래서 InnerClass 자체에 액세스 할 수 없습니다, 서브 클래스에 표시되지 않습니다. 그러나 InnerClassOuterClass 본문에있는 내부 클래스이기 때문에 둘러싸는 인스턴스의 필드에 액세스 할 수 있습니다. 그래서

i+=10; 

OuterClass 인스턴스의 필드에 액세스합니다.

+1

에 대한 문서의 일부에서 봐 here, 나는 당신에게 느린 키보드를 보낼 것입니다. 당신은 항상 이런 대답으로 나를 때리는 것 같습니다. –

+1

@DavidWallace Stackoverflow의 서버에서 길 건너편에 살고 있습니다. –

3

private 필드는 sub-class에서 액세스 할 수 없지만 내부 클래스에서 액세스 할 수 있습니다.

당신이

int i; 

// in InnerClass extends Outerclass 
i += 10; // access the parent of this InnerClass 

이 그래서 경우

private int i; 

// in InnerClass extends Outerclass 
i += 10; // access the OuterClass as the parent is not accessible. 
2

확인합니다. 비공개가 아닌 경우 InnerClass에 의해 상속 된 iInnerClass 개체의 것입니다. private 인 경우 상속 될 수 없으므로, 조작 된 i은 포함 된 객체의 것입니다.

1

은 엄격한 내부 클래스가 아니며 일반적으로 클래스 본문의 선언에서 알려져 있습니다. 이 경우에는 local class이고 실제로 내부 클래스의 일종이지만 완전히 다른 규칙이 적용됩니다. 이 문제는 상속과 그에 따른 그림자 변수에 관한 문제입니다.

default (없음) 수정자를 사용하여 클래스를 확장하면이 필드에 액세스 할 수 있으므로 효과적으로 수퍼 클래스의 필드를 볼 수 있습니다.

필드가 private으로 선언 된 경우 하위 클래스는이를 볼 수 없지만 새로운 개체가 기본값 0으로 시작되도록 OutterClass을 확장하므로 고유 한 값을 갖습니다.당신이 저에게 당신의 주소를 제공하는 경우

Shadowing and local classes

+0

기술적으로 내부 클래스입니다. 이것이 인 클로징 인스턴스의 필드에 액세스 할 수있는 이유입니다. [모든 로컬 클래스는 내부 클래스입니다 (8.1.3).] (http://docs.oracle.com/javase/specs/jls/se7/html/jls-14.html#jls-14.3) –

+0

@SotiriosDelimanolis you 맞아 - 수정 됐어. –