जावा (प्रोग्रामिंग भाषा)

**जावा** एक प्रोग्रामिंग भाषा है जिसे मूलतः सन माइक्रोसिस्टम्स के जेम्स गोसलिंग द्वारा विकसित किया गया तथा 1995 में इसे सन माइक्रोसिस्टम्स के जावा प्लेटफ़ार्म के एक मुख्य अवयव के रूप में रिलीज़ किया गया। भाषा अपना अधिकांश वाक्य विन्यास (सिंटेक्स) C (सी) और C++ से प्राप्त करती है लेकिन इसके पास एक सरल ऑब्जेक्ट मॉडल और कुछ निम्न स्तर की सुविधायें मौजूद हैं। जावा के प्रयोगों को विशिष्ट रूप से बाईटकोड (क्लास फाइल) के लिए संकलित किया जाता है जिसे किसी भी कंप्यूटर आर्किटेक्चर वाले किसी भी जावा वर्चुअल मशीन (JVM) पर चालू किया जा सकता है।

1995 से सन द्वारा मूल तथा सन्दर्भ कार्यान्वयन जावा संकलकों (कम्पाइलरों), वर्चुअल मशीनों और क्लास लाइब्रेरियों को विकसित किया गया। मई 2007 तक, जावा कम्युनिटी प्रोसेस के विशेष उल्लेखपूर्वक अनुमति में सन ने अपने अधिकांश जावा प्रोद्योगिकियों को GNU जनरल पब्लिक लाइसेन्स के अर्न्तगत मुफ्त सॉफ्टवेयर के रूप में उपलब्ध कराया. दूसरों ने भी सन की इन प्रोद्योगिकियों के वैकल्पिक कार्यान्वयनों को विकसित किया, जैसे कि GNU क्लासपाथ और जावा के लिए GNU कम्पाइलर.

## इतिहास
अंगूठाकार|75px|ड्यूक, द जावा मास्कोट

जून 1991 में जेम्स गोसलिंग ने अपने कई सेट-टॉप बॉक्स परियोजनाओं में से किसी एक परियोजना में उपयोग करने के लिए जावा भाषा परियोजना को प्रारम्भ किया। इस भाषा का नाम पहले *[[ओक (प्रोग्रामिंग भाषा)|ओक]]* (Oak) था जिसका नामकरण गोसलिंग के कार्यालय के बाहर स्थित एक ओक पेड़ के नाम पर हुआ था। इसके बाद इसका नाम *ग्रीन* (Green) भी पड़ा और अंत में इसका नाम *जावा* पड़ा. यह जावा नाम क्रमबद्ध शब्दों की एक सूची में से लिया गया। गोसलिंग का लक्ष्य था कि वे एक वर्चुअल मशीन व एक भाषा की शुरुआत करें जो C/C++ शैली पद्वति से परिचित हो। 

1995 में सन ने जावा 1.0 के रूप में पहला सार्वजनिक कार्यान्वयन रिलीज़ किया। प्रचलित प्लेटफार्मों पर बिना-मूल्य रन-टाइम (चालू होने में लगने वाला समय) की सुविधा प्रदान करते हुए इसने "राइट वंस, रन एनीव्हेयर" (WORA) का वादा किया। पर्याप्त सुदृढ़ और समनुरूपयोग्य (कॉन्फिगरेबल) सुरक्षा प्रकट करते हुए इसने नेटवर्क और फाइल एक्सेस के प्रतिबंधों को अनुमति दे दी। मुख्य वेब ब्राउज़रों ने जल्द ही वेबपेजों के भीतर जावा ''एप्लेटों'' को चलाने की योग्यता को सम्मिलित कर लिया और जल्द ही जावा विख्यात हो गया। *जावा 2* (जिसे दिसम्बर 1998 में शुरू-शुरू में J2SE 1.2 के रूप में रिलीज़ किया गया) के आगमन के साथ नये भाषांतरों (वर्सन) में बहु आकृति (कॉन्फिगरेशन) थी जो विभिन्न प्रकार के प्लेटफार्मों के लिए निर्मित थी। उदाहरणस्वरुप, एंटरप्राइज़ अप्लिकेशन के लिए लक्षित *J2EE* और मोबाइल अप्लिकेशन के लिए अत्यंत नवीन वर्सन *J2ME* . *J2SE* ने मानक (स्टैण्डर्ड) संस्करण (एडिशन) को लक्षित किया। 2006 में, व्यापर के उद्देश्य से सन ने *J2* के नये वर्सनों का नाम बदलकर क्रमश: *जावा EE*, *जावा ME* और *जावा SE* कर दिया।

1997 में, सन माइक्रोसिस्टमस ने जावा को अमली जामा पहनाने के लिए ISO/IEC JTC1 मानक समिति को और बाद में ऐक्मा अंतराष्ट्रीय को प्रस्ताव भेजा, पर जल्द ही यह इस प्रक्रिया से हट गई। जावा समुदाय प्रक्रिया द्वारा नियंत्रित जावा *[[डी फेक्टो|वास्तव में]]* एक डी फैक्टो मानक बना हुआ है। अपने सॉफ्टवेयर मालिक होने के दर्जे के बावजूद, एक बार सन ने बिना शुल्क के जावा कार्यान्वयन का अधिकांश हिस्सा उपलब्ध कराया. सन ने जावा से विशेष उत्पाद जैसे जावा इंटरप्राइज सिस्टम को लाइसेंस बेचकर मुनाफा कमाया. सन ने अपने सॉफ्टवेयर डेवेलपमेंट किट (SDK) और रनटाइम एनवायरनमेंट (JRE) (SDK का एक उपसमुच्चय (सबसेट)) में भेद किया; प्राथमिक भेद में JRE का कम्पाइलर की कमी, उपयोगिता प्रोग्राम और हेडर फाइल्स शामिल हैं।

13 नवम्बर 2006 को, सन ने GNU जनरल पब्लिक लाइसेन्स (GPL) के शर्तों के अधीन अधिकांश जावा को स्वतंत्र और मुक्त स्रोत सॉफ्टवेयर के रूप में रिलीज़ किया। 8 मई 2007 को सन ने प्रक्रिया का समापन किया, कोड के एक छोटे से हिस्से जिस पर सन का प्रकाशनाधिकार (कॉपीराईट) नहीं है, उसे छोड़कर बाकि जावा के सभी कोर कोड को मुफ्त सॉफ्टवेयर/मुक्त-स्त्रोत वितरण शर्त के तहत उपलब्ध कराया.

### सिद्धांत
जावा भाषा को निर्मित करने के पांच मुख्य उद्देश्य थे:

# यह "सरल, ऑब्जेक्ट उन्मुख (ओरिएंटेड) और परिचित" होनी चाहिए।
# यह "रोबस्ट और सुरक्षित" होनी चाहिए।
# यह "आर्किटेक्चर तटस्थ (न्यूट्रल) और वहनीय" होनी चाहिए।
# यह "उच्च प्रदर्शन" के साथ लागू होनी चाहिए।
# यह "भाषांतरित, थ्रेडेड (सूत्रित) और गतिक" होनी चाहिए।

### इंजीलवाद
हालांकि जावा का अधिकांश प्रत्यक्ष मुनाफा लाइसेंसिंग और JCP सदस्यता राशि से आता है, कुछ मानते हैं कि जावा प्रमुखतः हार्डवेयर सर्वर को बढ़ावा देने का एक वाहन और/या आंतरिक रूप से सन के लिए सोलारिस OS की बिक्री हैं और सन के उपाध्यक्ष रिच ग्रीन ने कहा कि जावा के लिए सन की आदर्श भूमिका "इंजीलवाद" के जैसी है।

