जावा में ऑब्जेक्ट बनाने के सभी अलग-अलग तरीके क्या हैं?


178

इस बारे में दूसरे दिन एक सहकर्मी से बातचीत हुई।

एक निर्माणकर्ता का उपयोग करने में स्पष्ट है, लेकिन अन्य तरीके क्या हैं?


2
जब संदेह हो, तो भाषा की युक्ति देखें। 12.5 नई कक्षा के सृजन की रचना java.sun.com/docs/books/jls/third_edition/html/… 15.9 कक्षा के उदाहरण सृजन अभिव्यक्तियाँ java.sun.com/docs/books/jls/third_edition/html/…/
इंटरनेट मित्र

9
वहाँ केवल 3 हैं: सामान्य सी-टोर (नया कीवर्ड), क्लोन () और Unsafe.allocateInstance(Class)। बाकी लोग उनमें से एक को बुलाते हैं। परावर्तन को c-tor कॉल, Unsafe.allocateInstance (क्लास) के लिए डीरियलाइज़ेशन के लिए संकलित किया गया है। आप अपना स्वयं का एपीआई बना सकते हैं और आप उनमें से एक को कॉल करना समाप्त कर देंगे।
बेस्टसीएस

2
@ bestsss- Unsafeजावा का कार्यान्वयन-विशिष्ट विवरण है और इसका उल्लेख कल्पना में कहीं भी नहीं किया गया है। एक पूर्णतया जावा कार्यान्वयन का निर्माण पूरी तरह से संभव है new, जो उपयोग करने वाले कोड को नीचे संकलित प्रतिबिंब का उपयोग नहीं करता है clone, या Unsafe.allocateInstance
templatetypedef

2
आप लिंक की जाँच कर सकते हैं, codeandlogics.com/2017/01/ways-to-create-objects-in-java.html
प्रज्ञा

जवाबों:


288

जावा में ऑब्जेक्ट बनाने के चार अलग-अलग तरीके हैं:

newकीवर्ड का उपयोग करना
यह java में ऑब्जेक्ट बनाने का सबसे आम तरीका है। लगभग 99% ऑब्जेक्ट्स इस तरह से बनाए जाते हैं।

 MyObject object = new MyObject();

बी । का उपयोग करते हुए Class.forName()
अगर हम वर्ग का नाम जानते हैं और हम इस तरह से एक वस्तु बना सकते हैं अगर यह एक सार्वजनिक डिफ़ॉल्ट निर्माता है।

MyObject object = (MyObject) Class.forName("subin.rnd.MyObject").newInstance();

सी । का प्रयोग clone()
क्लोन () किसी मौजूदा ऑब्जेक्ट की प्रतिलिपि तैयार करने के लिए इस्तेमाल किया जा सकता है।

MyObject anotherObject = new MyObject();
MyObject object = (MyObject) anotherObject.clone();

डीobject deserialization
ऑब्जेक्ट डिसेरिएलाइज़ेशन का उपयोग करना कुछ भी नहीं है, बल्कि इसके क्रमबद्ध रूप से एक ऑब्जेक्ट बनाना है।

ObjectInputStream inStream = new ObjectInputStream(anInputStream );
MyObject object = (MyObject) inStream.readObject();

आप उन्हें यहाँ से पढ़ सकते हैं ।


10
तो वास्तव में केवल 2 तरीके मौजूद हैं: निर्माण करने वाले (नए, क्लोन) या प्रतिबिंब का उपयोग करके और डिसेरिएलाइज़ेशन जो कि प्रोसेसर को आमंत्रित नहीं करता है।
एलेक्सा

13
@AlexR: Object.clone()निर्माता को भी आमंत्रित नहीं करता है।
axtavt

1
जैसा कि यह शीर्ष पर उत्तर है, क्या आप ए और बी के उप-मामलों के रूप में सरणियों की रचनाओं को जोड़ सकते हैं? (विवरण के लिए मेरा जवाब देखें)।
पाओलो एबरमन

वर्णन एक रचनाकार का आह्वान करता है, केवल सबसे व्युत्पन्न प्रकार का नहीं।
टॉम हॉल्टिन -

2
आपको उस Constructorवर्ग का भी उल्लेख करना चाहिए , जो सामान्यीकरण करता है Class.newInstance
templatetypedef

