2017-01-27 13 views
10

के बीच अंतर मुझे अंतिम श्रेणी (आप कक्षा का वारिस नहीं कर सकते) और एक निजी कन्स्ट्रक्टर (आप नहीं कर सकते कक्षा का एक उदाहरण बनाएँ)। लेकिन Arrays और Math, जावा के वर्गों में, दोनों निजी रचनाकार हैं लेकिन Math अंतिम श्रेणी है और Arrays नहीं है?जावा-फाइनल क्लास बनाम निजी कन्स्ट्रक्टर: java.util.Arrays और java.lang.Math

क्या अंतर है? उपयोगिता वर्ग दोनों नहीं हैं?

धन्यवाद

+1

ऐसा लगता है कि 'Arrays' के लेखक बस कक्षा को अंतिम रूप देने के लिए भूल गए हैं। इसका कन्स्ट्रक्टर अभी भी 'निजी' है (और _Suppresses डिफ़ॉल्ट कन्स्ट्रक्टर के साथ टिप्पणी करता है, गैर-तत्कालता सुनिश्चित करता है ._) और 'Arrays' के कोई भी उदाहरण नहीं बनाए जाते हैं (कोई प्रतिबिंब, निश्चित नहीं) जबकि शेष' सार्वजनिक 'विधियां 'स्थिर' होती हैं, इसलिए यह एक "उपयोगिता" कक्षा भी है। अर्थात् 'मठ' और 'Arrays' दोनों "उपयोगिता" हैं। सी # की तुलना में, जावा में 'स्थैतिक' वर्गों की कमी है, और शायद यह अच्छा हो सकता है कि जावा में शुरुआत में इस प्रकार की कक्षाएं थीं, उन्हें कक्षा को अंतिम रूप देने और 'निजी' कन्स्ट्रक्टर लगाने की आवश्यकता नहीं थी। –

+0

अच्छा सवाल। मेरा एकमात्र अनुमान यह है कि वे इसे भूल गए। ('java.util.Objects' को' अंतिम 'भी चिह्नित किया गया है और कन्स्ट्रक्टर 'निजी' है। और निजी कन्स्ट्रक्टर संदेश के साथ' AssertionError' फेंकता है *" कोई java.util.Objects उदाहरण आपके लिए नहीं! "*: -)) –

उत्तर

5

वर्ग के लिए एक निजी निर्माता है, लेकिन अंतिम नहीं है, तो आप एक ही कक्षा फ़ाइल सार्वजनिक कंस्ट्रक्टर्स है और instantiated जा सकता है कि में भीतरी वर्गों को परिभाषित कर सकते हैं। लेकिन आप उस प्रारंभिक कक्षा फ़ाइल के बाहर किसी भी उप-वर्ग को परिभाषित नहीं कर सकते हैं। उदाहरण के लिए इस संकलन होगा:

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"); 
    } 
    } 
} 

बहरहाल, यह (एक और फाइल में परिभाषित) नहीं करेंगे:

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"); 
    } 
} 

इस तकनीक को आप वर्ग पदानुक्रम परिभाषित करने के लिए आप क्या प्रकार पर पूरा नियंत्रण है जहां की अनुमति देता है सकते हैं अपनी कक्षा का विस्तार करें (क्योंकि इन सभी उपप्रकारों को एक ही कक्षा फ़ाइल के अंदर समझा जाना चाहिए)।

उस ने कहा, java.util.Arrays को उपर्युक्त के कारण गैर-फाइनल के रूप में परिभाषित नहीं किया गया है - यह संभवतः केवल एक कार्यान्वयनकर्ता की निगरानी है जो उस मैच से कोई फर्क नहीं पड़ता है, इसलिए यह तिथि तय नहीं किया गया था।

संबंधित मुद्दे