2011-02-12 4 views
23

जावा में स्थैतिक विधियों को किसी ऑब्जेक्ट इंस्टेंस के बिना एक्सेस करने के लिए बनाया गया है। यह मुझे कुछ समझ में आता है। लेकिन हाल ही में मैं एक अजीब चीज में आया कि जावा में स्थैतिक विधि को अपने ऑब्जेक्ट इंस्टेंस के माध्यम से भी एक्सेस किया जा सकता है। यह मेरे लिए बहुत डरावना दिखता है। क्या आप में से कोई भी जानता है कि जावा द्वारा यह सुविधा क्यों प्रदान की जाती है? क्या स्थिर तरीकों के साथ-साथ बिना किसी उदाहरण के पहुंचने की इजाजत देने का महत्व क्या है?जावा में स्टेटिक विधि ऑब्जेक्ट इंस्टेंस का उपयोग करके एक्सेस किया जा सकता है

+1

बंद: हालांकि, वस्तुओं पर स्थिर तरीकों बुला एक समाधान के साथ हमें प्रदान करता है [क्यों-नहीं है-कॉल करने वाले एक स्थैतिक-विधि-दर- जिस तरह से के- एक-उदाहरण-एक त्रुटि के लिए-जावा-सह] (http://stackoverflow.com/questions/610458/why-isnt-calling-a-static-method-by-way-of -न-इंस्टेंस-ए-एरर-द-द-जावा-सह) – nawfal

उत्तर

16

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

+1

मैंने इस परिप्रेक्ष्य में नहीं सोचा था। हां, जैसा कि आपने कहा था कि यह अत्यधिक संगतता विकल्प देता है। जावा निर्दिष्ट करने के तरीके को समझने के लिए यह साहसी और रोमांचकारी है। एक बार फिर धन्यवाद :) –

+0

@Nate डब्ल्यू। इसलिए, पिछड़ा संगतता है ... यदि आपने संदर्भ का उपयोग करके एक विधि बुलाई है, तो बुलाया गया तरीका स्थैतिक या गैर स्थैतिक हो सकता है? यदि ऑब्जेक्ट संदर्भ का उपयोग करना और स्थिर विधियों को कॉल करने के लिए कक्षा का नाम उपयोग करना समान है, तो यदि विधि ** ** सिंक्रनाइज़ ** कीवर्ड है तो क्या यह 'ऑब्जेक्ट' या 'class.object' पर लॉक होगा? –

5

अर्थात् समान। कंपाइलर यह समझने के लिए पर्याप्त स्मार्ट है कि आपका क्या मतलब है (वह कक्षा के माध्यम से स्थिर विधि तक पहुंच है)। आईडीई आपको चेतावनी देंगे कि यह आपको खराब व्यवहार है :)

this question for more details पर देखें। जैसा कि वे कहते हैं कि यह भ्रामक हो सकता है और यही कारण है कि आईडीई आपको चेतावनी देंगे।

2

यह spec द्वारा अनुमत है, लेकिन इसकी अनुशंसा नहीं की जाती है। एक और चेतावनी के साथ एक ऑब्जेक्ट उदाहरण पर एक स्थिर विधि के लिए एक्लिप्स मार्क पहुंच की तरह आईडीई की तरह।

0

यह खराब है, लेकिन इसे रोकने के लिए कोई अनिवार्य कारण नहीं है।

o.f(); 

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

-2

एक और अच्छा (यद्यपि कुछ हद तक हैक-y) की सुविधा है कि यह देता है आप वस्तुओं के रूप में अनिवार्य रूप से कक्षा संदर्भों को पारित करने की क्षमता है।

Animal a = new Dog(); 
System.out.println(a.name()); 

... आप मिल जाएगा:

dog 

क्या इसका मतलब यह

public abstract class Animal { 
    public String name() { return "animal"; } 
} 

public class Dog extends Animal { 
    public String name() { return "dog"; } 
} 

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

यह और ठोस बनाने के लिए, कल्पना करें कि हम एक ऐसा फ़ंक्शन रखना चाहते हैं जो तारों की सरणी पर एक निश्चित स्ट्रिंग एन्कोडिंग करता है, और हम इसे एक फ़ंक्शन के रूप में लेना चाहते हैं जो एक स्ट्रिंग पर एन्कोडिंग करता है। हम चाहते हैं कि एन्कोडिंग वांछित के आधार पर तर्क अलग-अलग हो। प्रथम श्रेणी के कार्यों के बिना, यह सीधे करना असंभव है।

public abstract class EncodingType { 
    public String encode(String s) { return s; } 
} 

public class Base64Encoding extends EncodingType { 
    public String encode(String s) { base64Encode(s); } // Assume "base64Encode" is defined 
} 

public class Rot13Encoding extends EncodingType { 
    public String encode(String s) { rot13Encode(s); } // Assume "rot13Encode" is defined 
} 

public class Encoder { 
    public String[] encodeArray(String[] s, EncodingType enc) { 
     for (int i = 0; i < s.length; i++) { 
      s[i] = enc.encode(s[i]); 
     } 
     return s; 
    } 
} 

आप इस तरह यह कहेंगे:

Encoder e = new Encoder(); 
String[] strs = { ... }; 
strs = e.encodeArray(strs, new Rot13Encoding()); 
+0

'स्थिर '? नहीं? स्थिर 'स्थिर' के बिना स्थिर तरीकों? –

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