68

विभिन्न तरीके हैं:

  • के माध्यम से Class.newInstance
  • के माध्यम से Constructor.newInstance
  • Deserialisation के माध्यम से (सबसे व्युत्पन्न गैर-धारावाहिक बेस क्लास के नो-आर्ग्स कंस्ट्रक्टर का उपयोग करता है)।
  • के माध्यम से Object.clone( एक निर्माता फोन नहीं करता है )।
  • जेएनआई के माध्यम से (एक निर्माता को कॉल करना चाहिए)।
  • किसी अन्य विधि के माध्यम से जो कॉल करता है a new आपके लिए है।
  • मुझे लगता है कि आप नई वस्तुओं (जैसे कि नजरबंद) के रूप में वर्ग लोडिंग का वर्णन कर सकते हैं String एस)।
  • एक घोषणा में प्रारंभिक के भाग के रूप में एक शाब्दिक सरणी (सरणियों के लिए कोई निर्माता नहीं)।
  • एक "varargs" ( ...) विधि कॉल (सरणियों के लिए कोई निर्माता) में सरणी।
  • गैर-संकलित समय निरंतर स्ट्रिंग संघनन (एक सामान्य कार्यान्वयन पर कम से कम चार वस्तुओं का उत्पादन करने के लिए होता है)।
  • जिससे रनटाइम द्वारा एक अपवाद बनाया और फेंका जा सके। उदाहरण के लिए throw null;या"".toCharArray()[0]
  • ओह, और निश्चित रूप से आदिम (जब तक कैश नहीं किया गया) की बॉक्सिंग।
  • JDK8 में लैम्ब्डा होना चाहिए (अनिवार्य रूप से अनाम आंतरिक वर्गों को संक्षिप्त करना), जो कि स्पष्ट रूप से वस्तुओं में परिवर्तित हो जाते हैं।
  • पूर्णता (और पाओलो एबरमन) के लिए, newकीवर्ड के साथ कुछ वाक्यविन्यास भी है।

6
आपको "सामान्य तरीका" जोड़ना चाहिए, भी :-)
पाओलो एबरमन

