2013-02-18 1 views
1

나는 분명히이에 분명하지만, 주어진 누락 : java protected 이것이 비 상속을 통해 작동하는 이유는 무엇입니까?

package a; 
public class Class1 { 
    protected int a=1; 
} 

package b; 
import a.*; 

public class Class2 extends Class1 { 
    Class2() { 
     Class1 c1=new Class1(); 
     Class2 c2=new Class2(); 
     System.out.println(a);  //1 
     System.out.println(c1.a); //2 
     System.out.println(c2.a); //3 
    } 
} 

내가 // 1이 때문에 상속을 통해 사용에 괜찮 알고는 상속을 통해 액세스되지 않는 있기 때문에 //이 실패하지만, 이유를 // 3 ok? 나는 변수 a가 새로운 객체를 통해 액세스되고 Class1에 상주한다고 생각 했습니까?

감사합니다.

+0

은 실제 질문과 관련이 없지만이 생성자를 호출하면 'StackOverflowError'가 발생합니다. – jlordo

+0

예, 감사합니다. 나는 그것을 메인에 놓았지만 코드 줄 수를 줄이고 줄에 넣을 수 있도록했다 // 1 :) –

답변

4

클래스 내에서 객체를 조작 할 때 비공개 객체를 포함하여 모든 속성에 대한 모든 액세스 권한을 갖게됩니다. c2Class2의 인스턴스이며 Class2 코드 내부에서 조작하므로 보호 된 속성을 볼 수 있습니다.

+0

감사합니다. 따라서 데이터 숨기기가 없다고 가정 할 때 Class2는 Class1을 모두 상속하므로 'a'는 Class2의 일부가되므로 효과적으로 보호 된 멤버가됩니다. –

+0

'개인적인 것을 포함합니다. '-> Sorry ?? –

+0

@RohitJain'Test'라는 클래스가 있고'private int abc; '라고 선언 된 속성을 가지고 있다면 변수'Test t = new Test();를 선언하고't.abc = 123; '당신이 클래스'Test' 내부에 있다면 –

4

Class2 어떤 객체 Class1-A이기 때문에,이 범위 default, publicprotected과 함께 Class 1의 멤버 변수 모두를 액세스 할 수있다.

게다가 범위/상속성을 사용하여 게임을하는 클래스의 개체로 작업하여 범위 및 상속 규칙을 이해하려고 시도하는 것은 좋은 생각이 아닙니다. 타사를 통한 방식과 다른 방식으로 작동하기 때문입니다. (가장 일반적으로 사용하는 것입니다.) 예를 들어

가이 허용된다

public class Something { 
    private int something; 

    public int stealSomething(final Something otherthing) { 
     return otherthing.something; 
    } 
} 

는이 테스트에 사용하는 클래스의 계층 구조가 아닌, 세 번째 클래스를 만들어보십시오.

+0

건배. 나는 이것이 하위 클래스를 생성하고 오류를 관찰 할 때 기본 클래스를 참조 유형으로 사용하는 것이 보통이라고 생각합니다. –

1

나는이 문제를 이해하지 못한다.

Class1에는 'a'라는 변수가 있습니다. 그것이 'protected'이기 때문에, 그 변수는 Class1의 모든 객체와 Class1을 확장하는 클래스의 객체 내에서 볼 수 있습니다.

'a'가 비공개 인 경우 Class1을 확장하는 클래스의 객체에는이 방식으로 표시되지 않습니다.

+0

다른 패키지의 하위 클래스에 없음 –

+0

"Class2 extends Class1"- 서브 클래스이므로 다른 패키지는 여기에 관계 없습니다. – arcy

3

왜 // 3 ok입니까?

왜 안 괜찮습니까? Class2Class1의 서브 클래스이므로 protected 필드의 Class1Class2의 인스턴스를 통해 액세스 할 수 있습니다. 그리고 그것이 당신이 여기서하고있는 일입니다. c2Class2의 인스턴스이고 a 필드가 표시됩니다.

참고 : protected 멤버에 직접적인 서브 클래스 액세스 할 수, 같은 패키지에 있는지 또는 다른 패키지이다.

나는 변수 a가 새로운 객체

그래, 그 사실을 통해 액세스하고 생각했다.

및 a는 Class1에 상주합니까?

정말 여기에 중요하지 않습니다. 마찬가지로 aClass2 인스턴스에 액세스 할 수 있으며 유효합니다.

참고로 코드의 길이는 StackOverflowError입니다. 당신은 그것을 돌볼 필요가 있습니다.

+0

예, 감사합니다. 나는 그것을 주에 넣었다. 그러나 코드 줄 수를 줄이고 // 줄에 넣을 수 있도록했다. // 이것은 단지 코드의 실제 비트가 아니라 –

+0

@Neil이다. 승인. 그럼 괜찮아. –