## कार्यप्रणाली (प्रैक्टिसेस)
### जावा प्लैटफॉर्म

जावा की एक विशेषता वहनीयता है, जिसका मतलब है कि जावा भाषा में लिखे गए कंप्यूटर प्रोग्राम किसी भी हार्डवेयर समर्थित/ऑपरेटिंग सिस्टम प्लेटफॉर्म पर समान रूप से कार्य करता है।
इसे जावा भाषा संकेत को संकलित करके प्राप्त किया गया है, मशीन कोड से नहीं बल्कि जावा बाईटकोड से, - निर्देश मशीन संकेत के अनुरूप है लेकिन विशेष तौर पर होस्ट हार्डवेयर के लिए लिखित वर्चुअल मशीन (VM) द्वारा भाषांतरित करना अभीष्ट होगा। एंड-यूज़र्स सामान्य तौर पर स्टैंडअलोन प्रयोग मशीन/या जावा एप्लेट्स के लिए वेब ब्राउजर में जावा रनटाइम एनवायरनमेंट (JRE) का इस्तेमाल करते हैं, जो उनके स्वयं के मशीन पर संस्थापित (इंस्टाल्ड) है।

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

बाईटकोड को इस्तेमाल करने का सबसे मुख्य लाभ है वहनता. जो कुछ भी हो, भाषांतरण के ऊपरी भाग का मतलब होता है कि भाषांतरित प्रोग्राम्स हमेशा मूल निष्पादनयोग्य से संकलित प्रोग्राम्स से ज्यादा धीरे चलती हैं और बुरे प्रदर्शन के कारण जावा की साख को नुकसान होता है। हाल ही में JVM कार्यान्वयन में कई ईष्टतमीकरण (optimization) तकनीकों के आने से यह परेशानी थोड़ी कम हो गई है।

#### कार्यान्वयन
सन माइक्रोसिस्टम्स आधिकारिक तौर पर जावा मानक संस्करण प्लेटफॉर्म Linux, Mac OS X और Solaris के लिए लाइसेंस देती है . हालांकि, पूर्व में सन ने Microsoft को जावा लाइसेंस दिया, लाइसेंस की अवधि समाप्त हो चुकी है और इसका फिर से नवीकरण नहीं किया गया है। तीसरे-समूह के विक्रेताओं और लाइसेंसधारियों के नेटवर्क द्वारा, वैकल्पिक जावा एनवायरनमेंट इसके और दूसरे प्लेटफॉर्मस के लिए उपलब्ध हैं।

जावा ब्रांड का उपयोग करने के लिए सन का ट्रेडमार्क लाइसेंस दृढ़तापूर्वक कहता है कि सभी क्रियान्वयन 'उपयुक्त' हो। इसका परिणाम <span class="goog-gtc-fnr-highlight">Microsoft</span> के साथ कानूनी विवाद के रूप में निकला जब सन ने दावा किया कि Microsoft क्रियान्वयन RMI और JNI को समर्थन नहीं करती और इसमें उसके स्वयं के अतिरिक्त प्लेटफॉर्म-विशिष्ट विशेषताएं हैं। सन ने 1997 में अभियोग चलाया और 2001 में 20 मिलियन डॉलर का भुगतान और साथ ही साथ सन के लाइसेंस की शर्तो को लागू करने का कोर्ट का आदेश भी पाया। परिणामस्वरूप, Microsoft ने विंडोज के साथ जावा को ज्यादा दिन नहीं चलाया और विंडोज के हाल के वर्सनों में, इंटरनेट एक्स्प्लोरर बिना तीसरी पार्टी के नियंत्रण के जावा एपप्लेट्स को समर्थन नहीं कर सकता. सन और दूसरों ने विंडोज के उस और अन्य वर्सनों के लिए मुफ्त जावा रन-टाइम सिस्टम उपलब्ध कराया.

जावा EE रणनीति के लिए प्लेटफॉर्म-स्वतंत्र जावा आवश्यक है और यहां तक कि क्रिर्यान्वयन को प्रमाणित करने के लिए और सख्त वैधीकरण (वेलिडेशन) जरुरी है। अंतःस्थापित जावा एनवायरनमेंट का उपयोग करके, यह एनवायरनमेंट वहनीय सर्वर-साइड जैसे वेब सर्विसेस, सर्वलेट्स और इंटरप्राइज जावाबीन्स, साथ ही साथ OSGi पर आधारित अंतःस्थापित सिस्टम को सक्षम बनाता है। ग्लासफिश परियोजना के द्वारा सन जावा EE प्रौद्योगिकी का पूर्ण संचालित, एकीकृत मुक्त स्त्रोत कार्यान्वयन के लिए कार्य कर रहा है।

सन JRE का सुपरसेट भी वितरित करता है जिसे जावा डेवलपमेंट किट (सामान्य तौर पर JDK के रूप में जाना जाता है), कहा जाता है जिसमे विकास उपकरण जैसे जावा कम्पाइलर, जावाडोक, जार और डीबगर शामिल है।

#### प्रदर्शन

जावा प्रोग्राम के प्रदर्शन का इसके समतुल्य मूलतः संकलित भाषा (जैसे कि C, C++, या ऑब्जेक्ट पास्कल) में लिखे गए प्रोग्राम से तुलना करना कठिन है क्योंकि जावा के बाईटकोड कम्पाइलर का टारगेट प्लेटफॉर्म, जावा प्लेटफॉर्म ही है और बाईटकोड JVM द्वारा मशीन कोड में या तो भाषांतरित कर दिया जाता है या संकलित कर दिया जाता है। इन दो भिन्न दृष्टिकोणों: स्थैतिक बनाम गतिशील संकलन और पुनः संकलन और अन्य से उत्पन्न परिदृश्यों की तुलना करना बहुत कठिन और अलग है।

संकलित भाषाओं में लिखे प्रोग्रामों की तुलना में जावा में लिखे प्रोग्रामों का धीमा होना और अधिक मेमोरी की आवश्यकता होना एक विशेषता रही है। जो कुछ भी हो, जस्ट-इन टाइम संकलन (1997/1998 में जावा 1.1), के आगमन के कारण जावा प्रोग्रामों की क्रियान्वयन गति तेजी से बढ़ी है, अतिरिक्त भाषा विशेषताएं उत्तम कोड विश्लेषण,  और जावा वर्चुअल मशीन में स्वंय इष्टतमीकरण (जैसे कि 2000 में सन के JVM के लिए हॉटस्पॉट का आभाव होना) को समर्थन करती है।

### स्वचालित स्मृति (मेमोरी) प्रबंधन

ऑब्जेक्ट जीवन चक्र में स्मृति का प्रबंधन करने के लिए जावा एक स्वचालित कचरा (गार्बेज) संग्रहकर्ता का उपयोग करता है। प्रोग्रामर निर्धारित कर लेता है कब ऑब्जेक्ट का निर्माण होगा और एक बार ऑब्जेक्ट जब और उपयोग के लायक नहीं रह जाता तो उसके स्मृति को पुनः प्राप्त करने की जिम्मेदारी जावा रनटाइम की होती है। एक बार जब ऑब्जेक्ट का कोई सन्दर्भ बाकी नहीं रहता, तब अगम्य (अनरिचेबल) ऑब्जेक्ट संग्राहक द्वारा स्वतः मुक्त होने के योग्य हो जाता है। कुछ कुछ मेमोरी रिसाव के समान तब भी जारी रह सकता है अगर एक प्रोग्रामर का कोड किसी ऑब्जेक्ट का एक सन्दर्भ जिसकी अब और जरूरत नहीं है उसे पकड़ता है, उसी तरह जब ओब्जेक्ट्स जिसकी और जरूरत नहीं है वह उस कंटेनर में संग्रहित है जो अभी भी इस्तेमाल में है। अगर अस्तित्वविहीन ऑब्जेक्ट के लिए पद्धतियों को बुलाया जाता हैं, एक "नल पॉइंटर एक्सेप्शन" फेंका जाता है।