@ पाओलो एबरमन यह इतना पुराना स्कूल और अनकूल है। (मैं मान लिया है कि क्या मतलब सवाल "एक निर्माता का उपयोग (हालांकि अधिकांश, लेकिन सभी नहीं, के ऊपर का उपयोग करते हैं रेखा के साथ / एक निर्माता कहीं)।)
tackline - टॉम Hawtin

वास्तव में ऐसा करने के लिए केवल 3 वास्तविक तरीके हैं, जिसके लिए मैंने टिप्पणी जोड़ी
bestsss

3
तुम एक चूक गए java.misc.Unsafe.allocateInstance():। हालांकि यह कई कारणों से बुरा है। और वास्तव में, deserialization नो-आर्ग्स कंस्ट्रक्टर का उपयोग नहीं करता है। हुड के तहत यह allocateInstanceकाले जादू का उपयोग करता है या समकक्ष है।
स्टीफन सी।

सबसे अच्छा जवाब अभी तक, लेकिन जेएनआई AllocObject().एक निर्माता को नहीं बुलाता है।
लोर्ने

25

जावा भाषा के भीतर, किसी भी वस्तु को बनाने का एकमात्र तरीका उसके निर्माता को बुलाकर, स्पष्ट रूप से या निहित रूप से होना चाहिए। कंस्ट्रक्टर विधि के लिए एक कॉल में प्रतिबिंब परिणामों का उपयोग करना, डिसेरिअलाइज़ेशन, कंस्ट्रक्टर को कॉल करने के लिए प्रतिबिंब का उपयोग करता है, फ़ैक्टरी विधियाँ वास्तविक निर्माण को रद्द करने के लिए निर्माता को कॉल लपेटती हैं और क्लोनिंग उसी तरह से लिपटे हुए कंस्ट्रक्टर कॉल हैं।


1
गलत। Deserializatio किसी वर्ग के निर्माता को स्पष्ट या निहित रूप से नहीं बुलाता है।
लोर्ने

2
मुझे construct इसका कंस्ट्रक्टर ’और or कंस्ट्रक्टर’ नहीं लिखना चाहिए था, बल्कि or कंस्ट्रक्टर ’और construct कंस्ट्रक्टर’ लिखना चाहिए था। डिसेरिएलाइजेशन के मामले में, पहले लागू नो-आर्ग कंस्ट्रक्टर को हमेशा कहा जाता है।
कन्फ्यूजन

1
डिफ़ॉल्ट क्लोन कार्यान्वयन किसी भी निर्माता को कॉल नहीं करता है।
दिदियर एल

अगर यह मेरी क्लोन पद्धति का कार्यान्वयन है "रिटर्न सुपर.क्लोन ();"। फिर यह कंस्ट्रक्टर को इनवोक नहीं करेगा।
मतीन

13

हां, आप प्रतिबिंब का उपयोग करके ऑब्जेक्ट बना सकते हैं। उदाहरण के लिए, String.class.newInstance()आपको एक नई खाली स्ट्रिंग वस्तु देगा।


1
अगर मैं इसका उपयोग करने के लिए मुझे एक कोशिश / पकड़ ब्लॉक में संलग्न करने के लिए पूछ रहा हूँ।
गुरुकुलकी

2
हां, ऐसे कई मामले हैं जहां अपवाद फेंके जा सकते हैं। क्या गलत हो सकता है के उदाहरणों के लिए newInstance () के लिए JavaDoc देखें।
16:25 पर थॉमस लॉज़र

11

जावा में ऑब्जेक्ट बनाने के पांच अलग-अलग तरीके हैं,

1. newकीवर्ड का उपयोग करके → कंस्ट्रक्टर को बुलाया जाता है

Employee emp1 = new Employee();

2.newInstance()Class → कंस्ट्रक्टर की विधि का उपयोग करना कहा जाता है

Employee emp2 = (Employee) Class.forName("org.programming.mitra.exercises.Employee")
                                .newInstance();

इसे भी लिखा जा सकता है

Employee emp2 = Employee.class.newInstance();

3.newInstance()Constructor → कंस्ट्रक्टर की विधि का उपयोग करना कहा जाता है

Constructor<Employee> constructor = Employee.class.getConstructor();
Employee emp3 = constructor.newInstance();

4. clone()विधि का उपयोग करना → कोई निर्माता कॉल नहीं

Employee emp4 = (Employee) emp3.clone();

5. डिसेरिएलाइजेशन का उपयोग करना → कोई कंस्ट्रक्टर कॉल नहीं

ObjectInputStream in = new ObjectInputStream(new FileInputStream("data.obj"));
Employee emp5 = (Employee) in.readObject();

पहले तीन तरीके newकीवर्ड और दोनों newInstance()में एक कंस्ट्रक्टर कॉल शामिल है, लेकिन बाद में दो क्लोन और डीसर्लाइजेशन विधियां कंस्ट्रक्टर को कॉल किए बिना ऑब्जेक्ट बनाती हैं।

उपरोक्त सभी तरीकों में उनके साथ जुड़े अलग-अलग बायोटेक हैं, उदाहरण के लिए जावा के साथ ऑब्जेक्ट बनाने के लिए अलग-अलग तरीके पढ़ें और इन सभी तरीकों का अधिक विस्तृत विवरण जैसे बायटेकोड रूपांतरण।

हालाँकि, यह तर्क दिया जा सकता है कि एक सरणी या स्ट्रिंग ऑब्जेक्ट बनाना भी ऑब्जेक्ट बनाने का एक तरीका है, लेकिन ये चीजें केवल कुछ वर्गों के लिए विशिष्ट हैं और सीधे JVM द्वारा नियंत्रित की जाती हैं, जबकि हम इन 5 तरीकों का उपयोग करके किसी भी वर्ग का ऑब्जेक्ट बना सकते हैं।


कृपया किसी भी संबद्धता का खुलासा करें और पोस्टिंग के माध्यम से अपनी साइट को बढ़ावा देने के तरीके के रूप में साइट का उपयोग न करें। देखिए मैं एक अच्छा उत्तर कैसे लिखूं?
यवेटे



6

यह ध्यान दिया जाना चाहिए कि क्या आप जावा में नए हैं, प्रत्येक वस्तु को ऑब्जेक्ट से विरासत में मिला है

संरक्षित मूल वस्तु क्लोन () CloneNotSupportedException फेंकता है;


@stacker: क्या आप बता सकते हैं कि यह नई वस्तु बनाने से कैसे संबंधित है? धन्यवाद।
राणाप्रायोगो

4
@ryanprayogo क्लोन () एक नई वस्तु लौटाएगा (भले ही ऑब्जेक्ट उस ऑब्जेक्ट का क्लोन है जिसे क्लोन () कहा जाता था) और वास्तव में निर्माणकर्ता के बिना एक नई वस्तु बनाने का एकमात्र तरीका है।
थॉमस लोटर

6

इसके अलावा, आप किसी ऑब्जेक्ट में डेटा को डी-सीरियल कर सकते हैं । यह वर्ग निर्माता के माध्यम से नहीं जाता है!


अद्यतन : आपकी टिप्पणी में यह इंगित करने के लिए धन्यवाद टॉम! और माइकल ने भी प्रयोग किया।

यह सबसे अधिक व्युत्पन्न गैर-क्रमिक सुपरक्लास के निर्माता के माध्यम से जाता है।
और जब उस वर्ग में कोई नो-आर्ग कंस्ट्रक्टर नहीं होता है, तो डे-सीरियलाइजेशन पर एक InvalidClassException को फेंक दिया जाता है।

कृपया सभी मामलों के पूर्ण उपचार के लिए टॉम का उत्तर देखें ;-)
जावा में "नया" कीवर्ड का उपयोग किए बिना एक ऑब्जेक्ट बनाने का कोई अन्य तरीका है


