2012-08-22 26 views
26

Javadoc Nesne sınıfı bir kamu no-arg yapıcı olduğunu bahseder. Ancak, Object'in kaynak kodunda açık bir kurucu yoktur. Açıkçası derleyici bunun için bir tane üretti. (Aşağıda gösterildiği gibi) bir yapıcı dönmek üzere zaman çağrı yığın izlemesi bakınız, ancak, o izlemesinde Object.<init> için bir çağrı bkz yoktur. Doktor diyor Java: Nesne sınıfı bir yapıcı var?

Yani soru Object sınıfının bir varsayılan kurucu yok edilir? Varsa, neden çağrı yığını izlemesinde görmüyorum?

public ConTest() 
{ 
    new Throwable().printStackTrace(); 
} 

Sonuç:

java.lang.Throwable 
    at ConTest.<init>(ConTest.java:8) 
    at ConTest.main(ConTest.java:16) 
+1

hmm teşekkür ederiz. Bir sınıf açıkça bildirilmesini yaparsa, Java derleyici otomatik olarak bir no-argüman yapıcı sağlayan varsayılan yapıcı çağrısında bulundu. Sınıfın başka bir üst öğesi yoksa, varsayılan olarak Nesne yapıcısı. – MimiEAM

+1

Birden fazla cevabı kabul etmek mümkün mü? Çünkü aşağıda verilen 4 cevabı kabul etmek istiyorum. – shrini1000

cevap

24

Süper kurucular alt/taban yapıcıları önce çalıştırılır. new Throwable().printStackTrace() çalıştırıldığında sizin örnekte Nesnenin yapıcısı zaten işletilmektedir. kodunuzun

daha açık bir sürümü: Zaten denmesinin nedeni

public ConTest() 
{ 
    super(); 
    new Throwable().printStackTrace(); // you will not see super() (Object.<init>) in this stack trace. 
} 
6

Sen, yığın izleme görmüyorum. Özel durum kodunuza atılır.

Kodunuz yazılı eşdeğerdir: süper sınıfın yapıcı sizin new Throwable().printStackTace() çağrısından önce denir, çünkü yığın izleme görmüyorum

public ConTest() { 
    super(); // this will call the Object constructor 
    new Throwable().printStackTrace(); 
} 
6

. Derleyicinin gerçekten yarattığı şey takip ediyor.

süper (yukarıda önerilen gibi
public ConTest() 
{ 
    super(); // This is the call to the base class constructor 
    new Throwable().printStackTrace(); // already back from the base class constructor 
} 
2

) yapıcı ve yöntem Fazla Bilgi için ilk çağrıdır here

Bir sınıfı derlemek

Java derleyicisi her kurucu için bir örnek başlatma yöntemini oluşturur sen sınıfın kaynak kodunda beyan eder. Yapıcı bir yöntem olmamasına rağmen, örnek başlatma yöntemi. Bu bir isim, <init> bir dönüş türü, boşluk ve doktor söylediği gibi

5

Evet Object sınıfının bir varsayılan kurucu oluşturulduğu yapıcı parametreleriyle eşleşen parametreleri kümesi vardır.

aşağıdaki olarak) bunu nesne sınıfı varsayılan yapıcısı (aradığını görebilirsiniz komut isteminde -c yarışma javap kullanarak kontrol edebilirsiniz bunu yaparken Insted biliyoruz gibi kodun Hat No bulunuyor: 1

C:\stackdemo>javap -c ConTest 
Compiled from "ConTest.java" 
public class ConTest extends java.lang.Object{ 
public ConTest(); 
    Code: 
    0: aload_0 
    1: invokespecial #1; //Method java/lang/Object."<init>":()V 
    4: new  #2; //class java/lang/Throwable 
    7: dup 
    8: invokespecial #3; //Method java/lang/Throwable."<init>":()V 
    11: invokevirtual #4; //Method java/lang/Throwable.printStackTrace:()V 
    14: return 

public static void main(java.lang.String[]); 
    Code: 
    0: new  #5; //class ConTest 
    3: dup 
    4: invokespecial #6; //Method "<init>":()V 
    7: astore_1 
    8: return 

} 
Tüm sınıflar en az bir kurucuya sahip http://docs.oracle.com/javase/tutorial/java/javaOO/objectcreation.html den