जावा के स्वचालित स्मृति प्रबंधन मॉडल के पीछे एक विचार यह है कि प्रोग्रामर्स नियमित स्मृति प्रबंधन को प्रर्दशित करने का बोझ थोड़ा कम कर ले. कुछ भाषाओं में ऑब्जेक्ट के निर्माण के लिए स्मृति स्टेक पर अनुमान से आवंटित की जाती है या स्पष्टतया आवंटित होती है और ढेर (हीप) से पुनः आवंटित की जाती हैं। हर तरह से स्मृति प्रबंधन की जिम्मेदारी प्रोग्रामर के साथ रहती है। अगर कार्यक्रम किसी ऑब्जेक्ट को पुनःआवंटन नहीं करता है तो एक स्मृति रिसाव उत्पन्न होने लगता है। अगर कार्यक्रम स्मृति का अभिगमन या पुनः आवंटित करने का प्रयास करता है जो पहले ही पुनःआवंटित किया जा चुका है, तब परिणाम का अनुमान लगाना और व्याख्या करना मुश्किल हो जाता है और कार्यक्रम संभवतः या तो अस्थिर और/या तो समाप्त हो जाता हैं। इसे स्मार्ट संकेतों के इस्तेमाल से अंशतः ठीक किया जा सकता है लेकिन यह ऊपरिव्यय और जटिलता को बढाता है।

कचरा संग्रहण किसी भी समय हो सकता है। आदर्शतः यह तब होगा जब कार्यक्रम खाली रहता है। अगर नए ऑब्जेक्ट को आवंटित करने के लिए स्वतंत्र स्मृति अपर्याप्त है तब इसका चलाया जाना निश्चित है, यह क्षणभर के लिए एक कार्यक्रम स्थापित करने का कारण बन सकता है। स्पष्ट स्मृति प्रबंधन जावा में संभव नहीं है।

जावा C/C++ शैली सूचक अंकगणित को समर्थन नहीं करता है, जहां पर ऑब्जेक्ट एड्रेस (पता) और अचिन्हित इंटीजर्स (आमतौर पर लम्बे इंटीजर्स) को अदला-बदली करके उपयोग किया जा सकता हैं। यह कचरा कलेक्टर को सन्दर्भित ऑब्जेक्टस को स्थानांतरित करने की अनुमति देता है और इसका बचाव और सुरक्षा सुनिश्चित करता है।

जैसा कि C++ और कुछ दूसरे ऑब्जेक्ट-उन्मुख भाषाओँ में, जावा के परिवर्तनीय प्राथमिक प्रकार ऑब्जेक्ट नहीं है। प्राथमिक प्रकारों की उपयोगिता को या तो क्षेत्रों (ऑब्जेक्ट के लिए) में प्रत्यक्ष रूप से संचित किया जाता है या ढेरों पर (पद्धति के लिए) ना कि स्टेक पर, जैसा ऑब्जेक्ट के लिए सामान्य तौर पर सही है (लेकिन बचाव विश्लेषण देखें)। जावा के डिजाईनरों द्वारा प्रदर्शन के कारण लिया गया यह एक सजग निर्णय था। इसके कारण, जावा को एक शुद्ध ऑब्जेक्ट-उन्मुख प्रोग्रामिंग भाषा नहीं माना गया। जो कुछ भी हो, जैसा कि जावा 5.0, स्वतः संचालन प्रोग्रामर्स को आगे बढ़ने के लिए सक्षम बनाता है अगर प्राथमिक प्रकारें उनके आवरण श्रेणियों के उदाहरण होते हैं।

## वाक्यविन्यास

जावा के वाक्यविन्यास ज्यादातर C++ से व्युत्पन्न है। C++, जिसमें बनावट, क्रियाविधि और कार्यक्रम वाक्य विन्यास को जोड़ती हैं उससे अलग जावा को केवल एक ऑब्जेक्ट-उन्मुख भाषा के रूप में बनाया गया था। सभी कोड एक क्लास के भीतर लिखे गए हैं और सभी कुछ एक ऑब्जेक्ट है; अंतर्भूत आकड़ों के प्रकारों (क्रमवाचक और वास्तविक संख्याएं, बूलियन मूल्यों और अक्षर) को छोड़कर, जो प्रदर्शन कारणों से क्लासों नहीं है।

जावा कई विशेषताओं को (जैसे कि परिचालक अतिभार और बहु उत्तराधिकार) *क्लासों * के लिए, छुपाती है ऐसा वह भाषा को सरल बनाने और स्वाभाविक त्रुटियों और अनादर्श रचना को रोकने के लिए करती है।

जावा C++ की तरह ही समीक्षा पद्धति उपयोग करती है। दो विभिन्न प्रकार की समीक्षाएं हैं: एकरेखीय शैली अंकन दो फॉरवर्ड स्लैशेस के साथ और एक बहुरेखीय शैली खुली फॉरवर्ड स्लैश एस्टरिस्क (/*) के साथ और बंद एक एस्टरिस्क फॉरवर्ड स्लाश (*/) के साथ.

** उदाहरण: **

 
```java
// यह दो फॉरवर्ड स्लैशेस (//) का उपयोग करके एकरेखीय टिपण्णी का एक उदाहरण है।

/* यह बहु पंक्ति टिपण्णी का एक उदाहरण है जिसमें फॉरवर्ड स्लैश (/) और एस्टरिस्क (*) का इस्तेमाल होता हैं।
अधिक से अधिक जानकारी रखने के लिए इस तरह के टिपण्णी का उपयोग किया जा सकता है
 लेकिन टिप्पणी कों बंद करने की याद रखना बहुत महत्वपूर्ण है। */

//  == उदाहरण ==
// === हेलो वर्ल्ड ===
// पारंपरिक [[हैलो वर्ल्ड प्रोग्राम|हेलो वर्ल्ड कार्यक्रम]] को जावा में इस प्रकार लिखा जा सकता है:

 /* 
 * Outputs "Hello, world!"  and then exits 
 */

 public class HelloWorld { 
     public static void main(String[] args) { 
        System.out.println("Hello, world!") ; 
    } 
 }
```


सभी स्रोत फ़ाइलों का नाम पब्लिक क्लास के नाम के अनुसार होना चाहिए और `.java` कि प्रत्यय को लगाई जाती है। उदाहरण के लिए, `HelloWorl.java`। जावा कम्पाइलर के द्वारा इसका संकलन 'बाइट कोड' में किआ जाता है, जो `.class` प्रत्यय वाली फाइल उत्पन करता है (इस उदहारण में `HelloWorld.class`)। उसके बाद ही इसे कार्यान्वित या "निष्पादित" किया जा सकता है। जावा स्रोत फाइल में हो सकता है कि सिर्फ एक पब्लिक क्लास हो लेकिन इसमें पब्लिक एक्सेस से तुलना में कम मल्टीपल क्लासों और कितनी भी संख्या में पब्लिक इनर क्लासों शामिल हो सकती है।