1
यह एक कंस्ट्रक्टर (सबसे व्युत्पन्न गैर-क्रमिक सुपरक्लास का नो-आर्ग कंस्ट्रक्टर) से गुजरता है।
टॉम हॉल्टिन -

1
@ टॉम ओह वाह - मुझे नहीं पता था कि और थोड़ा प्रयोग किया। जाहिरा तौर पर जब सबसे व्युत्पन्न गैर-क्रमिक सुपरक्लास में एक नो-आर्ग्स कंस्ट्रक्टर नहीं होता है, तो इसका परिणाम होता है एक InvalidClassException धारा में धारावाहिक होने और deserialization पर फेंक दिया !! - कितना विचित्र है?
माइकल बोर्गवर्ड

6

एक प्रकार की वस्तु है, जिसका निर्माण सामान्य उदाहरण निर्माण तंत्रों (कॉलिंग कंस्ट्रक्टरों) द्वारा नहीं किया जा सकता है: Arrays । एरे के साथ बनाया जाता है

 A[] array = new A[len];

या

 A[] array = new A[] { value0, value1, value2 };

जैसा कि शॉन ने एक टिप्पणी में कहा, यह एक कंस्ट्रक्टर कॉल के समान ही है और आंतरिक रूप से यह आवंटन और शून्य-आरंभीकरण (या स्पष्ट सामग्री के साथ आरंभ करने, दूसरे मामले में) से अधिक नहीं है, एक मेमोरी ब्लॉक, कुछ हेडर के साथ इंगित करने के लिए। प्रकार और लंबाई।

जब एक varargs- विधि के लिए तर्क पारित, एक सरणी वहाँ बनाया (और भरा) निहित है, भी है।

चौथा रास्ता होगा

 A[] array = (A[]) Array.newInstance(A.class, len);

बेशक, क्लोनिंग और डिसरियलाइजिंग यहां भी काम करता है।

मानक एपीआई में कई तरीके हैं जो सरणियों का निर्माण करते हैं, लेकिन वे वास्तव में इन तरीकों में से एक (या अधिक) का उपयोग कर रहे हैं।


दी, आप ऐरे बिल्डरों को परिभाषित नहीं कर सकते, लेकिन इसके अलावा तंत्र एक ही newकीवर्ड है। Array.newInstance यहाँ का एकमात्र नया तंत्र है
शॉन पैट्रिक फ्लोयड

@ सीन: यह एक ही कीवर्ड है, लेकिन यह काफी अलग आंतरिक तंत्र है, मैं कहने की हिम्मत करता हूं।
पाओलो एबरमैन 20

यह सच है, बिल्कुल। लेकिन दूसरी ओर सरणी निर्माण के विभिन्न संस्करण आंतरिक रूप से बहुत अधिक समान हैं। बस आपका जवाब 2011 से महसूस किया गया था। पुराने सामान को उगलने के लिए क्षमा करें :-)
शॉन पैट्रिक फ्लोयड

