>  Q&A  >  본문

oop - Java에서는 외부 클래스 메서드를 호출하는 익명 내부 클래스에 대한 의문이 있습니다.

오늘 저는 내부 클래스에 대해 배웠고 내부 클래스가 외부 클래스의 이것을 보유할 수 있으므로 OuterClass.this.medthod()를 내부 클래스에서 사용하여 해당 외부 클래스 메소드를 참조할 수 있다는 것을 배웠습니다. 하지만 코드를 작성했는데 실행할 수 있습니다. 그러나 호출 논리를 잘 이해하지 못합니다.

으아악

설계는 다음과 같습니다. 테스트 개체는 새로운 Speaker 익명 클래스 개체를 생성하는 Perform 메서드를 호출하고 개체는 해당 handlerAction 메서드를 호출하며 이 메서드의 매개변수는 Action 인터페이스이며 인터페이스는 작업을 재정의해야 합니다. 추상적인 방법. 테스트에 속하는 보고 방식을 사용했습니다. 출력은 정상입니다.

그렇다면 테스트 객체의 메소드에 익명 클래스의 로컬 객체가 있고, 로컬 객체 매개변수는 인터페이스를 구현하는 익명 클래스인지 알고 싶습니다. 왜 이 익명 클래스에서 보고서를 호출할 수 있나요? test.this 포인터를 보유하고 있나요?
알겠습니다. new Speaker().handleAction(new Action(){....여기 구현 로직은 test.this와 아무 관련이 없으며, test.this를 보유할 필요도 없습니다???

漂亮男人漂亮男人2712일 전989

모든 응답(1)나는 대답할 것이다

  • PHP中文网

    PHP中文网2017-05-17 10:09:37

    으아악

    new Speaker()는 익명 내부 클래스가 아니며 정확한 클래스 이름을 갖습니다. Speaker
    new Action(){}은 익명 내부 클래스이며 다음과 같습니다. 컴파일 중에 처리됩니다. 클래스 이름을 지정합니다(클래스 이름이 Test$1이라고 가정합니다. this.getClass()를 인쇄하여 확인할 수 있습니다).
    둘 사이의 차이점을 확인하세요. 익명 내부 클래스에는 추가 {}가 있습니다.
    new Action(){}이 테스트 개체의 범위에서 생성되므로 해당 외부 클래스는 Test입니다. new Speaker()不是匿名内部类,它有确切的类名Speaker
    new Action(){}是匿名内部类,会在编译的时候给它一个类名(我们假定它的类名叫Test,你可以打印this.getClass()看看)
    看出两者的区别了吗?匿名内部类多出了个{}。
    由于new Action(){}是在test对象的作用域里被创建的,所以它的外部类是Test。

    匿名内部类也有构造器,而且和普通类的构造器有点不一样,编译的时候会在匿名内部类的构造器的参数列表之前再插入一个参数,这个参数是外部类的对象的引用,编译之后这个类长这样:

            public void perform(){
                new Speaker().handleAction(new Action(){
                    @Override
                    public void action() {
                        report();//???为什么能调用report??
                    }
                });
            }

    new Action(){...}

    익명 내부 클래스에도 생성자가 있으며, 이는 일반 클래스의 생성자와 약간 다릅니다. 컴파일 시 익명 내부 클래스의 생성자의 매개변수 목록 앞에 다른 매개변수가 삽입됩니다. 이 매개변수는 객체에 대한 참조입니다. 컴파일할 때 클래스는 다음과 같습니다:

    으아악

    new Action(){...}은 실제로 Test$1을 생성하고 생성자를 통해 Test$1에 대한 테스트 개체 참조를 전달합니다🎜 으아악 🎜따라서 익명의 내부 클래스는 외부 클래스에 대한 참조를 보유하고 외부 클래스의 메서드를 호출할 수 있습니다🎜

    회신하다
    0
  • 취소회신하다