एक `'''class''' ` जिसे `'''private''' ` घोषित किया जा चुका है, उसे किसी भी .java फाइल में संग्रहित किया जा सकता है। कम्पाइलर स्रोत फाइल में परिभाषित हर क्लास के लिए एक क्लास फाइल उत्पन्न करेगा। क्लास फाइल का नाम क्लास का नाम है, *.class* संलग्नित के साथ. क्लास फाइल पीढी के लिए, नामरहित क्लासों इस तरह प्रबंधित होती हैं जैसे कि उनका नाम उनके संलग्नित क्लास के नाम का संयोजन था, एक *$*, और एक पूर्णांक.

मुख्य शब्द `'''public''' ` सूचित करता है कि एक प्रणाली दूसरे क्लासों में कोड के द्वारा लाया जा सकता है, या क्लास पदानुक्रम (hierarchy) के बाहर क्लासों के द्वारा क्लास का प्रयोग हो सकता है। क्लास पदानुक्रम निर्देशिका के नाम से संबंधित होता है जिसमें जावा फाइल रहता है।

एक प्रणाली के आगे का मुख्य शब्द `'''static''' ` एक स्थितिक प्रणाली को संकेत करता है जो सिर्फ क्लास से जुड़ा हुआ है, उस क्लास के किसी भी दूसरे विशेष उदाहरण से नहीं। सिर्फ स्थितिक प्रणालियां किसी ऑब्जेक्ट को सन्दर्भ किए बिना आमंत्रित की जा सकती हैं। स्थितिक प्रणालियां किसी भी चर प्रणाली जो स्थैतिक नहीं है उसका अभिगम (एक्सेस) नहीं कर सकतीं.

मुख्य शब्द `'''void''' ` संकेतित करता है कि मुख्य प्रणाली कॉलर को कोई मूल्य वापस नहीं करता. अगर एक जावा प्रोग्राम गलत कोड के साथ बाहर निकलने को है, यह स्पष्टतया जरुर System.exit() को बुलाएगा.

प्रणाली नाम "`main`" जावा भाषा में मुख्य शब्द नहीं है। यह सिर्फ प्रणाली का नाम है जिसे जावा निर्माता कार्यक्रम को नियंत्रण बढ़ाने के लिए बुलाता है। जावा क्लासों जो प्रबंधित परिवेश जैसे एप्प्लेट्स और इंटरप्राइज जावा बीन्स में चलते हैं उसको `main()` प्रणाली की जरुरत नहीं पड़ती हैं या इस्तेमाल नहीं करते. एक जावा कार्यक्रम में बहु क्लासों जिसके पास `main` प्रणालियां हैं, समाविष्ट हो सकती है, जिसका मतलब हुआ कि VM स्पष्टतया कहने वाला होना चाहिए कि किस क्लास से प्रक्षेपण किया जाए.

