Tutaj tworzę instancję mojej klasy
Nie, nie tworzysz tutaj instancji swojej klasy abstrakcyjnej. Zamiast tego tworzysz instancję anonimowej podklasy swojej klasy abstrakcyjnej. Następnie wywołujesz metodę z referencyjnego odwołania do klasy, wskazując obiekt podklasy .
To zachowanie jest wyraźnie wymienione w JLS - sekcja # 15.9.1 : -
Jeśli wyrażenie tworzenia instancji klasy kończy się na treści klasy, instancja klasy jest klasą anonimową. Następnie:
- Jeśli T oznacza klasę, deklarowana jest anonimowa bezpośrednia podklasa klasy o nazwie T. Jest to błąd czasu kompilacji, jeśli klasa oznaczona jako T jest klasą końcową.
- Jeśli T oznacza interfejs, wówczas deklarowana jest anonimowa bezpośrednia podklasa Object, która implementuje interfejs nazwany przez T.
- W obu przypadkach treścią podklasy jest ClassBody podane w wyrażeniu tworzenia instancji klasy.
- Instancja klasy jest anonimową podklasą.
Podkreśl moje.
Ponadto w JLS - sekcja # 12.5 można przeczytać o procesie tworzenia obiektów . Zacytuję tutaj jedno stwierdzenie: -
Za każdym razem, gdy tworzona jest nowa instancja klasy, przydzielana jest dla niej przestrzeń pamięci z miejscem na wszystkie zmienne instancji zadeklarowane w typie klasy i wszystkie zmienne instancji zadeklarowane w każdej nadklasie typu klasy, w tym wszystkie zmienne instancji, które mogą być ukryte.
Tuż przed zwróceniem odwołania do nowo utworzonego obiektu wskazany konstruktor jest przetwarzany w celu zainicjowania nowego obiektu przy użyciu następującej procedury:
O pełnej procedurze możesz przeczytać na podanym przeze mnie linku.
Aby praktycznie zobaczyć, że instancja klasy jest anonimową podklasą , wystarczy skompilować obie klasy. Załóżmy, że umieścisz te klasy w dwóch różnych plikach:
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();
}
}
Teraz skompiluj oba pliki źródłowe:
javac My.java Poly.java
Teraz w katalogu, w którym skompilowałeś kod źródłowy, zobaczysz następujące pliki klas:
My.class
Poly$1.class // Class file corresponding to anonymous subclass
Poly.class
Zobacz tę klasę Poly$1.class
. Jest to plik klasy utworzony przez kompilator odpowiadający anonimowej podklasie utworzonej przy użyciu poniższego kodu:
new My() {};
Jest więc jasne, że tworzy się inną klasę. Tyle, że ta klasa otrzymuje nazwę dopiero po kompilacji przez kompilator.
Ogólnie rzecz biorąc, wszystkie anonimowe podklasy w twojej klasie zostaną nazwane w następujący sposób:
Poly$1.class, Poly$2.class, Poly$3.class, ... so on
Liczby te oznaczają kolejność, w jakiej te anonimowe klasy pojawiają się w klasie zamykającej.
B
z abstrakcyjnego jedenA
, w trakcie części konstrukcji zB
instancji, który składa się z systememA
„s konstruktora typu wykonawcze obiektu jest faktycznieA
. Jednak tylko tymczasowo.