@ सीन: कोई बात नहीं, मैंने इस मौके का इस्तेमाल कुछ ग्रामर फिक्स करने में किया।
पाओलो एबरमन 22

अच्छी नौकरी, किसी ने यहाँ सरणियों के बारे में चर्चा नहीं की!
मतीन

5

अन्य तरीके अगर हम संपूर्ण हो रहे हैं।

  • ओरेकल पर JVM Unsafe.allocateInstance () है जो एक निर्माता को बुलाए बिना एक उदाहरण बनाता है।
  • बाइट कोड हेरफेर का उपयोग करके आप कोड को , या anewarray, में कोड जोड़ सकते हैं । इन्हें ASM या BCEL जैसे पुस्तकालयों का उपयोग करके जोड़ा जा सकता है। ओरेकल के जावा के साथ bcel का एक संस्करण शिप किया गया है। फिर से यह एक निर्माता को कॉल नहीं करता है, लेकिन आप एक निर्माता को एक अलग कॉल के रूप में कॉल कर सकते हैं।multianewarraynewarraynew


4

प्रतिबिंब आपके लिए काम भी करेगा।

SomeClass anObj = SomeClass.class.newInstance();

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


4
  • का उपयोग करते हुए newऑपरेटर (इस प्रकार एक निर्माणकर्ता का आह्वान करना)
  • प्रतिबिंब का उपयोग करना clazz.newInstance()(जो फिर से निर्माता को आमंत्रित करता है)। या clazz.getConstructor(..).newInstance(..)(फिर से एक कंस्ट्रक्टर का उपयोग करके, लेकिन आप इस प्रकार चुन सकते हैं कि कौन सा)

उत्तर को संक्षेप में प्रस्तुत करने के लिए - एक मुख्य तरीका - ऑब्जेक्ट के वर्ग के निर्माता को आमंत्रित करके।

अद्यतन: एक अन्य उत्तर ने दो तरीकों को सूचीबद्ध किया है जिसमें एक कंस्ट्रक्टर का उपयोग करना शामिल नहीं है - डिसेरलाइज़ेशन और क्लोनिंग।


4

जावा में ऑब्जेक्ट बनाने के लिए विभिन्न तरीके हैं:

1. `new` कीवर्ड का उपयोग करना:

जावा में ऑब्जेक्ट बनाने का यह सबसे आम तरीका है। लगभग 99% ऑब्जेक्ट इस तरह से बनाए जाते हैं।

MyObject object = new MyObject();//normal way

2. फैक्टरी विधि का उपयोग करके:

ClassName ObgRef=ClassName.FactoryMethod();

उदाहरण:

RunTime rt=Runtime.getRunTime();//Static Factory Method

3. क्लोनिंग अवधारणा का उपयोग करके:

का उपयोग करके clone(), clone()एक मौजूदा वस्तु की एक प्रति बनाने के लिए इस्तेमाल किया जा सकता है।

MyObjectName anotherObject = new MyObjectName();
MyObjectName object = anotherObjectName.clone();//cloning Object

4. `Class.forName ()` का उपयोग करना:

अगर हमें क्लास का नाम पता है और अगर उसका कोई पब्लिक डिफाल्टर कंस्ट्रक्टर है तो हम इस तरह से ऑब्जेक्ट बना सकते हैं।

MyObjectName object = (MyObjectNmae) Class.forName("PackageName.ClassName").newInstance();

उदाहरण:

String st=(String)Class.forName("java.lang.String").newInstance();

5. वस्तु deserialization का उपयोग करना:

ऑब्जेक्ट डिसेरिएलाइज़ेशन कुछ भी नहीं है, बल्कि इसके क्रमबद्ध रूप से एक ऑब्जेक्ट का निर्माण करना है।

ObjectInputStreamName inStream = new ObjectInputStreamName(anInputStream );
MyObjectName object = (MyObjectNmae) inStream.readObject();

(4) केवल तभी आवश्यक है Class.forName()जब आपके पास पहले से ही कक्षा न हो, जो आपके अन्य सभी मामलों में हो। इसके लिए एक नो-आर्ग्स कंस्ट्रक्टर की भी आवश्यकता नहीं है: किसी भी सार्वजनिक कंस्ट्रक्टर को कॉल करने के तरीके हैं यदि आप सही तर्क जानते हैं। और आपने कम से कम दो अन्य तरीकों से छोड़ दिया है।
लोर्ने का मार्किस

