2012-12-04 13 views
10

मैं एक सवाल इस कोड के बारे में यहींबहुरूपता और स्टेटिक तरीके

public Car { 
    public static void m1(){ 
     System.out.println("a"); 
    } 
    public void m2(){ 
     System.out.println("b"); 
    } 
} 

class Mini extends Car { 
    public static void m1() { 
     System.out.println("c"); 
    } 
    public void m2(){ 
     System.out.println("d"); 
    } 
    public static void main(String args[]) { 
     Car c = new Mini(); 
     c.m1(); 
     c.m2();  
    } 
} 

मुझे पता है कि बहुरूपता केवल उदाहरण के तरीकों के लिए, स्थिर तरीकों के साथ काम नहीं करता है। और यह भी कि ओवरराइडिंग स्थिर तरीकों के लिए काम नहीं करता है।

इसलिए मुझे लगता है कि इस कार्यक्रम के प्रिंट आउट करना चाहिए: सी, डी

क्योंकि सी एम 1 प्रणाली को बुलाती है, लेकिन यह स्थिर है, इसलिए इसे ओवरराइड नहीं कर सकते हैं और यह वर्ग मिनी के बजाय कार में प्रणाली को बुलाती है।

क्या यह सही है?

लेकिन, मेरा पाठ्यपुस्तक का कहना है कि इस सवाल का जवाब होना चाहिए: ए, डी

यह कोई गलती है? क्योंकि मैं अभी थोड़ा उलझन में हूँ।

कृपया इसे साफ़ करें, धन्यवाद।

उत्तर

26

क्योंकि सी एम 1 प्रणाली को बुलाती है, लेकिन यह स्थिर है, इसलिए इसे ओवरराइड नहीं कर सकते हैं और यह वर्ग मिनी के बजाय कार में प्रणाली को बुलाती है।

यह बिल्कुल पीछे की तरफ है।

cघोषितCar के रूप में है, तो स्थिर विधि c के माध्यम से किया Car द्वारा परिभाषित तरीकों कॉल करेंगे कॉल है।
कंपाइलर c.m1() को Car.m1() पर संकलित करता है, यह जानते हुए कि c वास्तव में Mini रखता है।

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

+4

+1 * यही कारण है कि आपको इस तरह के माध्यम से स्थिर तरीकों को कभी भी कॉल नहीं करना चाहिए। * – Joffrey