자바 의 권한 수정자(proctected)예제 상세 설명

머리말
대부분:https://blog.csdn.net/justloveyou_/article/details/61672133。그리고 이 블 로 그 를 바탕 으로 자신의 이 해 를 더 했다.
권한 제어 표
수식어
본 류
가방 종류
상속 류
기타
private

×
×
×
없 음(기본 값)


×
×
protected



×
public




proctected 에 대하 여
최근 Effective Java 를 보다 가protected수정자 에 대한 문제 가 발생 했 습 니 다.이 문제 에서 그것 에 대한 인식 은 내 가 이전에 그것 에 대한 인식 과 약간의 차이 가 있다.그 러 니까 여기 기록 해 봐.
자바 언어 를 소개 하 는 많은 책(자바 프로 그래 밍 사상 포함)은 모두 proctected 에 대한 소개 가 비교적 간단 하 다.기본적으로 모두 한 마디 이다.즉,proctected 에 의 해 수 정 된 구성원 들 이 이 가방 과 그 하위 클래스 에 대해 볼 수 있다 는 것 이다.이런 견 해 는 너무 모호 해서 종종 사람들 에 게 오 해 를 살 수 있다.실제로 proctected 의 가시 성 은 두 가지 에 있다.
  • 부모 류 의 proctected 구성원 은 가방 에서 볼 수 있 고 하위 류 에 대해 볼 수 있다.
  • 하위 클래스 와 부모 클래스 가 같은 가방 에 있 지 않 으 면 하위 클래스 에서 하위 클래스 인 스 턴 스 는 부모 클래스 에서 물 려 받 은 proctected 방법 에 접근 할 수 있 으 며,부모 클래스 인 스 턴 스 의 proctected 방법 에 접근 할 수 없습니다.
  • proctected 멤버 와 관련 된 호출 을 만 났 을 때 먼저 이 proctected 멤버 가 어디에서 왔 는 지,그 가시 적 범위 가 무엇 인지 확인 한 다음 에 현재 용법 이 가능 한 지 판단 할 수 있 습 니 다.
    여기 서 한 가지 의문 은 상술 한 결론 의 두 번 째 점 이다.어떻게 보면 비교적 빙빙 돌 고 심지어 약간 모순 이 있 지만 아래 의 몇 가지 예 를 본 후에 이 해 는 더욱 깊 어 질 것 이다.
    예시 1
    p1/Father1.java
    
    package basic.testprotected.p1;
    
    public class Father1 {
     protected void f() {} //   Father1  protected  
    }
    p1/Son1.java
    
    package basic.testprotected.p1;
    
    public class Son1 extends Father1{}
    p11/Son11.java
    
    package basic.testprotected.p11;
    
    import basic.testprotected.p1.Father1;
    
    public class Son11 extends Father1{}
    p1/Test1.java
    这里写图片描述
    먼저(1)(3)을 보면 그 중의 f()방법 은 클래스 Father 1 에서 계승 되 었 는데 그 가시 성 은 패키지 p1 과 그 하위 클래스 Son 1 과 Son 11 이 고 f()방법 을 호출 한 클래스 Test 1 이 있 는 패키지 도 p1 이기 때문에(1)(3)에서 컴 파일 되 었 다.즉,우리 가 가방 을 바 꾸 면,예 를 들 어 Test 11.자바 가 p11 아래 에 있 으 면 접근 할 수 없다 는 것 이다.다음 과 같다.
    这里写图片描述
    그 다음 에(2)(4)을 보면 그 중의 clone()방법의 가시 성 은java.lang가방 과 그 모든 자 류 이 고 문장son1.clone();son11.clone();에 대해 이들 의 clone()은 류 Son 1,Son 11 에서 볼 수 있 지만 Test 1 에 대해 서 는 볼 수 없 기 때문에(1)(3)처 의 컴 파일 이 통과 되 지 않 는 다.즉,Son 1 이나 Son 11 이라는 두 가지 유형 에서clone()방법 을 호출 하면 컴 파일 하여 통과 할 수 있다.
    这里写图片描述  
    사실 여기까지 내 가 만난 문 제 는 이미 기본적으로 해결 되 었 다.내 가 만난 상황 은 이곳 의 예시 코드 와 똑 같 기 때문이다.
    예시 2
    p2/MyObject2.java
    
    package basic.testprotected.p2;
    
    public class MyObject2 {
     protected Object clone() throws CloneNotSupportedException{
     return super.clone();
     }
    }
    p22/Test2.java
    这里写图片描述  
    (1)의 경우 clone()방법 은 클래스 MyObject 2 자체 에서 나 온 것 이기 때문에 가방 p2 및 MyObject 2 의 하위 클래스 로 볼 수 있 습 니 다.Test 2 는 MyObject 2 의 하위 클래스 이지 만 Test 2 에 서 는 부모 류 MyObject 2 의 proctected 방법 clone()을 방문 할 수 없 기 때문에 컴 파일 이 통과 되 지 않 습 니 다.(2)Test 2 에서 부모 클래스 MyObject 2 에서 물 려 받 은 clone()을 방문 하기 때문에 컴 파일 이 통 과 됩 니 다.그래서 여기 서 위 에서 제시 한 두 번 째 결론 을 잘 논술 했다.
    하위 클래스 와 부모 클래스 가 같은 가방 에 있 지 않 으 면 하위 클래스 에서 하위 클래스 인 스 턴 스 는 부모 클래스 에서 물 려 받 은 proctected 방법 에 접근 할 수 있 으 며,부모 클래스 인 스 턴 스 의 proctected 방법 에 접근 할 수 없습니다.
    왜 이러 고 이러 고 어떻게 설명해 야 합 니까?
    나 는 이것 이 하위 클래스 에 대한 보 이 는 정 의 를 생각해 야 할 것 이 라 고 생각한다.먼저 구조 함 수 를 추가 하고 이 구조 함수 에서 clone 방법 을 방문 할 수 있 습 니 다.이 방법 은MyObject2에서 나 옵 니 다.
    这里写图片描述  
    그래서 Test 22 를 하나 더 써 서 MyObject 2 에서 계승 한 다음 에 다시 쓰 는 방법testSuperClone()은 다음 과 같다.
    这里写图片描述  
    이 두 사람 사이 에는 아직도 약간의 차이 가 있 는 것 같다.그래서 저 는 하위 클래스 의 인 스 턴 스 를 볼 수 있 습 니 다.즉,하위 클래스 에서 하위 클래스 의 인 스 턴 스 를 통 해 해당 하 는 proctected 방법 을 방문 할 수 있 습 니 다.
    예시 3
    p3/MyObject3.java
    
    package basic.testprotected.p3;
    
    import basic.testprotected.p33.Test3;
    
    public class MyObject3 extends Test3 {}
    p33/Test3.java
    这里写图片描述  
    (1)에 대해 말하자면,clone()방법 은 클래스 Test 3 에서 왔 기 때문에,그 가시 성 은 패키지 p33 과 그 하위 클래스 MyObject 3 이 고,(1)은 바로 p33 의 클래스 Test 3 에서 호출 되 며,같은 패키지 에 속 하 며,컴 파일 이 통과 되 었 다.
    예시 4
    p4/MyObject4.java
    
    package basic.testprotected.p4;
    
    import basic.testprotected.p44.Test4;
    
    public class MyObject4 extends Test4 {
     protected Object clone() throws CloneNotSupportedException {
     return super.clone();
     }
    }
    p44/Test4.java
    这里写图片描述  
    (1)에 대해 말하자면,clone()방법 은 클래스 MyObject 4 에서 나 온 것 이기 때문에,그 가시 성 은 패키지 p4 와 그 하위 클래스(여기에 하위 클래스 가 없 음)이 고,클래스 Test 4 는 패키지 p44 에 있 기 때문에 가시 성에 만족 하지 않 고,컴 파일 이 통과 되 지 않 는 다.
    예시 5
    p5/MyObject5.java
    
    package basic.testprotected.p5;
    
    public class MyObject5 {
     protected Object clone() throws CloneNotSupportedException{
     return super.clone();
     }
    }
    p5/Test5.java
    这里写图片描述  
    (1)에 대해 말하자면,clone()방법 은 클래스 MyObject 5 에서 나 온 것 이기 때문에,그 가시 성 은 패키지 p5 와 그 하위 클래스(여기에 하위 클래스 가 없 음)이 고,클래스 Test 5 도 패키지 p5 에 있 기 때문에 가시 성 을 만족 시 키 고 컴 파일 을 통과 한다.
    예시 6
    
    package p6;
    
    class MyObject6 extends Test6{}
    
    public class Test6 {
     public static void main(String[] args) {
     MyObject6 obj = new MyObject6();
     obj.clone(); // Compile OK -------(1)
     }
    }
    (1)의 경우 clone()방법 은 클래스 Test 6 에서 나 왔 기 때문에 그 가시 성 은 패키지 p6 와 그 하위 클래스 MyObject 6 이 고 클래스 Test 6 도 패키지 p6 에 있 기 때문에 가시 성 을 만족 시 키 고 컴 파일 을 통과 했다.
    예시 7
    
    package p7;
    
    class MyObject7 extends Test7 {
     public static void main(String[] args) {
     Test7 test = new Test7();
     test.clone(); // Compile Error ----- (1)
     }
    }
    
    public class Test7 {
    }
    (1)에 대해 말하자면,clone()방법 은 클래스 Object 에서 나 온 것 이기 때문에,이 clone()방법의 가시 성 은 패키지 java.lang 과 그 하위 클래스 Test 7 이다.클래스 MyObject 7 은 이 범위 내 에 있 지 않 기 때문에,가시 성 을 만족 시 키 지 못 하고,컴 파일 이 통과 되 지 않 는 다.
    총결산
    자바 의 권한 수정자(proctected)에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 자바 권한 수정자(proctected)내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 응원 바 랍 니 다!

    좋은 웹페이지 즐겨찾기