자바 베이스-new 다른 패키지에 있고 보호된 구성 방법만 있는 클래스 대상 (익명 내부 클래스 사용)

6719 단어 JavaSE

카탈로그

  • 카탈로그
  • 앞말
  • 구현 프로세스
  • 확장
  • 지식 포인트 확장 또는 참조
  • 전언


    어떻게 하면 서로 다른 가방에 있고 보호된 구조 방법만 있는 클래스의 대상을 new할 수 있습니까?어떻게 실현되는지 설명하기 전에 일의 연유를 말해 보시오.다음은 어떻게 실현하는지 설명할 것이다.후속으로 묘사한 내용에 문제가 있으면 많은 독자들이 인내심을 가지고 지적하여 독자에게 불편을 가져다 줄 수 있으니 양해해 주십시오.gson을 사용하여 json 문자열을 해석할 때 다음과 같은 코드를 사용합니다.
    Gson gson = new Gson();
    List orderDetailList = new ArrayList<>();
    orderDetailList = gson.fromJson(orderForm.getItems(), new TypeToken<List>() {}.getType());

    그 중에서 가장 눈길을 끄는 것은 바로 이 부분의 코드이다.
    new TypeToken<List>() {}.getType()

    여기에 익명 내부 클래스TypeToken를 사용했습니다. protected 클래스 원본을 보면 이 클래스에는 new 수식의 무참한 구조 방법만 존재합니다. 정상적인 상황에서 우리는 서로 다른 가방new에서 이러한 대상을 나타냅니다. (물론 제가 가리키는 것은protected 사용 호출된 구조 방법은 com.wm103.test 수식입니다.그러면 익명 내부류를 사용하는 방법을 가르쳐 드리겠습니다.

    실현 과정


    구현 프로세스를 보다 잘 설명하기 위해 먼저 다음과 같은 클래스, Supper Class를 만들었습니다.
    package com.wm103.test;
    
    public class SupperClass {
        private String message;
    
        protected SupperClass() {
            System.out.println("supper class init.");
        }
    
        public void print() {
            System.out.println("This is supper class.");
            System.out.println("message: " + this.getMessage());
        }
    
        public String getMessage() {
            return this.message;
        }
    
        public void setMessage(String message) {
            this.message = message;
        }
    }

    마스터 클래스, MainClass를 다시 만들고 com.wm103 패키지에서 다음을 수행합니다.
    package com.wm103;
    
    import com.wm103.test.SupperClass;
    
    public class MainClass {
    
        public static void main(String[] args) {
            new SupperClass();
        }
    }

    직접new SupperClass() IDE에서 이와 같은 힌트를 보실 수 있을 것 같습니다.
    'SupperClass()' has protected access in 'com.wm103.test.SupperClass'
    SupperClass() 구조 방법은 protected 접근 권한이고 MainClassSupperClass는 같은 가방에 없기 때문에 직접적으로new SupperClass() 접근할 수 없다.그럼 우리 어떻게 해야 되지?익명 내부 클래스를 사용합니다.다음과 같습니다.
    new SupperClass() {}.print();

    이러한 상황에서 우리는 익명 내부 클래스의 대상을 만들고 SupperClass 클래스의 print 방법을 호출할 수 있다.

    확장성


    익명 내부 클래스에서는 구조 함수를 정의할 수 없습니다.우리는 일반적으로 구조기를 이용하여 어떤 실례의 초기화 작업을 완성하는데 익명 내부 클래스에서 우리는 어떻게 초기화 작업을 실현해야 합니까?구성 코드 블록 사용!구조 코드 블록을 이용하면 익명 내부 클래스에 구조기를 만드는 효과를 얻을 수 있습니다.또는 위의 예를 예로 들면 다음과 같습니다.
    new SupperClass() {
        {
            setMessage("Hello Supper Class.");
            innerPrint();
        }
    
        public void innerPrint() {
            System.out.println("This is inner class.");
        }
    }.print();

    상기 익명 내부에서 초기화 작업을 위한 구조 코드 블록을 정의했고 자신만의 방법을 정의했다.이러한 예를 실행하면 콘솔에서 다음과 같은 출력 결과를 볼 수 있습니다.
    supper class init.
    This is inner class.
    This is supper class.
    message: Hello Supper Class.

    구체적인 절차는 다음과 같다. SupperClass의 구조 방법을 호출하여 초기화->익명 내부 클래스를 실행하는 구조 코드 블록->print 방법을 호출한다(방법은 구조 코드 블록에서 초기화된 메시지 값을 출력한다).익명 내부에서 SupperClass와 같은 이름의 메서드를 정의하면 다음과 같이 메서드 무시가 발생합니다.
    new SupperClass() {
        {
            setMessage("Hello Supper Class.");
            innerPrint();
        }
    
        public void innerPrint() {
            System.out.println("This is inner class.");
        }
    
        public void print() {
            System.out.println("inner class::print");
        }
    }.print();

    실행 결과는 다음과 같습니다.
    supper class init.
    This is inner class.
    inner class::print

    지식 포인트 확장 또는 참조

  • java 향상편(10)--익명 내부류 상해
  • 좋은 웹페이지 즐겨찾기