2010-11-22 12 views
0

Bu kod parçacığı verildiğinde, neden bunun nedenini açıklayabilir misiniz?Yapıcının Özel kapsamı

Buradaki şey, sınıf kurucusunun özel olarak işaretlenmiş olmasıdır, bu yüzden onu yeni operatörle çağırmamızı engellememeli midir?

public class Alpha { 
protected Alpha() {} 
} 
class SubAlpha extends Alpha { 
private SubAlpha() {System.out.println("ok");} 
public static void main(String args[]) { 
    new SubAlpha(); 
} 
} 

Statik yöntem sınıfın bir parçası olduğu ve tüm özel alanları ve yöntemleri görebildiği için işe yarar. Bu "yeni" başlatma dışında hiç çalışmaz mı?

cevap

5

sorunuzu sadece private yapıcı kendisi çağırıyor hangi SubAlpha, SubAlpha olduğunu. Bir sorun yok, bir sınıf kendi özel yöntemlerini arayabilir. Alpha yapıcısı protected, dolayısıyla SubAlpha buna erişebilir.

Edit: Düzenlemenizi yeniden yapın: Evet, tam olarak. Bir ayrı sınıfı (bir alt sınıf olsun veya olmasın) SubAlpha özel kurucusuna erişemez ve başarıyla bir yapılamadı.

Örnek 1:

public class Beta 
{ 
    public static final void main(String[] args) 
    { 
     new SubAlpha(); 
//  ^--- Fails with a "SubAlpha() has private access in SubAlpha" 
//   compilation error 
    } 
} 

Örnek 2:

public class SubSubAlpha extends SubAlpha 
{ 
    private subsubAlpha() 
    { 
// ^== Fails with a "SubAlpha() has private access in SubAlpha" 
//  compilation error because of the implicit call to super() 
    } 
} 

Bu, tabii ki, yapıcı özgü, kapsamı her üyesi özgü olduğu. Bir sınıf farklı bir imzayla ve daha az kısıtlayıcı bir kapsamı olan farklı yapıcısına sahipse, bunu kullanan bir sınıf (bir alt sınıf dahil), bu diğer kurucu imzayı kullanabilir. (Bir alt sınıf durumunda, bu super(args); için açık bir çağrı gerektirecektir.)

1

Kod, ana yöntem aynı sınıfta olduğu gibi çalışır. SubAplha'yı farklı bir sınıftan başlatamayabilirsiniz.