2013-10-16 3 views
0

아무도 나에게 "보호 된"단어가 필요한 이유를 설명 할 수 있습니까? 정확하게 이해하면기본 액세스와 동일한 액세스 권한을 제공하는 경우 Java에서 "보호 된"단어의 요점은 무엇입니까?

기본 액세스 : 동일한 패키지 내의 클래스에서 사용할 수 있습니다.

보호 된 액세스 : 동일한 패키지의 기본 액세스 + 모든 패키지의 상속 된 클래스 (하위 클래스)에서 사용할 수 있습니다. 기본적으로 동일한 패키지에서 동일한 액세스를 기본 액세스로 가져옵니다.

언제 사용해야합니까? 코드 스타일에 맞습니까? 당신이 상속의 관점에서 그것으로 일할 것이라는 점을 표시 하시겠습니까?
감사합니다.


package secondPack; 

import firstPack.First; 

public class Second extends First{ 
    public static void main(String [] args){ 
     First f=new First(); 
//  f.Chat(); 
//  System.out.println(f.a); 
    } 
} 

package firstPack; 

public class First { 
    protected int a; 
    protected void Chat(){ 
     System.out.println("Here I am"); 
    } 
} 

나는 그것을 테스트하기 위해이 코드를 사용했다. 그것은 작동하지 않았다.

+1

메모를 다시 읽으십시오. –

+0

http://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html – Pshemo

답변

0

문제는 First 클래스 인스턴스와 First 클래스 참조를 통해 보호 된 멤버에 액세스하려고 도자기이다. Second 클래스는 First과 동일한 패키지에 없기 때문에 기본 클래스 인스턴스의 보호 된 필드에 액세스 할 수는 없지만 First 클래스 (여기에는 protected ones 포함)에서 상속 된 자체 필드에 대한 액세스 권한이 있습니다.

First f = new First(); 
f.chat();//chat is protected in base class. 

같은 일이 Second 클래스 컴파일하지만, 두 번째 클래스는 상속 된 멤버에 액세스 할 수 있기 때문에 뭔가

public void test() { 
    a = 1; // have access to inherited protected field or 
    chat(); // methods of base class 
} 

public static void main(String[] args) { 
    Second f = new Second(); 
    f.chat(); 
    System.out.println(f.a); 
} 

같이 확인하지 않습니다.

main 메서드의 코드는 First과 동일한 패키지의 클래스 또는 클래스 만 보호되므로 해당 멤버에 액세스 할 수 있기 때문에 Second 클래스에 배치되어 있기 때문에 코드가 작동합니다. 이 코드

class Test{ 
    public static void main(String[] args) { 
     Second f = new Second(); 
     f.chat(); 
     System.out.println(f.a); 
    } 
} 

같은 다른 클래스 내부에 배치됩니다 그래서 경우 (Test가 확장되지 않았거나 First으로 동일한 패키지에 있지 않기 때문에 보호 된 멤버에 액세스 할 수)는 컴파일하지 않습니다.

2

protected은 동일한 패키지에있는 서브 클래스가 아닌 모든 하위 클래스에서 볼 수 있습니다.

+0

다른 패키지에서 클래스를 상속하려고 시도했지만 작동하지 않았습니다. –

+0

@ GeorgeRevkov 테스트를 위해 사용한 코드를 보여주십시오. – Pshemo

+0

테스트 용 코드를 첨부했습니다. –

0

protected 개질제 다음 동일한 패키지 또는 그들이 지칭되는 클래스의 모든 서브 클래스 (즉, 동일한 패키지 또는 다른 패키지)에 다른 클래스 액세스. 테스트 코드

참조

enter image description here