एक स्थिर विधि को एक विधि क्यों माना जाता है?


135

मैं एक कोर्स के लिए कुछ कोड के लिए एक स्पष्टीकरण लिख रहा हूं, और गलती से शब्दों का उपयोग कर रहा हूं methodऔर functionविनिमेय रूप से। मैंने वापस जाने का फैसला किया और शब्दों को ठीक किया, लेकिन मेरी समझ में छेद हो गया।

मैं जो समझता हूं, वह एक सबरूटीन है functionयदि यह किसी वर्ग की आवृत्ति पर कार्य नहीं करता है (इसका प्रभाव उसके स्पष्ट इनपुट / आउटपुट तक सीमित है), और methodयदि यह एक कक्षा के उदाहरण पर संचालित होता है (यह हो सकता है) उदाहरण पर दुष्प्रभाव जो इसे अशुद्ध करते हैं)।

इस विषय पर यहाँ एक अच्छी चर्चा है । ध्यान दें कि स्वीकृत उत्तर की परिभाषाओं के अनुसार, एक स्थिर methodवास्तव में एक फ़ंक्शन होना चाहिए क्योंकि एक उदाहरण कभी भी अंतर्निहित नहीं होता है, और इसमें किसी भी उदाहरण के सदस्यों तक पहुंच नहीं होती है।

हालांकि यह मन है, स्थैतिक methodsवास्तव में कार्य नहीं होना चाहिए ?

अपनी परिभाषा के अनुसार वे किसी वर्ग के विशेष उदाहरणों पर कार्य नहीं करते हैं; वे केवल संबंध के कारण कक्षा से "बंधे" हैं। मैंने कुछ अच्छी दिखने वाली साइटें देखी हैं जो स्थिर उप-क्षेत्रों को "विधियों" के रूप में संदर्भित करती हैं , हालांकि ( Oracle , Fredosaurus , ProgrammingSimplified ), इसलिए या तो वे सभी शब्दावली को देख रहे हैं, या मुझे कुछ याद आ रहा है (मेरा अनुमान बाद का है) ।

मैं यह सुनिश्चित करना चाहता हूं कि मैं सही शब्दों का उपयोग कर रहा हूं।
किसी को भी यह स्पष्ट कर सकते हैं?


2
मैंने हमेशा सोचा था कि यह जावा में php और विधि में कार्य करता था। मूल रूप से अलग-अलग नामों के साथ एक ही चीज
जेके

19
सैद्धांतिक कंप्यूटर विज्ञान और एक भाषा इसे कैसे लागू करती है, के बीच अंतर है। JLS कोई भेद नहीं करता है और इसे एक विधि कहता है।
जीरो वेनवेल


2
यह "समारोह" और "विधि" अजगर, जहां में की परिभाषा को देखने के लिए ब्याज की हो सकती है है मूल रूप से, एक समारोह प्रतीक तालिका के साथ कोड और एक बुला सम्मेलन का एक हिस्सा है, जबकि एक विधि क्या है: एक अंतर जब आप एक वर्ग में एक समारोह में डाल दिया। हालांकि यह अंतर काफी सूक्ष्म है, यहां तक ​​कि उन लोगों को भी जो पायथन को जानते हैं।
डेविड जेड

2
जब मैं सिद्धांत सीख रहा था, मैंने सीखा कि फ़ंक्शन एक मान देता है और प्रक्रिया नहीं करता है। तब मैंने जावा कॉल फ़ंक्शंस और प्रक्रियाओं के तरीकों को सीखा। अब मैं कार्यात्मक programmjng की कोशिश कर रहा हूं और एक फ़ंक्शन idempotent है। शब्द संदर्भ पर अर्थ बदल देते हैं।
एमोरी

जवाबों:


123

8.4.3.2 से यह उद्धरण मदद कर सकता है:

एक विधि जिसे घोषित किया staticजाता है उसे एक वर्ग विधि कहा जाता है ।

एक विधि जिसे घोषित नहीं किया staticजाता है उसे एक आवृत्ति विधि कहा जाता है [...]।

  • कक्षा के तरीके: एक वर्ग के साथ जुड़े।
  • उदाहरण के तरीके: एक उदाहरण के साथ जुड़े।

जावा आपको केवल "ऑब्जेक्ट-ओरिएंटेड सोचना" चाहता है। इसके अलावा, स्थैतिक तरीकों में एक आसपास के दायरे तक पहुंच होती है जिसमें राज्य शामिल हो सकते हैं। एक तरह से, कक्षा एक वस्तु के समान है।


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

