2011-07-07 10 views
12

मैं SCJP अध्ययन गाइड में स्टैटिक्स पर एक अनुभाग पढ़ रहा है, और यह निम्नलिखित का उल्लेख है:जावा में स्थैतिक तरीकों को फिर से परिभाषित करने का क्या अर्थ है?

स्थिर तरीकों ओवरराइड नहीं किया जा सकता है, लेकिन वे

नए सिरे से परिभाषित किया जा सकता है क्या वास्तव में मतलब परिभाषित करता है? क्या यह एक स्थिर विधि है जो एक ही हस्ताक्षर के साथ माता-पिता और बच्चे दोनों में मौजूद है, हालांकि उन्हें अपने वर्ग के नाम से अलग से संदर्भित किया जाता है? जैसे: Parent.doSomething(); और Child.doSomething();:

class Parent 
{ 
    static void doSomething(String s){}; 
} 

class Child extends Parent 
{ 
    static void doSomething(String s){}; 
} 

के रूप में संदर्भित?

इसके अलावा, क्या स्थिर वैरिएबल, या केवल स्थैतिक तरीकों के लिए भी लागू होता है?

उत्तर

17

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

Parent p = new Child(); 
p.doSomething(); //Invokes Parent.doSomething 

हैं तरीकों गैर स्थिर थे, बाल doSomething जनक की ओवरराइड होता है कि और child.doSomething लागू हो गया होता।

स्थिर क्षेत्रों के लिए समान है।

6

स्टेटिक का मतलब प्रति ऑब्जेक्ट की बजाय प्रति वर्ग एक है। यह दोनों विधियों और चर के लिए सच है।

एक स्थिर क्षेत्र का अर्थ यह होगा कि ऐसा कोई क्षेत्र है, इससे कोई फर्क नहीं पड़ता कि उस वर्ग की कितनी वस्तुएं बनाई गई हैं। स्थिर क्षेत्र को ओवरराइड करने के प्रश्न के लिए कृपया Is there a way to override class variables in Java? पर एक नज़र डालें। संक्षेप में: एक स्थिर क्षेत्र को ओवरराइड नहीं किया जा सकता है।

इस पर विचार करें:

public class Parent { 
static int key = 3; 

public void getKey() { 
    System.out.println("I am in " + this.getClass() + " and my key is " + key); 
} 
} 

public class Child extends Parent { 

static int key = 33; 

public static void main(String[] args) { 
    Parent x = new Parent(); 
    x.getKey(); 
    Child y = new Child(); 
    y.getKey(); 
    Parent z = new Child(); 
    z.getKey(); 
} 
} 

I am in class tools.Parent and my key is 3 
I am in class tools.Child and my key is 3 
I am in class tools.Child and my key is 3 

कुंजी कभी नहीं, वापस 33. के रूप में आता लेकिन यदि आप getKey ओवरराइड एवं बाल में जोड़ने, तो परिणाम अलग होगा।

@Override public void getKey() { 
System.out.println("I am in " + this.getClass() + " and my key is " + key); 
} 
I am in class tools.Parent and my key is 3 
I am in class tools.Child and my key is 33 
I am in class tools.Child and my key is 33 

getKey विधि को ओवरराइड करके, आप बच्चे की स्थिर कुंजी तक पहुंचने में सक्षम हैं।

0

rajah9 के जवाब में अब अगर हम दो तरीकों दोनों माता पिता और बच्चे में स्थिर हो जाता है:

public static void getKey() { 
     System.out.println("I am in and my key is " + key); 
    } 

दो बातें अब गौर करने योग्य 'this.getClass()' और चेतावनी उपयोग नहीं कर सकते ' स्थिर विधि getKey() प्रकार जनक से एक स्थिर रास्ता 'भी एक्सेस किया जाना है

Parent z = new Child(); 
    z.getKey(); 

उत्पादन

I am in class tools.Parent and my key is 3 
देंगे

I am in class tools.Parent and my key is 33 
के बजाय

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

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