익명클래스 예제

이제 Animal 클래스의 인스턴스를 만들었지만, 이 클래스에서 파생된 클래스인 Dog: 기존 클래스를 확장하거나 인터페이스를 구현할 수 있도록 합니다. 괄호에서 확장하려는 클래스의 생성자에서 필요한 매개 변수를 지정합니다. 상황 및 재사용에 따라 여전히 더 나은 방법일 수 있습니다) 이 코드는 가장 중요한 예제에서 작업에 대한 참조를 대체합니다. Thread() 생성자 내의 익명 내부 클래스는 별도의 클래스를 갖는 대신 Runnable 인터페이스를 구현하고 run() 메서드를 재정의하는 명명되지 않은 개체를 반환합니다. 메서드 run()에는 스레드에 필요한 작업을 수행하는 문이 포함됩니다. 앞서 언급했듯이 인스턴스 초기화자는 익명 클래스를 지원하기 위해 도입된 Java 구문의 또 다른 특수 한 부분입니다. 이 장의 앞에서 설명한 것처럼 인스턴스 초기화자는 클래스 정의 내의 곱슬 받침대 내에 포함된 초기화 코드 블록입니다. 클래스에 대 한 인스턴스 초기화자의 내용은 자동으로 만들어진된 기본 생성자를 포함 하 여 클래스에 대 한 모든 생성자에 자동으로 삽입 됩니다. 익명 클래스는 생성자 정의를 할 수 없으므로 기본 생성자가 됩니다.

인스턴스 초기화자를 사용하면 익명 클래스에 대한 생성자를 정의할 수 없다는 사실을 해결할 수 있습니다. 둘러싸는 범위의 로컬 변수에 액세스하고 지역 클래스와 같은 익명 클래스의 멤버 선언 및 액세스하면 익명 클래스가 변수를 캡처할 수 있습니다. 그들은 둘러싸는 범위의 로컬 변수에 동일한 액세스 할 수 있습니다 : 우리는 우리의 응용 프로그램에서 클래스의 깨끗한 계층 구조를 달성하기 위해 일반적인 사용 사례와 매우 구체적인 것들에서 익명의 클래스에 내부 클래스를 사용해야합니다. 내부 클래스를 사용할 때 둘러싸는 클래스의 데이터를 더 세밀하게 캡슐화할 수 있습니다. 최상위 클래스에서 내부 클래스 기능을 정의하는 경우 둘러싸는 클래스는 일부 멤버의 공개 또는 패키지 가시성을 가져야 합니다. 당연히, 그것은 매우 감사 하거나 심지어 허용 되지 않는 상황이 있다. 위의 Hello 클래스는 아래와 같이 추상 클래스일 수도 있습니다. 익명 내부 클래스를 정의하는 이상하게 보이는 구문을 예로 들어 보겠습니다. 다음 예제 코드에서 Dog 참조 변수 개는 Dog의 인스턴스가 아니라 익명의 내부 하위 클래스의 개를 나타냅니다. 익명 내부 클래스는 다음 시나리오에서 사용됩니다: 일반/일반 클래스와 익명 내부 클래스의 차이: 익명 클래스에는 이름이 없으므로 익명 클래스에 대한 생성자 정의할 수 없습니다.

클래스에 생성자가 필요한 경우 대신 로컬 클래스를 사용해야 합니다. 그러나 인스턴스 초기화자를 생성자의 대신으로 사용할 수 있는 경우가 많습니다. 사실, 인스턴스 초기화는 바로 이 목적을 위해 언어에 도입되었습니다.