1
लैम्ब्डा वास्तव में @FunctionalInterfaceएनोटेशन और हुड के नीचे 1 विधि के साथ अनाम आंतरिक वर्ग हैं । एक लैम्ब्डा सिंटैक्टिक शुगर है और इस संबंध में कुछ नया नहीं है।
एडम एरॉल्ड

1
@AadArold लैम्ब्डा एक गुमनाम आंतरिक वर्ग की तुलना में काफी कट्टर हैं। उदाहरण के लिए, गैर-कैप्चरिंग लैम्ब्डा एक विशेष अभिव्यक्ति के कई मूल्यांकन में एक उदाहरण साझा कर सकते हैं। (लेकिन आप सही हैं कि वे अंततः स्थैतिक और उदाहरण के तरीकों से संकलित हो जाते हैं।)
रेडियोडफ

@Radiodef शायद वाक्यांश के लिए एक बेहतर तरीका होगा "सभी लंबोदर अभिव्यक्तियों को समान गैर-लंब्डा अभिव्यक्तियों के साथ प्रतिस्थापित किया जा सकता है, बिना लंबोदर अभिव्यक्ति वाले एक के अलावा अन्य फ़ाइलों में कोई बदलाव किए बिना" या ऐसा कुछ।
user253751

4
मैं शर्मिंदा हूँ। मैं स्काला से आ रहा हूं और फिर भी इस तथ्य को याद करने में कामयाब रहा कि वर्ग स्वयं वस्तु जैसा है। धन्यवाद।
कार्कजनेट

80

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


3
ये सही है। जावा 7 को शामिल करने तक आपको भाषा विशिष्टता
इरविन बोलविद्ट

4
मुझे इस उत्तर की सादगी पसंद है, मुझे लगता है कि रेडिओडफ का उत्तर ट्रैक पर अधिक है क्योंकि इसमें उस महत्वपूर्ण बिंदु का उल्लेख है जो वर्ग स्वयं एक वस्तु के रूप में कार्य करता है। फिर भी आपका धन्यवाद।
दोपहर

2
दिलचस्प बात यह है कि, यह पहले की भाषाओं के फैसलों और कार्यों और सबरूटीन्स के बीच अंतर न करने का निर्णय है।
यादृच्छिक 832

4
मुझे यह जानकर अचरज हुआ कि इस उत्तर को बहुत उभार मिले। सबसे पहले, यह उत्तर बताता है कि वर्ग विधियाँ मौजूद नहीं हैं। दूसरे, यह शायद ही जावा में शुरू की गई अवधारणा है। उदाहरण के लिए, स्मालटाक में पहले से ही क्लास के तरीके मौजूद थे, जो कि जावा के बनने से पहले दशकों से था।
मैल्कम

1
@ मैल्कम मुझे आपसे सहमत होना है। अन्य उत्तरों पर विचार करने के बाद, यह गलत लगता है। यह जावा निर्माता के हिस्से पर उदासीनता नहीं है, जब तक कि वे वास्तव में परवाह नहीं करते हैं, लेकिन इसे सही ढंग से नामकरण किए बिना समाप्त कर दिया है।
Carcigenicate

26

स्थैतिक विधियां वास्तव में कार्य नहीं हैं, अंतर सूक्ष्म है, लेकिन महत्वपूर्ण है।

केवल दिए गए इनपुट मापदंडों का उपयोग करते हुए एक स्थिर विधि अनिवार्य रूप से एक फ़ंक्शन है।

लेकिन स्थिर तरीकों स्थैतिक चर और अन्य स्थिर कार्यों (भी स्थैतिक चर का प्रयोग करके) तो स्थिर तरीकों एक हो सकता है का उपयोग कर सकते राज्य जो मौलिक रूप से एक समारोह जो परिभाषा से कर रहे हैं करने के लिए अलग है राज्यविहीन । (ADDENDUM: जबकि प्रोग्रामर अक्सर "फ़ंक्शन" को परिभाषा के रूप में उपयोग करने के साथ इतने सख्त नहीं होते हैं, कंप्यूटर विज्ञान में एक सख्त फ़ंक्शन केवल इनपुट मापदंडों तक पहुंच सकता है)। इसलिए स्थैतिक क्षेत्रों तक पहुँचने के इस मामले को परिभाषित करना यह कहना वैध नहीं है कि स्थैतिक तरीके हमेशा कार्य करते हैं।

