Burada, sınıfımın bir örneğini oluşturuyorum
Hayır, burada soyut sınıfınızın örneğini oluşturmuyorsunuz. Bunun yerine , soyut sınıfınızın anonim bir alt sınıfının bir örneğini oluşturuyorsunuz . Ve sonra soyut sınıf referansınızda şu yöntemi gösteren yöntemi çağırıyorsunuz: alt sınıf nesnesini .
Bu davranış, JLS - Bölüm # 15.9.1'de açıkça listelenmiştir : -
Sınıf örneği oluşturma ifadesi bir sınıf gövdesinde sona ererse, somutlaştırılan sınıf anonim bir sınıftır. Sonra:
- T bir sınıfı belirtirse, T adlı sınıfın anonim doğrudan alt sınıfı bildirilir. T ile belirtilen sınıf son sınıfsa, derleme zamanı hatasıdır.
- T bir arabirimi belirtirse, T adlı arabirimi uygulayan nesnenin anonim bir doğrudan alt sınıfı bildirilir.
- Her iki durumda da, alt sınıfın gövdesi, sınıf örneği oluşturma ifadesinde verilen ClassBody öğesidir.
- Gerçekleştirilen sınıf, anonim alt sınıftır.
Vurgu madeni.
Ayrıca, JLS - Bölüm # 12.5'te , Nesne Oluşturma Süreci hakkında bilgi edinebilirsiniz . Buradan bir ifade alıntılayacağım: -
Yeni bir sınıf örneği oluşturulduğunda, sınıf türünde bildirilen tüm örnek değişkenleri ve gizlenebilecek tüm örnek değişkenleri de dahil olmak üzere, sınıf türünün her üst sınıfında bildirilen tüm örnek değişkenleri için yer için bellek alanı ayrılır.
Sonuç olarak yeni oluşturulan nesneye yapılan bir başvuru döndürülmeden hemen önce, belirtilen kurucu aşağıdaki nesneyi kullanarak yeni nesneyi başlatmak üzere işlenir:
Tüm prosedürü sağladığım bağlantıdan okuyabilirsiniz.
Gerçekleştirilen sınıfın Anonim bir Alt Sınıf olduğunu pratik olarak görmek için her iki sınıfınızı da derlemeniz gerekir. Bu sınıfları iki farklı dosyaya koyduğunuzu varsayalım:
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();
}
}
Şimdi, her iki kaynak dosyanızı da derleyin:
javac My.java Poly.java
Şimdi kaynak kodu derlediğiniz dizinde aşağıdaki sınıf dosyalarını göreceksiniz:
My.class
Poly$1.class // Class file corresponding to anonymous subclass
Poly.class
Şu sınıfa bakın - Poly$1.class
. Aşağıdaki kodu kullanarak oluşturduğunuz anonim alt sınıfa karşılık gelen derleyici tarafından oluşturulan sınıf dosyasıdır:
new My() {};
Dolayısıyla, farklı bir sınıfın somutlaştırıldığı açıktır. Sadece bu derleme sadece derleyici tarafından derlendikten sonra bir isim verilir.
Genel olarak, sınıfınızdaki tüm anonim alt sınıflar şu şekilde adlandırılacaktır:
Poly$1.class, Poly$2.class, Poly$3.class, ... so on
Bu sayılar, bu anonim sınıfların çevreleyen sınıfta göründüğü sırayı belirtir.
B
soyut bir birindenA
, inşaat bölümü sırasında birB
çalışan oluşurlar: Örneğin,A
'ın yapıcı, nesnenin zamanı tür aslındaA
. Ancak sadece geçici.