2
(2) फैक्ट्री मेथड वस्तुओं को प्राप्त करने के लिए सिर्फ एक पैटर्न है लेकिन आंतरिक रूप से यह ऑब्जेक्ट बनाने के लिए "नए" कीवर्ड का उपयोग करता है।
कार्तिक बोस

आदमी क्यों बहुत सारे लोग कह रहे हैं कि फैक्ट्री पद्धति वस्तुओं का निर्माण करती है, आप लोगों ने यह कहाँ से सीखा?
मतीन

3

आप मौजूदा ऑब्जेक्ट को क्लोन भी कर सकते हैं (यदि यह क्लोन करने योग्य है)।

Foo fooClone = fooOriginal.clone (); 

2

विधि 1

नए कीवर्ड का उपयोग करना। यह जावा में ऑब्जेक्ट बनाने का सबसे आम तरीका है। लगभग 99% ऑब्जेक्ट इस तरह से बनाए जाते हैं।

Employee object = new Employee();

विधि 2

Class.forName () का उपयोग करना। Class.forName () आपको क्लास ऑब्जेक्ट देता है, जो प्रतिबिंब के लिए उपयोगी है। जिन तरीकों से इस ऑब्जेक्ट को जावा द्वारा परिभाषित किया गया है, न कि प्रोग्रामर द्वारा कक्षा लिखने से। वे हर वर्ग के लिए समान हैं। उस पर newInstance () कॉल करना आपको उस वर्ग का उदाहरण देता है (जैसे कि CallClass.forName ("ExampleClass")। newInstance () यह नए उदाहरण CallClass ()) के समतुल्य है, जिस पर आप उन विधियों को कॉल कर सकते हैं, जिन्हें वर्ग परिभाषित करता है, दृश्य क्षेत्रों आदि का उपयोग करें।

Employee object2 = (Employee) Class.forName(NewEmployee).newInstance();

Class.forName () हमेशा कॉल करने वाले के ClassLoader का उपयोग करेगा, जबकि ClassLoader.loadClass () एक अलग ClassLoader निर्दिष्ट कर सकता है। मेरा मानना ​​है कि Class.forName लोडेड क्लास को भी इनिशियलाइज़ करता है, जबकि ClassLoader.loadClass () एप्रोच वह तुरंत नहीं करता है (यह इनिशियलाइज़ नहीं किया जाता है जब तक कि इसे पहली बार इस्तेमाल नहीं किया जाता है)।

एक और पढ़ना चाहिए:

जावा: थ्रेड स्टेट का परिचय उदाहरण के साथ सरल जावा Enum उदाहरण

विधि 3

क्लोन () का उपयोग करना। किसी मौजूदा ऑब्जेक्ट की कॉपी बनाने के लिए क्लोन () का उपयोग किया जा सकता है।

Employee secondObject = new Employee();
Employee object3 = (Employee) secondObject.clone();

विधि 4

NewInstance () पद्धति का उपयोग करना

Object object4 = Employee.class.getClassLoader().loadClass(NewEmployee).newInstance();

विधि 5

ऑब्जेक्ट डिसेरिएलाइज़ेशन का उपयोग करना। ऑब्जेक्ट डिसेरिएलाइज़ेशन कुछ भी नहीं है, बल्कि इसके क्रमबद्ध रूप से एक ऑब्जेक्ट का निर्माण करना है।

// Create Object5
// create a new file with an ObjectOutputStream
FileOutputStream out = new FileOutputStream("");
ObjectOutputStream oout = new ObjectOutputStream(out);

// write something in the file
oout.writeObject(object3);
oout.flush();

// create an ObjectInputStream for the file we created before
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("crunchify.txt"));
Employee object5 = (Employee) ois.readObject();

पाठ के लिए कोड फ़ॉर्मेटिंग का उपयोग न करें जो कोड नहीं है। इनकी तुलना में अधिक विधियाँ हैं। अन्य उत्तर पढ़ें। 'लगभग 99%' सिर्फ अनुमान है।
लोर्ने