एक और अंतर जो "स्थैतिक विधि" के उपयोग को सही ठहराता है, वह यह है कि आप C को वैश्विक कार्यों और वैश्विक चर को व्युत्पन्न कर सकते हैं जिन्हें हर जगह पहुँचा जा सकता है। यदि आप उस कक्षा तक नहीं पहुँच सकते हैं जिसमें स्थिर विधियाँ हैं, तो विधियाँ भी दुर्गम हैं। तो "स्थिर तरीके" वैश्विक कार्यों के विपरीत डिजाइन द्वारा उनके दायरे में सीमित हैं।


2
मुझे यह उत्तर पसंद है, लेकिन कुछ चीजों को बेहतर ढंग से समझना चाहूंगा। फ़ंक्शन बनाम विधि के बजाय यह अधिक "शुद्ध" बनाम "साइड-इफ़ेक्टिव" फ़ंक्शन नहीं है? या क्या यह है कि एक विधि दुष्प्रभाव के कारण ऐसी है? मैं यहां सिर्फ दिमाग लगा रहा हूं।
नादिर संपोली

2
यह उत्तर सही है। हालांकि, कोई यह तर्क दे सकता है कि कई (अधिकांश?) भाषाओं में फ़ंक्शन वैश्विक चर तक पहुंच सकते हैं, इसलिए वे अक्सर सख्ती से स्थिर नहीं होते हैं (एक ही इनपुट, एक ही आउटपुट)। और जावा स्टैटिक विधियों के मामले में, क्लास वेरिएबल्स तक पहुँचने के लिए "ग्लोबल" (यानी फंक्शन / मेथड के लिए लोकल नहीं) वेरिएबल्स के बराबर माना जा सकता है - क्लास का उदाहरण नेमस्पेस की तरह।
20:15 पर leonbloy

1
@leonbloy शुद्ध कार्यात्मक प्रोग्रामिंग भाषाओं जैसे हास्केल पूरी तरह से स्टेटलेस हैं; ऐसा कुछ भी नहीं है जिसे ग्लोबल वैरिएबल कहा जा सके।
थोरस्टन एस

17

जावा में, एक उपयोगकर्ता-परिभाषित वर्ग वास्तव में java.lang.Class के एक उपवर्ग का एक उदाहरण है।

इस अर्थ में, स्थिर तरीकों रहे हैं एक वैचारिक वर्ग का एक उदाहरण से जुड़ी: वे java.lang.Class का एक उपवर्ग का एक उदाहरण से जुड़े होते हैं।

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


क्या इस उपवर्ग के दो उदाहरण होना संभव है?
रैंडम 832

बेशक, आप अलग-अलग क्लास लोडर में एक कक्षा लोड कर सकते हैं (संदेश के साथ ClassCastException प्राप्त करने का कारण "कस्टमक्लास को कस्टमक्लास को नहीं दे सकता है")।
दुन्नी

2
@ Random832 - की तरह। आपके पास एक ही कक्षा उपवर्ग में एक ही JVM के दो (या अधिक) उदाहरण हो सकते हैं, जब तक कि प्रत्येक उदाहरण का अपना अलग क्लास लोडर हो। आप क्लास लोडर के अनुसार एक से अधिक बार एक ही क्लास उपवर्ग को इंस्टेंट नहीं कर सकते हैं। यह थोड़ा भ्रामक हो जाता है और क्लासिक OO अवधारणाओं के अनुरूप इस बिंदु पर थोड़ा पतला होने लगता है।
माइक क्लार्क

@ माइक क्लार्क अगर मैं ऐसा करता हूं, तो क्या वे वास्तव में एक जैसे हैं? जैसे, क्या वर्ग उपवर्ग एक ही वर्ग होगा, भले ही वर्ग स्वयं इसका एक अलग उदाहरण हो? क्लास लोडर मेरे लिए बहुत भ्रमित कर रहे हैं। क्या मैं (बिना परावर्तन के) किसी कक्षा के एक कक्षा के लोडर के उदाहरण को उसी वर्ग के दूसरे लोडर के उदाहरण से कॉल कर सकता हूं, जिसके संदर्भ में यह पारित हुआ है? क्या होगा अगर उनके पास अलग-अलग तरीके हैं?
रैंडम 832

1
@ Random832 "किस प्रकार?" विशुद्ध रूप से OO सिद्धांत के दृष्टिकोण से, क्या किसी वर्ग के दो उदाहरण कभी वास्तव में एक जैसे होते हैं? एक ही वर्ग के बहुत कम से कम दो अन्यथा समान उदाहरणों में अलग-अलग पते होंगे। अन्यथा, हम दो चीजों के कैसे हो सकते हैं? केवल एक चीज जो वास्तव में कुछ के समान है, वह चीज ही है।
माइक क्लार्क

