2010-07-26 8 views
17

मुझे पता है कि abstract कक्षा में private के रूप में एक विधि घोषित करने के लिए यह एक अच्छा कोडिंग अभ्यास नहीं है। भले ही हम abstract कक्षा का उदाहरण नहीं बना सकते हैं, private एक्सेस संशोधक abstract कक्षा में उपलब्ध क्यों है, और abstract कक्षा के भीतर इसका दायरा क्या है? एक्सेस विनिर्देशक abstract कक्षा में उपयोग किया गया है जो परिदृश्य निर्दिष्ट करता है?जावा में एक अमूर्त वर्ग में एक निजी एक्सेस संशोधक क्यों है, भले ही हम एक अमूर्त वर्ग का उदाहरण नहीं बना सकते?

इस कोड को देखें जहां Vehicle कक्षा सार है और Car वाहन बढ़ाता है।

package com.vehicle; 

abstract class Vehicle { 

// What is the scope of the private access modifier within an abstract class, even though method below cannot be accessed?? 
    private void onLights(){ 
    System.out.println("Switch on Lights"); 
    } 

    public void startEngine(){ 
    System.out.println("Start Engine"); 
    } 

} 

के भीतर एक कार वर्ग

package com.vehicle; 
/* 
* Car class extends the abstract class Vehicle 
*/ 
public class Car extends Vehicle { 

public static void main(String args[]){ 
    Car c = new Car(); 
    c.startEngine(); 
    // Only startEngine() can be accessed 
} 

} 

उत्तर

35

चूंकि एक सार वर्ग में कार्यक्षमता हो सकती है (एक इंटरफ़ेस के विपरीत) इसमें निजी चर या विधियां हो सकती हैं।

अपने उदाहरण में आप

public void startEngine(){ 
    injectFuel(); 
    igniteSpark(); 
    // etc. my understanding of engines is limited at best 
    System.out.println("Start Engine"); 
} 

private void injectFuel() {} 
private void igniteSpark() {} 

इस तरह आप (ताकि आप एक 1000 लाइन startEngine विधि नहीं है) अन्य तरीकों के लिए काम से कुछ फैल सकता है की तरह कुछ कर सकता है, लेकिन तुम नहीं चाहते हैं कि बच्चों को अलग से इंजेक्ट करने में सक्षम होना चाहिए क्योंकि यह startEngine के संदर्भ के बाहर समझ में नहीं आता है (आप यह सुनिश्चित करना चाहते हैं कि यह केवल वहां उपयोग किया जाता है)।

या इससे भी अधिक आपके पास एक निजी विधि हो सकती है जो विभिन्न मानकों के साथ कई अन्य सार्वजनिक तरीकों से बुलाया जाता है। इस तरह आप सार्वजनिक कोडों में से प्रत्येक में दो बार या अधिक कोड लिखने से बचते हैं, और एक सामान्य विधि में सामान्य कोड को समूहीकृत करने से यह सुनिश्चित होता है कि बच्चे इसे एक्सेस न करें (जैसे वे पहले सार्वजनिक विधि का हिस्सा नहीं कह सकते)। कुछ इस तरह:

public void startEngine() { 
    dishargeBattery(50); 
    System.out.println("Start Engine"); 
} 

public void startRadio() { 
    dischargeBattery(20); 
} 

private void dischargeBattery(int value) { 
    battery.energy -= value; //battery should probably be a private field. 
} 

इस तरह अपने तरीके बैटरी के लिए उपयोग किया जा सकता है, लेकिन बच्चों को इसके साथ गड़बड़ नहीं करना चाहिए, और आप उन दोनों में एक ही पंक्ति (battery.energy -= value) नहीं लिखते। हालांकि ध्यान दें, कि ये बहुत ही सरल उदाहरण हैं, लेकिन अगर डिस्चार्ज बैटरी 500 लाइन विधि थी, तो इसे अन्य तरीकों से लिखना एक परेशानी होगी।

+0

आपने मुझे विश्वास दिलाया! – JerryGoyal

8

यह एक गैर-सार कक्षा में के रूप में ही है बनाने में एक ही पैकेज है, वहाँ कोई अंतर नहीं है।

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

आमतौर पर, निजी विधियों का उपयोग केवल आंतरिक उपयोगिता विधियों के रूप में किया जाता है जिनके पास एक बहुत विशिष्ट कार्य होता है जो कक्षा में अन्य विधियां अपना काम करने के लिए उपयोग करती हैं।

1

विधि केवल सार कक्षा के भीतर से ही पहुंचा जा सकता है। उदाहरण के लिए, आपके पास public final विधि वाला एक अमूर्त वर्ग हो सकता है जो एक निजी सहायक विधि का उपयोग करता है।

4

मैं जानता हूँ कि यह एक अमूर्त वर्ग में निजी के रूप में एक प्रणाली की घोषणा करने के लिए एक अच्छा कोडिंग प्रथा नहीं है।

मैं नहीं करता हूं। आपको यह विचार कहाँ से मिला?

एक अमूर्त वर्ग के भीतर इसका दायरा क्या है?

अमूर्त वर्ग।