2017-01-27 88 views
10

Son sınıf (sınıfı devralamazsınız) ve özel bir kurucu arasındaki farkı biliyorum (sınıfın bir örneğini oluşturmak). Ama neden Java sınıfları, Arrays ve Math, hem özel kurucular var ama Math son sınıf ve Arrays değil mi?Java-Final sınıfı/özel yapıcı: java.util.Arrays ve java.lang.Math arasındaki fark

Fark nedir? Her ikisi de fayda sınıfı değil mi?

Teşekkür

sınıf özel Oluşturucu sahip ancak son değil
+1

'Arrays' yazarlarının sınıfa son vermeyi unuttukları anlaşılıyor. Kurucusu hala 'özel' (ve _Suppresses varsayılan yapıcısı ile yorumlanmıştır, anlık olmayan bir olasılıkla sağlama) ve 'diziler' geri kalanları 'statik' olmakla birlikte, 'Arrays' örnekleri oluşturulmaz (yansıma yok). bu yüzden bir "yardımcı" sınıfı da var. Anlamsal olarak 'Math' ve 'Arrays' her ikisi de "yardımcı" dır. C# ile karşılaştırıldığında, Java 'statik' sınıfları yoksundur, ve eğer Java, bir dersi bitirmek ve bir 'özel' kurucuyu yerleştirmek için başlangıçta bir tür derse sahip olsaydı, muhtemelen güzel olurdu. –

+0

İyi soru. Benim tek tahminim onlar unuttular. ('java.util.Objects' de 'final' olarak işaretlenir ve kurucu 'private'dir. Ve özel kurucu mesajla bir' AssertionError' atar * "Senin için java.util.Objects örnekleri yok!" *: -)) –

cevap

5

, toplu Kurucular ve örneği oluşturulmak aynı sınıf dosyasında iç sınıfları tanımlayabilirsiniz. Ancak, bu sınıfın dışındaki herhangi bir alt sınıfı tanımlayamazsınız. Örneğin bu derlemek olacaktır:

Ancak bu (başka dosyada tanımlı)
public class Animal { 
    public void say() { 
    System.out.printLn("Animal says:"); 
    } 
    private Animal() {} 

    public static class Cat extends Animal { 
    public Cat() {super();} 
    @Override public void say() { 
     super.say(); 
     System.out.printLn("Meow"); 
    } 
    } 
} 

olmaz:

public class Dog extends Animal { 
    public Dog() {super();} // compilation error here: The constructor Animal() is not visible 
    @Override public void say() { 
    super.say(); 
    System.out.printLn("Wuf"); 
    } 
} 

Bu teknik hangi türleri üzerinde tam kontrole sahip nereye sınıf hiyerarşisi tanımlamanızı sağlar can sınıfınızı uzatın (çünkü tüm bu alt türlerin aynı sınıf dosyasında numaralandırılmış olması gerekir).

Bu, java.util.Arrays'un yukarıdaki nedenlerden dolayı nihai olmayan olarak tanımlanmadığını belirtti - muhtemelen sadece bir uygulayıcının tüm bu eşleşmenin önemli olmadığı gözetimi olduğundan, bugüne kadar düzeltilmemiş.