2015-04-28 12 views
6

मैं निम्नलिखित 2 वर्गों:जावा ऑब्जेक्ट असाइनमेंट का क्या अर्थ है?

Cat : static -- 1 
Cat : instance -- 2 

Animal : static -- 3 
Animal : static -- 4 

Cat : instance -- 5 

मैं 1,2,3 को समझ सकते हैं और 5, लेकिन क्यों # 4:

class Animal { 
    public static void staticMethod(int i) { 
     System.out.println("Animal : static -- " + i); 
    } 

    public void instanceMethod(int i) { 
     System.out.println("Animal : instance -- " + i); 
    } 
} 

class Cat extends Animal { 
    public static void staticMethod(int i) { 
     System.out.println("Cat : static -- " + i); 
    } 

    public void instanceMethod(int i) { 
     System.out.println("Cat : instance -- " + i); 
    } 

    public static void main(String[] args) { 
     Cat myCat = new Cat(); 
     myCat.staticMethod(1);      // Cat : static -- 1 
     myCat.instanceMethod(2);      // Cat : instance -- 2 
     System.out.println(""); 

     Animal myAnimal = myCat; 
     Animal.staticMethod(3);      // Animal : static -- 3 
     myAnimal.staticMethod(4);     // Animal : static -- 4 [ ? ] 
     System.out.println(""); 

     myAnimal.instanceMethod(5);     // Cat : instance -- 5 
    } 
} 

और जब मैं बिल्ली चलाने के लिए, मैं निम्नलिखित परिणाम मिला नहीं है: "बिल्ली: स्थैतिक - 4"? मेरी समझ इस तरह होगी:

myAnimal = myCat का अर्थ है "myAnimal" अब "myCat" जैसा ही है, इसलिए कहीं भी "myAnimal" apears, आप इसे "myCat" से बदल सकते हैं और एक ही परिणाम प्राप्त कर सकते हैं, क्योंकि मेरे एनीमल के अंदर सबकुछ मेरे कैट के अंदर सब कुछ जैसा ही है, इसलिए "myAnimal.staticMethod (4)" "myCat.staticMethod (4)" जैसा होना चाहिए और आउटपुट होना चाहिए: "बिल्ली: स्थिर - 4", समान ऊपर "myCat.staticMethod (1)" करने के लिए।

लेकिन ऐसा लगता है कि ऐसा क्यों नहीं है, क्यों?

+0

यहां ग्रहण मुझे बता रहा है: 'प्रकार से स्थिर विधि staticMethod (int) को एक स्थिर तरीके से एक्सेस किया जाना चाहिए क्योंकि यह एक स्थैतिक विधि है, तब यह केवल माता-पिता से जुड़ा होता है जब आप इसे ओबीजे कहते हैं 'पशु' है। –

+0

सांख्यिकी संकलन समय पर जुड़े हुए हैं। यही कारण है कि उन्हें – njzk2

+0

ओवरराइड होने से रोकें, इसके कई बार पूछे जाने वाले एक डुप्लिकेट प्रश्न – madz

उत्तर

2

Oracle docs से:

8.4.8.2। (कक्षा तरीके से)

एक वर्ग सी वाणी या एक स्थिर विधि मीटर विरासत में तो छिपाई जा रही है, तो मीटर छिपाने किसी भी विधि मीटर 'है, जहां मीटर के हस्ताक्षर एक subsignature है कहा जाता है (§8.4.2) एम 'के हस्ताक्षर, सुपरक्लास और सी के superinterfaces जो अन्यथा सी

उदाहरण 8.4.8.2-1 में कोड के लिए सुलभ होगा। छिपे हुए वर्ग के तरीकों का निमंत्रण

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

गुडनाईट, डिक

संकलन पर:

class Super { 
      static String greeting() { return "Goodnight"; } 
      String name() { return "Richard"; } 
     } 
     class Sub extends Super { 
      static String greeting() { return "Hello"; } 
      String name() { return "Dick"; } 
     } 
     class Test { 
      public static void main(String[] args) { 
       Super s = new Sub(); 
       System.out.println(s.greeting() + ", " + s.name()); 
      } 
     } 

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

2

कारण यह है कि जावा संदर्भ चर के प्रकार के आधार पर स्थैतिक विधियों को हल करता है, और रन टाइम पर polymorphically नहीं, उदाहरण के तरीकों के साथ होता है।

थोड़ा विस्तार करने के लिए, जब आप Animal myAnimal = myCat कर रहे हैं, तो आप एक पशु संदर्भ के लिए बिल्ली संदर्भ निर्दिष्ट कर रहे हैं। यह स्वीकार्य है, क्योंकि Cat भी Animal है, इसलिए Animal कुछ भी कर सकता है, Cat भी कर सकता है।

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

3

आप myAnimalAnimal के रूप में घोषित करते हैं। इसलिए उस वर्ग से भी एक स्थिर विधि कहा जाता है।

आपको इस तरह के भ्रम को रोकने के लिए किसी उदाहरण से स्थिर विधियों (या स्थैतिक फ़ील्ड तक पहुंच नहीं) कभी नहीं कहना चाहिए।

1

स्टेटिक वास्तव में इसका मतलब है कि: कॉल स्थिर हल हो गई है (आपके मामले में, यह चर की घोषित प्रकार के आधार पर हल हो गई है, और चर एक संकलन समय इकाई है)।

परिणाम आपको अपेक्षित परिणाम की आवश्यकता होगी कि कॉल गतिशील रूप से (पॉलिमॉर्फिक रूप से, संदर्भित उदाहरण के वास्तविक प्रकार के आधार पर, और उदाहरण रनटाइम इकाई है)।

1

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

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