Aqui, eu estou criando instância da minha classe
Não, você não está criando a instância da sua classe abstrata aqui. Em vez disso, você está criando uma instância de uma subclasse anônima da sua classe abstrata. E então você está invocando o método em sua referência de classe abstrata apontando para objeto da subclasse .
Esse comportamento está claramente listado na JLS - Seção # 15.9.1 : -
Se a expressão de criação da instância de classe terminar em um corpo de classe, a classe que está sendo instanciada será uma classe anônima. Então:
- Se T denota uma classe, uma subclasse direta anônima da classe nomeada por T é declarada. É um erro em tempo de compilação se a classe indicada por T for uma classe final.
- Se T denota uma interface, uma subclasse direta anônima de Object que implementa a interface nomeada por T é declarada.
- Nos dois casos, o corpo da subclasse é o ClassBody fornecido na expressão de criação da instância de classe.
- A classe que está sendo instanciada é a subclasse anônima.
Ênfase minha.
Além disso, na JLS - Seção # 12.5 , você pode ler sobre o Processo de Criação de Objetos . Vou citar uma declaração a partir daqui:
Sempre que uma nova instância de classe é criada, o espaço de memória é alocado para ela, com espaço para todas as variáveis de instância declaradas no tipo de classe e todas as variáveis de instância declaradas em cada superclasse do tipo de classe, incluindo todas as variáveis de instância que podem estar ocultas.
Pouco antes de uma referência ao objeto recém-criado ser retornada como resultado, o construtor indicado é processado para inicializar o novo objeto usando o seguinte procedimento:
Você pode ler sobre o procedimento completo no link que forneci.
Para ver praticamente que a classe que está sendo instanciada é uma subclasse anônima , basta compilar as duas classes. Suponha que você coloque essas classes em dois arquivos diferentes:
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();
}
}
Agora, compile seus arquivos de origem:
javac My.java Poly.java
Agora, no diretório em que você compilou o código-fonte, você verá os seguintes arquivos de classe:
My.class
Poly$1.class // Class file corresponding to anonymous subclass
Poly.class
Veja essa classe - Poly$1.class
. É o arquivo de classe criado pelo compilador correspondente à subclasse anônima que você instanciaram usando o código abaixo:
new My() {};
Portanto, fica claro que há uma classe diferente sendo instanciada. Só que, essa classe recebe um nome somente após a compilação pelo compilador.
Em geral, todas as subclasses anônimas da sua classe serão nomeadas desta maneira:
Poly$1.class, Poly$2.class, Poly$3.class, ... so on
Esses números indicam a ordem em que essas classes anônimas aparecem na classe anexa.
B
de uma abstrataA
, durante a parte da construção daB
instância, que consisteA
no construtor da execução, o tipo de tempo de execução do objeto é realmenteA
. Apenas temporário no entanto.