2013-04-16 31 views
6

Neden sınıf parametrized kurucu varsa, Java varsayılan kurucu sağlamaz? İşte şu örneğiNeden sınıf parametrized kurucu varsa, Java varsayılan kurucu sağlamaz?

class A { 
    int a; 

    public A() { 
    } 

    public A(int val) { 
     a = val; 
    } 
} 

düşünün açıkça varsayılan kurucu eklemeniz gerekir. Java neden parametrized kurucuya sahip sınıf için varsayılan kurucu sağlamaz herhangi bir sebep var mı?

+0

Bunun bir kopya olduğunu sanmıyorum; soruyor * neden * özellik ne yaptığını söylüyor. – OrangeDog

+0

@OrangeDog Burada zorluk, OP'nin sorusuna verilen yanıttır: "Bir kurucu, bir kurucuyu açıkça tanımladığınızda bir varsayılan kurucuyu oluşturmaz çünkü bir varsayılan kurucunun tanımı" tanımlanmamıştır. bir diğeri'"*. (Onların "public A() {}" varsayılan bir kurucu değil.) OP muhtemelen terminolojiyi karıştırıyordu ve muhtemelen * aslında hiç tartışmasız kurucular hakkında sorular soruyordu. Belki OP'nin terminolojiyi karıştırdığını varsaymak için soru sorulmalıdır. – Radiodef

cevap

2

Sınıfınız herhangi bir tanımlama yapmıyorsa, Java size varsayılan bir kurucu verecektir.

herhangi bir yapıcınız varsa, (herhangi bir argüman olmadan bile) derleyici size başka bir tane vermez.

Bu şekilde çalışır, çünkü bu şekilde belirtildi. Bu konuyla ilgili daha fazla bilgiyi Language Specification

+4

OP, 'sınıf parametrized yapıcı' varsa, Java'nın varsayılan kurucu sağladığını bilir. Soru "neden" nedir? – Pshemo

9

adresinde bulabilirsiniz. Bunun nedeni, güvenlik ve arabirimin birleşimiyle ilgilidir. Derleyici, açıkça tanımladığınız yöntemleri size vermemelidir. Bir istisna, herhangi bir kurucu belirtmezseniz, kolaylık sağlayan bir argüman değildir. Bir kurucu belirtirseniz, derleyici başkalarını istemediğinizi varsayar.

5

Derleyici, her sınıf için otomatik olarak hiçbir arg kurucu sağlamazsa, sınıf tasarımını bozar. Tarayıcı sınıfını düşünün. Verileri okumak istediğiniz yerden belirleyebileceğiniz birkaç kurucu var. Derleyici ayrıca herhangi bir arg kurucu ekleyemezse, bu yapıcı ile başlatılan bir nesneden veri okumak için Scanner'ın yönteminden birini çağırdıktan sonra, veri kaynağı belirtilemeyeceği için bir istisna atılır.

2

Varsayılan bir kurucuya sahip olunmasının istenmeyeceği durumlar vardır. Dil, derleyiciye onu üretmemesini söylemenin bir yolunu sağlamalıdır. Açık bir yapıcının varlığı dışındaki bir göstergenin kullanılması, varsayılan olarak devre dışı bırakıldığında bir kurucu belirtme ihtiyacı gibi sorunlara yol açacaktır.

Geçerli düzenleme, varsayılan olarak devre dışı bırakıldığında başka bir kurucu olduğundan emin olarak bu sorunu ortadan kaldırır.

İlgili konular