मुख्य प्रणाली ***' ऑब्जेक्टस की [[ऐरे डाटा टाइप|सारणी]] को जरुर स्वीकार करे. परम्परानुसार, यह <code>'''args''' </code> के रूप में सन्दर्भित होता है यद्यपि कोई भी कानूनी पहचान वाला नाम इस्तेमाल किया जा सकता है। जावा 5 के समय से, मुख्य प्रणाली को <code>स्ट्रिंग</code> युक्तियों के [[वरर्ग्स|स्वेच्छाचारी संख्या]] के साथ आमंत्रण को अनुमति देते हुए <code>public static void मैं (String... args)</code> के रूप में, मुख्य प्रणाली परिवर्तित युक्तियों का भी इस्तेमाल कर सकता है। इस वैकल्पिक घोषणा का प्रभाव शब्दार्थतः पहचान योग्य है (<code>args</code> मानदंड अभी भी <code>String</code> ऑब्जेक्टस की एक सारणी है), लेकिन यह सारणी को बनाने और बढ़ाने के लिए वैकल्पिक वाक्य विन्यास को अनुमति देती है।

जावा निर्माता दिए गए क्लास (नियंत्रण रेखा पर निर्दिष्ट या एक [[जार (फ़ाइल फोरमैट)|JAR]] में विशेषता के रूप में) के भारण द्वारा जावा का प्रक्षेपण करती है और अपने <code>public static void main(String[])</code> प्रणाली को शुरू करती है। स्टैंड-अलोन प्रोग्राम्स को स्पष्टतः इस प्रणाली की घोषणा करनी चाहिए। <code>String[] args</code> मानदंड क्लास को पारित किसी युक्ति सम्मिलित  ऑब्जेक्ट की [[ऐरे डाटा टाइप|सारणी]] है। <code>main</code> का मापदंड अक्सर [[नियंत्रण रेखा]] के माध्यम द्वारा पारित की जाती है।

मुद्रण, जावा मानक लाइब्रेरीज का एक भाग है: ***' क्लास एक पब्लिक स्टैटिक क्लास को परिभाषित करता है जिसे बुलाया जाता है ***' . '<code>आउट</code>' ऑब्जेक्ट,  क्लास का एक उदाहरण है और यह डाटा मुद्रण के लिए कई [[मानक स्ट्रीम्स|मानक रहित]] प्रणालियां प्रदान करता है ***' जो स्ट्रिंग पारित करने के लिए नई रेखा भी संलग्न करती है।

 स्ट्रिंग "Hello, World!"  स्वचालित: संग्राहक द्वारा स्ट्रिंग ऑब्जेक्ट के रूप में परिवर्तित हो जाती है।

### एक अधिक विस्तृत उदाहरण
 
```java
hello===friend==
 // OddEven.java 
import javax.swing. JOptionPane;
olawer-==-
 public class OddEven swing=-
welcomeŔ
 // "input" is the number that the user gives to the computer 
 private int input; // a whole number("int" means integer)

 /* 454545
 * This is the constructor method. It gets called when an object of the OddEven type 
 * is being created. 
 */ ankita=-
 public OddEven() { koshti-
 //Code not shown å
 } 454545

 // This is the main method. It gets called when this class is run through a Java interpreter. 
 public static void main(String[] args) { 
 /* persnol
 * This line of code creates a new instance of this class called "number" (also known as an 
 * Object) and initializes it by calling the constructor.  The next line of code calls 
 * the "showDialog()" method, which brings up a prompt to ask you for a number 
 */ no number

 OddEven number = new OddEven(); 
 number.showDialog(); 
 } 
 no number

 public void showDialog() { 
 /* no

 * "try" makes sure nothing goes wrong. If something does, 
 * the interpreter skips to "catch" to see what it should do. 
 */ 
 try { write page

 /* 
 * The code below brings up a JOptionPane, which is a dialog box 
 * The String returned by the "showInputDialog()" method is converted into 
 * an integer, making the program treat it as a number instead of a word. 
 * After that, this method calls a second method, calculate() that will 
 * display either "Even" or "Odd." 
 conect no

 input = new Integer(JOptionPane.showInputDialog("Please Enter A Number")); 
 calculate(); 
 } catch (NumberFormatException e) {
 
 /*454545

 
 * Getting in the catch block means that there was a problem with the format of 
 * the number. Probably some letters were typed in instead of a number. 
 */no instred

 
 System.err.println("ERROR: Invalid input.  Please type in a numerical value.") ; 
 } 363636
 } 363636

 /* 
 * When this gets called, it sends a message to the interpreter. 
 * The interpreter usually shows it on the command prompt (For Windows users) 
 * or the terminal (For Linux users).( Assuming it's open) 
 */ %4==o
 private void calculate() { 
 if (input % 2 == 0) { 
 System.out.println("Even"); 
 } else { no

 System.out.println("Odd"); 
 } no

 } 
 } 
 </ source>

* '''[[जावा मुख्यशब्द#आयात|import]]''' स्टेटमेंट '''''' क्लास को '''''' पैकेज से इम्पोर्ट करता है।
* <code>'''oddEven''' </code> एक एकल [[क्षेत्र (कंप्यूटर साइंस)|क्षेत्र]] <code>'''[[जावा मुख्यशब्द# निजी|private]]''' </code> प्रकार के क्लास <code>'''int''' </code> की घोषणा करता हैं जिसे <code>'''input''' </code> कहा गया था। <code>OddEven</code> क्लास के हर उदाहरण के पास <code>input</code>क्षेत्र की अपनी एक प्रतिलिपि है। प्राइवेट घोषणा का मतलब होता है कि कोई दूसरी <code>input</code> क्षेत्र का अभिगम (पढ़ना या लिखना) नहीं कर सकती.
* <code>'''OddEven()''' </code> एक <code>'''public''' </code> [[निर्माता (कंप्यूटर साइंस)|निर्माता]] है। निर्माताओं के वही नाम हैं जो संलन्गित क्लास में उन्हें घोषित किये गए हैं, एक प्रणाली की तरह नहीं जिसका कोई [[वापसी के प्रकार|वापसी प्रकार]] नहीं है। एक निर्माता एक ऑब्जेक्ट को आरम्भ करने के लिए इस्तेमाल करता है जो नवीन बने क्लास का उदाहरण होता है।
*<code>'''calculate()''' </code> प्रणाली को बिना <code>static</code> मुख्य शब्द के घोषित किया जाता है। इसका मतलब है कि प्रणाली विशेष <code>OddEven</code> क्लास का उदाहरण स्वरुप इस्तेमाल करने के लिए आमंत्रित है। (प्रणाली को आमंत्रित करने के लिए प्रयोग किया गया [[सन्दर्भ (कंप्यूटर साइंस)|सन्दर्भ]] एक अघोषित <code>OddEven</code> प्रकार नामित <code>'''[[जावा मुख्यशब्द #यह|this]]''' </code> के रूप में पारित किया गया।) <code>'''[[जावा मुख्यशब्द # अगर|if]]''' </code> मुख्य शब्द का उपयोग करते हुए प्रणाली अभिव्यक्ति <code>input % 2 == 0</code> का परीक्षण यह देखने के लिए करता है कि अगर <code>input</code> क्षेत्र को बांटने वाले शेषक क्लास के उदहारण के रूप में दो गुना शुन्य है। अगर यह अभिव्यक्ति सत्य है, तभी यह '''Even''' का मुद्रण करता है; अगर यह अभिव्यक्ति गलत है तब यह '''Odd''' मुद्रण करता है। (<code>input</code> क्षेत्र को समानांतरत: <code>this.input</code> के रूप में अभिगमित किया जा सकता है, जो स्पष्टतया अघोषित <code>this</code> पैरामीटर का इस्तेमाल करता है।)
* <code>'''OddEven number = new OddEven()''' </code>; <code>main</code> प्रणाली नामित <code>number</code> में एक स्थानीय परिवर्तनीय ऑब्जेक्ट [[सन्दर्भ (कंप्यूटर साइंस)|सन्दर्भ]] की घोषणा करता है। यह परिवर्तिनीयता <code>OddEven</code> प्रकार के एक ऑब्जेक्ट के सन्दर्भ को पकड़ कर रख सकता है। घोषणा <code>number</code> की शुरुआत करती है, सर्वप्रथम <code>OddEven</code> का उदाहरण बनाकर, <code>'''[[जावा खोजशब्दों # नया|new]]''' </code> मुख्य शब्द <code>OddEven()</code> निर्माता का इस्तेमाल करते हुए और तब इस उदाहरण को परिवर्तिनीयता को निर्दिष्ट करती है।
* स्टेटमेंट <code>'''number.showDialog()''' </code>; कैलकुलेट प्रणाली को बुलाती है। स्थानीय <code>number</code> परिवर्तित द्वारा सन्दर्भित <code>OddEven</code> ऑब्जेक्ट को उदाहरण स्वरुप प्रणाली को आमंत्रित करने के लिए [[स्थानीय चर|स्थानीय परिवर्तनीयता]] का इस्तेमाल होता हैं और <code>calculate</code> प्रणाली आघोषित <code>this</code> मानदण्ड के रूप में पारित होता है।
* <code>'''input = new Integer(JOptionPane.showInputDialog("Please Enter A Number"))''' </code>; एक statement है जो '''String''' के प्रकार को [[प्राथमिक प्रकार]] '''int''' में [[आवरण क्लास|रैपर क्लास]] '''Integer''' पूर्णाक का लाभ उठाकर परिवर्तित करता है।

== विशेष क्लासों ==
=== एप्लेट ===


 जावा एप्लेट वे कार्यक्रम हैं जो दूसरे अनुप्रयोगों, विशेष प्रकार से [[वेब ब्राउज़र|वेब ब्राउसर]] में प्रर्दशित वेब पेज मे अंतःस्थापित हैं।

 <syntaxhighlight lang="java"> 
 // Hello.java 
 import javax.swing. JApplet; 
 import java.awt. Graphics;

 public class Hello extends JApplet { 
 public void paintComponent(Graphics g) { 
 g.drawString ("Hello, World!", 65, 95); 
 } 
 } 
 </ source>

 <code>'''import''' </code> स्टेटमेंट संकलन में '''''' और ''''''  क्लासों को सम्मिलित करने के लिए [[जावा कम्पाइलर|जावा संग्रहक]]  को निर्देश करती  हैं। इंपोर्ट स्टेटमेंट इन श्रेणियों को ''साधारण क्लास नाम'' (i.e. <code>JApplet</code>) को [[स्त्रोत कोड]] में सन्दर्भ रूप में  प्रयोग करने की स्वीकृति जिनके बदले में देती है, वह है  ''पूर्णत: पात्रित क्लास नाम'' (i.e. <code>javax.swing.</code><code>JApplet</code>)।

<code>Hello</code> क्लास <code>JApplet</code> (Java Applet) को <code>'''extends''' </code> ([[उपक्लास (कंप्यूटर साइंस)|उपश्रेणियां]]) करती है, <code>'''JApplet''' </code> क्लास होस्ट ऍप्लिकेशन के लिए ढांचा प्रदान करती है और एप्लेट का [[ऑब्जेक्ट जीवनकाल|जीवन चक्र]] नियंत्रण करती है। <code>JApplet</code> श्रेणी एक JComponent (जावा ग्राफिकल अवयव) है जो एप्लेट को [[ग्राफिकल यूजर इंटरफेस|ग्राफिकल उपयोगकर्ता अंतर्फलक]] (GUI) के प्रदर्शन की क्षमता प्रदान करती है और उपयोगकर्ता [[घटना-संचालित प्रोग्रामिंग|घटनाओं]] को प्रतिक्रिया देती है।

एप्लेट को प्रदर्शित करने के लिए <code>Hello</code> क्लास  [[सुपरक्लास कंप्यूटर साइंस)|सुपरक्लास]] से लिए गए वंशागत '''''' प्रणालियों का कोड प्रदान करने के लिए [[प्रणाली की अवहेलना (प्रोग्रामिंग)|उल्लंघन]] करती है। <code>paint()</code> प्रणाली ने <code>'''Graphics''' </code> ऑब्जेक्ट को पारित किया जिसमें एप्लेट के प्रदर्शन के लिए ग्राफिक सन्दर्भ सम्मिलित है। <code>paintComponent()</code> प्रणाली ग्राफिक्स सन्दर्भ '''''' प्रणाली को बुलाती है, '''"Hello,world!"''' स्ट्रिंग का प्रदर्शन करने के लिए, जो एप्लेट के प्रदर्शन में ऊपरी-दाएं कोने के (<code>'''65, 95''' </code>) [[पिक्सेल|पीक्सेल]] ऑफसेट पर होता है।

 <syntaxhighlight lang="html4strict"> 
<! DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">

<html>
<head> Good MORNING
<title>Hello World Applet</title>
</head>
<body> soul
<applet code="Hello" width="200" height="200">
</applet>
</body>
</html>
```


एक एप्लेट को  HTML तत्त्व का इस्तेमाल करके एक HTML दस्तावेज में रखा जाता है। `एप्लेट` टैग के तीन स्थापित गुण है: **<code>code="Hello"</code>**, `JApplet` श्रेणी के नाम की विशेषता बताता है और **<code>width="200" height="200"</code>** एप्लेट के पीक्सेल की चौड़ाई और ऊंचाई को स्थापित करता है। एप्लेट्स को `objects` या `embed` अवयव का इस्तेमाल करते हुए HTML में भी अंतःस्थापित किया जा सकता हैं यद्यपि वेब ब्राउज़र द्वारा इन अवयवों के लिए समर्थन असंगत हैं। जो कुछ भी हो, `applet` टैग को अनुमति दी गयी, इसलिए `object` टैग जहां भी संबंधित होता है उसे प्राथमिकता मिलती है।

होस्ट ऍप्लिकेशन, विशेष रूप से वेब ब्राउजर, **<code>Hello</code>** एप्लेट को दृष्टांत (instantiates) देती है और एप्लेट के लिए एक  का निर्माण करती है। एक बार जब एप्लेट खुद ही प्रारंभ हो जाता है, तो इसे AWT प्रदर्शन प्रदानुक्रम में जोड़ दिया जाता है। `paint` प्रणाली को जब भी प्रदर्शन को खुद खींचने के लिए एप्लेट की जरुरत होती है तो इसे AWT घटना प्रेषण सूत्र द्वारा बुलाई जाती है।

### सर्वलेट

 जावा सर्वलेट प्रौद्योगिकी वेब सर्वर की कार्यक्षमता बढ़ाने और अभिगमन मौजूदा व्यापार प्रणालियों के लिए एक सरल, निरंतर व्यवस्था के साथ वेब डेवलपर्स प्रदान करता है। सर्वलेट वे सर्वर-साइड जावा EE अवयव हैं जो ग्राहकों से अनुरोधों (विशेष प्रकार से HTTP अनुरोधों) के लिए प्रतिक्रियाओं (विशेषतः HTML पेजेस) को उत्पन्न करती हैं। सर्वलेट को उस एप्लेट की तरह सोचा जा सकता है जो बिना चेहरे के - सर्वर साइड पर चलता है।


```java
// Hello.java 
import java.io. *; 
import javax.servlet. *;

public class Hello extends GenericServlet { 
public void service(ServletRequest request, ServletResponse response) 
throws ServletException, IOException { 
response.setContentType("text/html"); 
final PrintWriter pw = response.getWriter(); 
pw.println("Hello, world!") ; 
pw.close(); 
} 
}
```


 **<code>import</code>** statements जावा संग्राहको को सार्वजनिक क्लासों और से अंतरफलक (interface) और संग्रहण में ***' और ***' पैकेजों शामिल करने के लिए निर्देश देती है।

 `'''Hello''' ` क्लास ***' क्लास को बढ़ाती <code>'''extends''' </code> है; द <code>GenericServlet</code> क्लास [[सर्वर (कम्प्यूटिंग)|सर्वर]] के लिए सर्वलेट को अनुरोध अग्रसारित करने के लिए अंतरफलक प्रदान करती है और सर्वलेट का जीवन चक्र नियंत्रण करती है।

सेवा अनुरोध निवारक को संकेत प्रदान करने के लिए, <code>Hello</code> क्लास,  अंतरफलक द्वारा परिभाषित की गयी ***' प्रणाली का विरोध करती है। `service()` प्रणाली को एक ***' ऑब्जेक्ट पारित किया जाता है जिसमें ग्राहक के लिए अनुरोध और ***' ग्राहक को वापस की गयी प्रतिक्रिया उत्पन्न करने के लिए उपयोगित ऑब्जेक्ट शामिल हैं। `service()` प्रणाली यह घोषणा करता है कि यह अपवादों  और  को `'''throws''' ` करती है अगर कोई समस्या इसे अनुरोध को प्रतिक्रिया देने से रोकती है।

प्रतिक्रिया ऑब्जेक्ट में ***' प्रणाली को '''"text/html"''' को वापस किए गए डाटा के [[MIME]] अवयव प्रकार स्थापित करने के लिए बुलाया जाता है। ***' प्रणाली प्रतिक्रिया स्वरूप एक ***' ऑब्जेक्ट वापस करती है जो डाटा लिखने में उपयोग होती है जो ग्राहक को भेजा गया है। ***' प्रणाली को बुलाया जाता है **"Hello, world!"** स्ट्रिंग लिखने के लिए, प्रतिक्रिया पर और उसके बाद मुद्रक लेखक को बंद करने के लिए ***' प्रणाली को बुलाया जाता है, जिस कारण डाटा पर प्रभाव पड़ता है जो ग्राहक को वापस किये जाने वाले स्ट्रीम को लिखा जा चुका है।

=== जावा सर्वर पेज ===


जावा सर्वर पेजेस (JSPs) [[सर्वर साइड]] जावा EE घटक हैं जो प्रतिक्रियाएं, आमतौर पर [[एचटीएमएल|HTML]] पेजेस, [[ग्राहक (कम्प्यूटिंग)|ग्राहकों]] से [[HTTP]] अनुरोध उत्पन्न करती हैं। JSPs विशेष [[परिसीमक]] के इस्तेमाल द्वारा <code lang-java"><% और <code lang-java">%> जावा कोड को एक HTML पेज में अन्तःस्थापित कर लेता है। एक JSP जावा ''सर्वलेट'' से संकलित होती है, जावा अनुप्रयोग अपने खुद के अधिकार में, पहली बार अभिगमित हुआ। इसके बाद उत्पत्तित सर्वलेट प्रतिक्रिया उत्पन्न करती हैं।

=== घुमावदार अनुप्रयोग (swing application) ===


[[स्विंग (जावा)|घुमाव (swing)]] जावा SE प्लेटफॉर्म के लिए ग्राफिकल उपयोगकर्ता अंतरफलक [[लाइब्रेरीज (कंप्यूटर साइंस)|लाइब्रेरी]] है। अलग दिख रहे दृश्य को पहचानना संभव है और [[प्लगेबल रंग और रूप|प्लगएबल लुक के द्वारा महसूस]] कीजिये और घुमाव की प्रणाली को महसूस कीजिये. [[Microsoft विन्डोज़|Windows]], [[GTK]] और [[मोटिफ (विजेट Toolkit)|Motif]] के क्लोन (clone) की आपूर्ति सन द्वारा की जाती हैं। [[एप्पल इंक॰|एपल]] भी [[एक्वा (विषय)|एक्वा]] लुक प्रदान करती हैं और [[मैक OS X|Mac OS X]] के लिए परख, जहां इन लुकों और फील्स के लिए कार्यान्वयन में कमी दिख रही है, जावा SE 6 में घुमाव ज्यादा आंतरिक का देशी [[विजेट (कम्प्यूटिंग)|विजेट]] ड्राविंग रूटीन्स का प्रयोग करके इन समस्याओं की तरफ संकेत करता है।

यह उदाहरण घुमाव अनुप्रयोग "Hello, world!" के साथ एक सिंगल विंडो का निर्माण करती हैं अन्दर:

<syntaxhighlight lang="java"> 
// Hello.java (Java SE 5)
 
import java.awt. BorderLayout; 
import javax.swing. *;

public class Hello extends JFrame { 
public Hello() { 
super("hello"); 
setDefaultCloseOperation(WindowConstants. EXIT_ON_CLOSE); 
setLayout(new BorderLayout()); 
add(new JLabel("Hello, world!")) ; 
pack(); 
}

public static void main(String[] args) { 
new Hello().setVisible(true); 
} 
} 
</syntaxhighlight>

पहला '''<code>import</code>''' स्टेटमेंट जावा संग्राहक को  पैकेज से  क्लास संग्राहकता में शामिल करने का निर्देश देती हैं; दूसरा '''<code>import</code>''' में सभी सार्वजनिक क्लासों और ***' पैकेज से अंतरफल सम्मिलत हैं।

 `'''Hello''' ` क्लास ***' क्लास को <code>'''extends''' </code> करती है, <code>JFrame</code> क्लास [[शीर्षक बार|टाइटल बार]] और [[विजेट (कम्प्यूटिंग)|बंद नियंत्रण]] के लिए एक [[विंडो (कम्प्यूटिंग)|विंडो]] लागू करती हैं।

<code>'''Hello()''' </code> [[कंन्स्ट्रक्टर (कंप्यूटर साइंस)|निर्माता]] सबसे पहले सुपर क्लास निर्माता को बुलाकर ढांचे को प्रारंभ करती है, मानदण्ड <code>'hello'</code> को पारित करते हुए, जिसका विन्डो के शीर्षक के रूप में इस्तेमाल होता हैं। इसके बाद यह <code>jframe</code> से वंशागत ***' प्रणाली को बुलाती हैं अनुपस्थित ऑपरेशन स्थापित करने के लिए, जब टाइटल बार पर क्लोस कंट्रोल के लिए ***' चुना जाता है; यह <code>jframe</code> के नष्ट होने का कारण होती है, जब ढांचा को बंद कर दिया जाता हैं (बिल्कुछ छुपे हुए के विरोध में), जो JVM को बाहर जाने की और कार्यक्रम को बाहर निकालने की अनुमति देती हैं। उसके बाद, फ्रेम का [[लेआउट प्रबंधक|ले-आउट]] <code>Borderlayout</code> पर स्थापित किया जाता है, यह घुमाव को बताता हैं कि अवयवों का कैसे प्रबंध किया जाए जिसे ढांचा में जोड़ा जाये. एक स्ट्रिंग '''"Hello, world!"''' के लिए ***' बनाया गया है और  सुपर क्लास पाई गयी ***' प्रणाली को ढांचा पर लेबल जोड़ने के लिए बुलाया जाता है।  सुपरक्लास से लिए ***' प्रणाली को विन्डो को `BorderLayout` द्वारा संकेतित तरीके में इसके अवयवों के ले आउट को आकार देने के लिए बुलाया जाता हैं।

जब कार्यक्रम शुरू होता हैं `'''main()''' ` प्रणाली को JVM द्वारा बुलाया जाता है। यह नए **<code>Hello</code>** ढांचा को दृष्टांत (instantiates) देती हैं और  सुपरक्लास से निकाले हुए **** प्रणाली बुलाकर बुलियन पैरामीटर `'''true''' ` के साथ प्रदर्शन का कारण बनती हैं। एक बार जब ढांचा प्रर्दशित हो जाता है, `main` प्रणाली कार्यक्रम को नुक़सान न पहुंचाए छोड़कर; AWT घटना प्रेषण थ्रेड क्रियाशील बनी रहती हैं और जब तक सभी उच्च स्तरीय विंडो निकल न चुके हो।

### जेनेरिक्स

2004 में जेनेरिक्स को जावा भाषा में J2SE 5.0 के भाग के रूप में सम्मिलित किया गया। जेनेरिक्स के परिचय की प्राथमिकता, हर परिवर्तनशील घोषणा विशेष प्रकार की होनी चाहिए। कंटेनर क्लासों के लिए उदाहरण के स्वरूप, यह एक समस्या है क्योंकि कंटेनर के निर्माण का कोई सरल रास्ता नहीं है जो सिर्फ विशेष प्रकार की वस्तुओं को स्वीकार करता है। या तो कंटेनर क्लास अथवा अंतरफलक, सामान्यतया `object` के उपप्रकारों पर संचालन करता है, या विभिन्न कंटेनर क्लास हर कंटेंड क्लास के लिए निर्मित होता है। जेनेरिक्स बड़ी संख्या में कंटेनर क्लासों का निर्माण किए बगैर संकलन-समय प्रकार जांच की अनुमति देती है, प्रत्येक में लगभग समान संकेत होते हैं।

## क्लास लाइब्रेरीज

* जावा लाइब्रेरीज जावा में अप्लिकेशन विकास को समर्थन करने के लिए JRE इम्प्लिमेंटर द्वारा विकसित संग्राहक (compiled) बाइट कोड के स्त्रोत कोड हैं। इन लाइब्रेरीज के उदाहरण हैं:
** मुख्य लाइब्रेरीज, जिसमें शामिल हैं:
*** कलेक्शन लाइब्रेरीज जो डेटा संरचना जैसे सूचियों, शब्दकोशों, ट्रीस(trees) और सेट को लागू करते हैं
*** XML प्रसंस्करण (पार्सिंग, ट्रांस्फोर्मिंग, मानकीकरण) लाइब्रेरीज
*** सुरक्षा
*** इंटरनेशनलाइजेशन और स्थानीयकरण लाइब्रेरीज
** एकीकृत लाइब्रेरीज, जो अप्लिकेशन लेखक को बाह्य व्यवस्था के साथ संवाद की अनुमति दे। इन लाइब्रेरीज में शामिल हैं:
*** डाटाबेस एक्सेस के लिए जावा डाटाबेस कनेक्टिविटी (JDBC) API
*** लुकअप एवं खोज के लिए जावा नामकरण और निर्देशिका अंतरफलक (JNDI)
*** वितरित अनुप्रयोग विकास के लिए RMI और CORBA
*** अप्लिकेशन प्रबंधन और निगरानी के लिए JMX
** उपयोगकर्ता इंटरफ़ेस लाइब्रेरीज, जिसमें शामिल हैं:
*** (हैवीवेट या देशी) सार विंडो टूलकिट (AWT), जो GUI घटक प्रदान करती है, जो उन अवयवों के ले-आउट के और उन अवयवों से घटनाओं से निपटने के माध्यम हैं।
*** (लाइटवेट) स्विंग लाइब्रेरीज, जो AWT पर बनी लेकिन AWT विजेट्री का (नॉन-नेटिव) कार्यान्वयन प्रदान करती है।
*** ऑडियो कैप्चर, प्रसंस्करण और प्लेबैक के के लिए APIs.
* जावा भाषिक मशीन का प्लेटफ़ार्म आश्रित कार्यान्वयन माध्यम है जिसके द्वारा जावा लाइब्रेरीज का बाइट कोड और थर्ड पार्टी अप्लिकेशन लागू होते हैं।
* Plugins, जो एप्लेट्स को वेब ब्राउज़र में चलाने के लिए सक्षम बनाती हैं।
* जावा वेब स्टार्ट, जो जावा अनुप्रयोगों को कुशलतापूर्वक वितरित करने की अनुमति उपयोगकर्ता को पूरे इंटरनेट पर देता है।
* लाइसेंसिंग और दस्तावेज़ीकरण.

## दस्तावेज़ीकरण (डोकुमेंटेशन)

जावाडोक एक व्यापक दस्तावेज़ीकरण सिस्टम है, जिसे सन माइक्रोसिस्टम्स द्वारा बनाया गया और कई जावा डेवलपर्स द्वारा प्रयोग किया गया। यह डेवलपर्स को अपने कोड के दस्तावेज़ीकरण के लिए संगठित व्यवस्था प्रदान करती है। जहां भी जावा और C में साधारण कमेंट्स /* और */, के साथ समाप्त होती हैं, बहुरेखीय कमेन्ट टैग्स, जावाडोक कमेंट्स के शुरुआत में एक अतिरिक्त तारक चिन्ह रहता है, इस तरह टैग्स /** और */ होते हैं।

### उदाहरण
 साधारण उदाहरण जावाडोक टाइप्स कमेंट्स के साथ जावा कोड कमेंट्स के उदाहरण इस प्रकार हैं: 

```java
/** 
* A program that does useful things. 
*/ 
public class Program {

/** 
* A main method. 
* @param args The arguments 
*/ 
public static void main(String[] args) { 
//do stuff 
}

}
```


## संस्करण (एडिशन)

सन ने विभिन्न अप्लिकेशन एनवायरनमेंट को लक्ष्य करते हुए जावा के चार संस्करणों को परिभाषित और समर्थन किया है और अपने APIs को खंडित किया है जिससे कि वे एक प्लेटफॉर्म से सम्बन्धित हो सके। प्लेटफॉर्म निम्नलिखित हैं:

* स्मार्टकार्डस के लिए जावा कार्ड.
* जावा प्लेटफ़ार्म, लघु संस्करण (जावा ME) - सीमित संसाधनों के साथ एनवायरनमेंट का लक्ष्य करते हुए.
* जावा प्लेटफ़ार्म, मानक संस्करण (जावा SE) - कार्य केंद्र एनवायरनमेंट लक्ष्य करते हुए.
* जावा प्लेटफ़ार्म, एंटरप्राइज संस्करण (जावा EE) - बड़े वितरित उद्यम या इंटरनेट एनवायरनमेंट का लक्ष्य करते हुए.

जावा APIs में क्लासों को पृथक समूह में संगठित किया गया हैं जिन्हें पैकेज बुलाया जाते हैं। हर पॅकेज में संबंधित अंतरफलक, क्लासों, एक्स्सेप्शन के सेट सम्मिलित होते हैं। उपलब्ध पैकेजों के विवरण के लिए अलग-अलग प्लेटफार्मों का विवरण सन्दर्भित करे.

 जावा कम्युनिटी प्रोसेस प्रोग्राम के अर्न्तगत अन्य के सहयोग के साथ सन माईक्रोसिस्टम द्वारा APIs का सेट नियंत्रित होता है। इस प्रक्रिया में भाग लेने वाले कंपनी या व्यक्ति APIs के विकास और डिजाइन को प्रभावित कर सकते हैं। प्रक्रिया एक विवाद का विषय रहा है।

सन ने पर्सनलजावा नाम का संस्करण भी प्रदान किया, जो बाद वाले मानकता-आधारित जावा ME विन्यास-प्रोफ़ाइल पैरिंग्स द्वारा प्रदान किया गया।

## आलोचना

## यह भी देखिएं
* प्रोग्रामिंग भाषाओं की तुलना
* जावा और C++ की तुलना
* जावा और C# की तुलना
* जावावन
* जावापेडिया
* जावा आभासी मशीनों की सूची
* जावा APIs की सूची
* JVM भाषाओं की सूची
* जावा स्क्रीप्टिंग भाषाओं की सूची
* C#
* जावा वर्सन का इतिहास
* ओक

## जावा ओपन सोर्स प्लेटफार्म के रूप में
ओपनसोर्स सॉफ्टवेयरों के विकास के लिये जावा का बहुतायत में प्रयोग होता है। इसके कुछ कारण इसका मुफ्त होना, क्रॉस प्रलेटफार्म होना, यूनिकोड सक्षम होना आदि हैं।

जावा इण्डिक यूनिकोड का पूर्ण समर्थन करती है, इसलिये भारतीय भाषाओं हेतु सॉफ्टवेयर विकास हेतु अत्यन्त उपयोगी है।

## नोट्स

## सन्दर्भ

* जॉन बायस, "जावा टेक्नोलॉजी: द अर्ली इयर्स".  सन डेवलपर नेटवर्क, कोई तिथि नहीं [ca. 1998]. 22 अप्रैल 2005 को लिया गया।
* जेम्स गोसलिंग, ''A brief history of the Green project''  . Java.net, कोई तिथि नहीं [ca. Q1/1998]. 29 अप्रैल 2007 को लिया गया।
* जेम्स गोसलिंग, बिल जॉय, गाई स्टील और गिलाड ब्राचा, *द जावा लैंग्वेज स्पेसिफिकेशन,* तीसरा संस्करण. एडिसन-वेस्ले, 2005. ISBN 0-321-24678-0 (विनिर्देशन का ऑनलाइन संस्करण भी देखें )।
* टिम लिंडहोम और फ्रैंक येलिन. *द जावा वर्चुअल मशीन स्पेसिफिकेशन*, दूसरा संस्करण. एडिसन-वेस्ले, 1999. ISBN 0-201-43294-3 (विनिर्देशन का ऑनलाइन संस्करण भी देखें )।

## बाहरी कड़ियाँ

* जावा मुख पृष्ठ
* जावा डेवलपर्स के लिए
* जावा भाषा विनिर्देशन संस्करण 3.
* 
* [https: / / duke.dev.java.net /ग्रीन / हरित परियोजना का संक्षिप्त इतिहास]
* जावा:द इनसाइड स्टोरी 
* जावा Objective-C से बहुत प्रभावित था
* द जावा सागा
* जावा का एक इतिहास
* द लॉन्ग स्ट्रेंज ट्रीप टु जावा
* M254 जावा हर जगह (मुक्त विश्वविद्यालय से स्वतंत्र सामग्री दस्तावेज)
* एक जावा वर्चुअल मशीन के लिए प्रोग्रामिंग भाषाओं की सूची
* CSharpJavaMerger फ्रेमवर्क - एक खुला source जावा और सी # कन्वर्सन टूल

श्रेणी:कंप्यूटर
श्रेणी:प्रोग्रामिंग भाषा)
श्रेणी:सॉफ्टवेयर अभियान्त्रिकी
श्रेणी:जावा प्लेटफार्म
श्रेणी:जावा विनिर्देश अनुरोध
श्रेणी:सी प्रोग्रामिंग भाषा परिवार
श्रेणी:सन माइक्रोसिस्टम्स
श्रेणी:कनकरेंट प्रोग्रामिंग भाषायें
श्रेणी:क्लास-आधारित प्रोग्रामिंग भाषायें
श्रेणी:ऑब्जेक्ट-उन्मुख प्रोग्रामिंग भाषायें
श्रेणी:JVM प्रोग्रामिंग भाषायें
श्रेणी:कर्ली ब्रैकेट प्रोग्रामिंग भाषायें
श्रेणी:Cross-प्लेटफ़ार्मसॉफ्टवेयर
श्रेणी:1995 में बनाये गए प्रोग्रामिंग भाषायें
श्रेणी:प्रोग्रामिंग भाषा