हाय EJP इस गलती के लिए खेद है ... मैंने कहा कि यह एक तरह से वस्तुओं को बनाने के लिए बिल्कुल सही नहीं कहा गया है। यह सिर्फ एक मॉडल है..और खेद है कि मैं अल्टेरन हूं और स्टैकओवरफ्लो के लिए नया
हूं

0

एक एपीआई उपयोगकर्ता के दृष्टिकोण से, कंस्ट्रक्टरों के लिए एक और वैकल्पिक स्थिर कारखाना विधियाँ हैं (जैसे BigInteger.valueOf ()), हालांकि API लेखक (और तकनीकी रूप से "वास्तविक रूप से") के लिए ऑब्जेक्ट अभी भी एक कंस्ट्रक्टर का उपयोग करके बनाए गए हैं।


-1

डिपेंड करता है कि आपके द्वारा बनाये जाने का क्या मतलब है लेकिन कुछ अन्य हैं:

  • क्लोन विधि
  • deserialization
  • परावर्तन (Class.newInstance ())
  • परावर्तन (कंस्ट्रक्टर ऑब्जेक्ट)

2
3 और 4 समान तंत्र के लिए अलग उपनाम हैं
शॉन पैट्रिक फ्लोयड

-2

वहाँ भी ClassLoader.loadClass (स्ट्रिंग) है, लेकिन यह अक्सर उपयोग नहीं किया जाता है।

और यदि आप इसके बारे में कुल वकील बनना चाहते हैं, तो सरणी की संपत्ति के कारण एरे तकनीकी रूप से ऑब्जेक्ट हैं। इसलिए एक सरणी को आरम्भ करना एक वस्तु बनाता है।


1
loadClass (स्ट्रिंग नाम) परिणामी क्लास ऑब्जेक्ट देता है जो ऑब्जेक्ट हां है लेकिन उस क्लास की ऑब्जेक्ट नहीं है। यदि उदाहरण दिए जाएं तो इसके कई उदाहरण हमें पूरे पुस्तकालय में मिल सकते हैं, लेकिन वे विशिष्ट होंगे। check youtu.be/gGGCmrD6Qpw
नैनो

-3

हम 5 तरीकों से एक ऑब्जेक्ट बना सकते हैं:

  1. नए ऑपरेटर द्वारा
  2. प्रतिबिंब द्वारा (जैसे Class.forName) (इसके बाद Class.newInstance ())
  3. कारखाने विधि द्वारा
  4. क्लोनिंग के द्वारा
  5. प्रतिबिंब अपी द्वारा

3
Class.forName () ऑब्जेक्ट बनाने के बजाय क्लास लोड करता है।
लोर्ने का मार्किस

परछाई? निश्चित रूप से आपका मतलब प्रतिबिंब है।
स्टीफन सी।

आप फैक्ट्री पद्धति से ऑब्जेक्ट कैसे बनाएंगे, आंतरिक कार्यान्वयन फिर से नए कुंजी शब्द का सही उपयोग कर सकता है? और आपके पास दो बार प्रतिबिंब क्यों है? इसे और अधिक समझ बनाने होगा यदि आप वास्तव में कुछ exampls देना
मतीन

-5

हम इस तरह से वस्तु भी बना सकते हैं: -

String s ="Hello";

किसी ने इसकी चर्चा नहीं की।


यह आदिम डेटा प्रकार बनाने का तरीका है, यह सिर्फ एक लचीलापन है जो जावा "नए" कीवर्ड का उपयोग नहीं करने के लिए पर्दे के पीछे प्रदान करता है। यह नए कीवर्ड के समान है।
मधुसूदन

मधुसूदन, FYI, नए ऑपरेटर की मदद से, वस्तुओं को हमेशा ढेर में रखना चाहिए जबकि इस मामले में "हैलो" एक वस्तु है जिसे स्ट्रिंग पूल में संग्रहित करना चाहिए। और स्ट्रिंग एक वर्ग है जो एक आदिम डेटाटाइप नहीं है।
दीपक शर्मा

यह एक ऑब्जेक्ट नहीं बनाता है। यह किसी मौजूदा ऑब्जेक्ट का संदर्भ देता है। कंपाइलर और क्लास लोडर द्वारा ऑब्जेक्ट पहले से ही बनाया गया था।
लोर्ने
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.