Здесь я создаю экземпляр моего класса
Нет, вы не создаете экземпляр своего абстрактного класса здесь. Скорее вы создаете экземпляр анонимного подкласса вашего абстрактного класса. И затем вы вызываете метод из вашей ссылки на абстрактный класс, указывающий на объект подкласса .
Это поведение четко указано в JLS - Раздел № 15.9.1 : -
Если выражение создания экземпляра класса заканчивается в теле класса, то создаваемый экземпляр класса является анонимным классом. Затем:
- Если T обозначает класс, то объявляется анонимный прямой подкласс класса с именем T. Это ошибка времени компиляции, если класс, обозначенный как T, является конечным классом.
- Если T обозначает интерфейс, то объявляется анонимный прямой подкласс Object, который реализует интерфейс с именем T.
- В любом случае, тело подкласса - это ClassBody, указанный в выражении создания экземпляра класса.
- Класс, который создается, является анонимным подклассом.
Акцент мой.
Также в JLS - Раздел № 12.5 вы можете прочитать о процессе создания объекта . Я приведу одно утверждение из этого здесь: -
Всякий раз, когда создается новый экземпляр класса, для него выделяется пространство памяти с местом для всех переменных экземпляра, объявленных в типе класса, и всех переменных экземпляра, объявленных в каждом суперклассе типа класса, включая все переменные экземпляра, которые могут быть скрыты.
Непосредственно перед возвращением ссылки на вновь созданный объект в качестве результата указанный конструктор обрабатывается для инициализации нового объекта с помощью следующей процедуры:
Вы можете прочитать о полной процедуре по ссылке, которую я предоставил.
Чтобы практически увидеть, что создаваемый класс является анонимным подклассом , вам просто нужно скомпилировать оба ваших класса. Предположим, вы поместили эти классы в два разных файла:
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
конструктор «s, тип выполнения объекта на самом делеA
. Только временный однако.