여기, 내 수업의 인스턴스를 만들고 있습니다
아니요, 여기서 추상 클래스의 인스턴스를 만들지 않습니다. 오히려 추상 클래스 의 익명 서브 클래스 인스턴스를 작성하는 것 입니다. 그런 다음 추상 클래스 참조에서 하위 클래스 객체를 가리키는 메소드를 호출 합니다 .
이 동작은 JLS 섹션 15.9.1 에 명확하게 나와 있습니다 .
클래스 인스턴스 작성 표현식이 클래스 본문으로 끝나면 인스턴스화되는 클래스는 익명 클래스입니다. 그때:
- T가 클래스를 나타내는 경우 T로 명명 된 클래스의 익명 직접 서브 클래스가 선언됩니다. T로 표시된 클래스가 최종 클래스 인 경우 컴파일 타임 오류입니다.
- T가 인터페이스를 나타내는 경우 T로 명명 된 인터페이스를 구현하는 Object의 익명 직접 서브 클래스가 선언됩니다.
- 두 경우 모두 서브 클래스의 본문은 클래스 인스턴스 작성 표현식에 제공된 ClassBody입니다.
- 인스턴스화되는 클래스는 익명 서브 클래스입니다.
강조합니다.
또한 JLS 섹션 12.5 에서 객체 생성 프로세스 에 대해 읽을 수 있습니다 . 여기에서 하나의 진술을 인용하겠습니다 :-
새 클래스 인스턴스가 작성 될 때마다 클래스 유형에 선언 된 모든 인스턴스 변수 및 클래스 유형의 각 수퍼 클래스에 선언 된 모든 인스턴스 변수 (숨겨 질 수있는 모든 인스턴스 변수 포함)를위한 공간이있는 메모리 공간이 할당됩니다.
새로 작성된 오브젝트에 대한 참조가 결과로 리턴되기 직전에 표시된 생성자가 다음 프로 시저를 사용하여 새 오브젝트를 초기화하도록 처리됩니다.
내가 제공 한 링크에서 전체 절차에 대해 읽을 수 있습니다.
실제로 인스턴스화되는 클래스가 Anonymous SubClass 임을 확인하려면 두 클래스를 모두 컴파일하면됩니다. 해당 클래스를 두 개의 다른 파일에 넣었다고 가정하십시오.
My.java :
abstract class My {
public void myMethod() {
System.out.print("Abstract");
}
}
Poly.java :
class Poly extends My {
public static void main(String a[]) {
My m = new My() {};
m.myMethod();
}
}
이제 두 소스 파일을 모두 컴파일하십시오.
javac My.java Poly.java
이제 소스 코드를 컴파일 한 디렉토리에 다음 클래스 파일이 표시됩니다.
My.class
Poly$1.class // Class file corresponding to anonymous subclass
Poly.class
해당 클래스를 참조하십시오 Poly$1.class
. 아래 코드를 사용하여 인스턴스화 한 익명 서브 클래스에 해당하는 컴파일러가 생성 한 클래스 파일입니다.
new My() {};
따라서 다른 클래스가 인스턴스화되고 있음이 분명합니다. 단지 그 클래스에는 컴파일러가 컴파일 한 후에 만 이름이 지정됩니다.
일반적으로 클래스의 모든 익명 서브 클래스는 다음과 같은 방식으로 이름이 지정됩니다.
Poly$1.class, Poly$2.class, Poly$3.class, ... so on
이 숫자는 해당 익명 클래스가 묶는 클래스에 나타나는 순서를 나타냅니다.
B
추상적 인 한에서A
, 건설 부분에서 의B
실행으로 구성되어 인스턴스A
의 생성자를, 객체의 실행시의 형태는 사실이다A
. 그러나 일시적입니다.