असल में मेरा मानना है कि जावा डिजाइनरों ने भाषा तैयार करते समय गलती की है, और इसमें शामिल संगतता मुद्दों के कारण इसे ठीक करने में बहुत देर हो चुकी है। हां, यह बहुत भ्रामक कोड का कारण बन सकता है। हाँ, आपको इससे बचना चाहिए। हां, आपको यह सुनिश्चित करना चाहिए कि आपका आईडीई इसे एक त्रुटि, आईएमओ के रूप में इलाज के लिए कॉन्फ़िगर किया गया है। क्या तुमने कभी एक भाषा अपने आप को डिजाइन करना चाहिए, कुछ ऐसी बातें करने का एक उदाहरण के रूप में मन में यह सहन से बचने के लिए :)
बस DJClayworth की बात करने के लिए प्रतिक्रिया करने के लिए, यहाँ क्या सी # में अनुमति दी है:
public class Foo
{
public static void Bar()
{
}
}
public class Abc
{
public void Test()
{
// Static methods in the same class and base classes
// (and outer classes) are available, with no
// qualification
Def();
// Static methods in other classes are available via
// the class name
Foo.Bar();
Abc abc = new Abc();
// This would *not* be legal. It being legal has no benefit,
// and just allows misleading code
// abc.Def();
}
public static void Def()
{
}
}
क्यों मुझे लगता है कि यह भ्रामक है? क्योंकि अगर मैं कोड someVariable.SomeMethod()
पर देखता हूं तो मुझे उम्मीद है कि someVariable
के मान का उपयोग करें। यदि SomeMethod()
एक स्थिर विधि है, तो उम्मीद अमान्य है; कोड मुझे धोखा दे रहा है। यह संभवतः अच्छा चीज़ कैसे हो सकता है?
विचित्र रूप से पर्याप्त, जावा आपको एक स्थिर विधि को कॉल करने के लिए संभावित रूप से अनियमित चर का उपयोग नहीं करने देगा, इस तथ्य के बावजूद कि केवल एकमात्र जानकारी जिसका उपयोग करने जा रहा है वह चर के घोषित प्रकार है। यह एक असंगत और अनुपयोगी गड़बड़ है। इसे क्यों अनुमति दें?
संपादित करें: यह संपादन क्लेटन के उत्तर की प्रतिक्रिया है, जिसका दावा है कि यह स्थैतिक तरीकों के लिए विरासत की अनुमति देता है। यह नहीं है स्टेटिक विधियां सिर्फ पॉलिमॉर्फिक नहीं हैं।
class Base
{
static void foo()
{
System.out.println("Base.foo()");
}
}
class Derived extends Base
{
static void foo()
{
System.out.println("Derived.foo()");
}
}
public class Test
{
public static void main(String[] args)
{
Base b = new Derived();
b.foo(); // Prints "Base.foo()"
b = null;
b.foo(); // Still prints "Base.foo()"
}
}
आप देख सकते हैं, b
के निष्पादन के समय मूल्य पूरी तरह से नजरअंदाज कर दिया है: यहाँ है कि प्रदर्शन करने के लिए एक छोटा लेकिन पूरा कार्यक्रम है।
स्रोत
2009-03-04 13:57:45
अपने बिंदु पर विस्तार करने के लिए, अनावश्यक उदाहरण भी शून्य हो सकता है: 'स्ट्रिंग हैलो = शून्य; हैलो.वल्यूऑफ (123); 'काम करता है! – Thilo