11

कंप्यूटर विज्ञान कार्य में स्पष्ट रूप से एक स्थिर विधि के लिए नक्शे। लेकिन एक वर्ग का "तरीका" थोड़ा सामान्य है, जैसे "सदस्य" (क्षेत्र सदस्य, विधि सदस्य)। जैसे शब्द हैं

डेटा सदस्यों और विधि सदस्यों के दो अलग-अलग नाम स्थान होते हैं: .x और .x () सह-अस्तित्व में हो सकते हैं।

तो इसका कारण है, जैसा कि दार्शनिक लुडविग विट्गेन्स्टाइन ने कहा, भाषा विभिन्न संदर्भों के साथ एक उपकरण है। "विधि" एक "सदस्य" को श्रेणीबद्ध करने के लिए ऊपर प्रशस्ति पत्र में एक अच्छा मोनिकर है।


9

आपकी सोच सही है और यह समझ में आता है। यह जावा समुदाय में सिर्फ शब्दावली स्थापित नहीं है। मुझे कुछ इंटर्नल समझाते हैं जो यह समझने में मदद कर सकते हैं कि शब्दावली क्यों होती है।

जावा एक वर्ग आधारित वस्तु उन्मुख भाषा है। एक विधि हमेशा एक वर्ग या उदाहरण का सदस्य होता है (यह अन्य प्रोग्रामिंग भाषाओं के लिए भी मान्य एक सामान्य कथन है)। हम दोनों वस्तुओं के वर्ग और उदाहरण के बारे में सोचते हैं।

इंस्टेंस विधि (गतिशील)

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

कक्षा विधि (स्थिर)

आप केवल कक्षा से ही इस पद्धति को लागू कर सकते हैं, अर्थात आपको उस वर्ग का उदाहरण बनाने की आवश्यकता नहीं है। पूरे कार्यक्रम में उस पद्धति की केवल एक वैश्विक परिभाषा है। जब पद्धति को स्थिर घोषित किया जाता है, तो आप ठीक उसी विधि हस्ताक्षर को अधिलेखित नहीं कर सकते, क्योंकि पूरे कार्यक्रम के लिए केवल एक ही परिभाषा मान्य है। ध्यान दें कि विधि स्वयं कक्षा ऑब्जेक्ट का सदस्य है, उदाहरणों में उस पद्धति के सभी समान अद्वितीय (और फिक्स) संदर्भ हैं।


7

यहाँ एक शब्दावली पर एक और विचार है, स्काला का उपयोग एक महामारी के रूप में करें:
स्काला में आपके पास objectएस है, जो एक अंतर्निहित परिभाषित वर्ग के एकल उदाहरण हैं1 है

आपकी परिभाषा के अनुसार, हम इन उप- object विधियों को विधि से संबंधित कह सकते हैं , क्योंकि वे कक्षा के एक ही उदाहरण पर काम करते हैं।
इसके अतिरिक्त ऑब्जेक्ट क्लास ए को भी परिभाषित करेगा, और ऑब्जेक्ट ए के सभी तरीकों को क्लास ए पर स्थिर तरीकों के रूप में बनाएगा (जावा के साथ इंटरफेस करने के लिए) [2]

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


महान तुलना। मैं स्काला को जानता हूं, इसलिए आपका objectसंदर्भ बहुत मायने रखता है। धन्यवाद।
कैरिजनेट

2

बेशक, मुख्य अंतर यह है - विधि स्थैतिक क्षेत्रों का उपयोग कर सकती है, न केवल विधि पैरामीटर। लेकिन अतिरिक्त एक है - बहुरूपता! मूल्यांकन कक्षा A.doTheSameStaticMethod () और ClassB.doTheSameStaticMehod () के परिणाम कक्षा के निर्भर होंगे। इस मामले में फ़ंक्शन नपुंसक है।


1

प्रत्येक वर्ग के पास इसका प्रतिनिधित्व करने के लिए एक वस्तु होती है जो वर्ग के उपवर्ग का एक उदाहरण है Class। इन वस्तुओं पर स्थैतिक विधियाँ वास्तव में उदाहरण विधियाँ हैं जो कक्षा के एक उपवर्ग का उदाहरण हैं। उनके पास स्थिर क्षेत्रों के रूप में राज्य तक पहुंच है, इसलिए वे केवल (स्टेटलेस) कार्यों के लिए प्रतिबंधित नहीं हैं। वे तरीके हैं।

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