2010-02-11 14 views
9

के साथ समस्या को समझने में सहायता करें मैं पढ़ रहा हूं Sybex पूर्ण जावा 2 प्रमाणन अध्ययन मार्गदर्शिका अप्रैल 2005 (ISBN0782144195)। यह पुस्तक जावा डेवलपर्स के लिए है जो जावा प्रमाणीकरण पास करना चाहते हैं।संरक्षित विधि

सही या गलत: वर्ग वाई दसवीं कक्षा का विस्तार करते हैं, तो दो वर्गों में हैं

पहुँच संशोधक बारे में एक अध्याय (अन्य संशोधक के साथ) के बाद मैं निम्नलिखित प्रश्न (# 17) पाया विभिन्न संकुल, और दसवीं कक्षा) एबी (नामक एक संरक्षित विधि, तो वाई के किसी भी मामले एबी() वाई

के किसी भी अन्य उदाहरण यह सवाल मुझे एक छोटे से उलझन की विधि कॉल कर सकते हैं है।

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

उदाहरण के लिए, आप किसी ऑब्जेक्ट को क्लोन नहीं कर सकते क्योंकि आप इसे प्राप्त करते हैं।

लेकिन प्रश्न चर प्रकार के बारे में कुछ नहीं कहते हैं, केवल उदाहरण प्रकार के बारे में।

मुझे थोड़ा उलझन में था और "सत्य" का जवाब दिया गया।

किताब में इस सवाल का जवाब

झूठी है। एक ऑब्जेक्ट जो किसी भिन्न पैकेज में सुपरक्लास से संरक्षित विधि प्राप्त करता है, वह विधि उस विधि को कॉल कर सकता है लेकिन उसी वर्ग के अन्य उदाहरणों पर नहीं।

चर प्रकार के बारे में यहां कुछ भी नहीं है, केवल उदाहरण प्रकार के बारे में नहीं है।

यह बहुत अजीब है, मुझे समझ में नहीं आता है।

क्या कोई यह बता सकता है कि यहां क्या हो रहा है?

+0

"मैं Sybex.Complete.Java.2.Certification.Study.Guide.Apr.2005.ISBN0782144195 पढ़ रहा हूं।" धन्यवाद समुद्री डाकू बे! –

उत्तर

2

सही या गलत: वर्ग वाई दसवीं कक्षा का विस्तार करते हैं, तो दो वर्गों विभिन्न संकुल में हैं, और दसवीं कक्षा के एक संरक्षित विधि एबी कहा जाता है (है), तो वाई का कोई भी उदाहरण वाई

"गलत है। एक ऑब्जेक्ट जो एक अलग पैकेज में सुपरक्लास से संरक्षित विधि को विरासत में रखता है, वह विधि स्वयं पर कॉल कर सकती है लेकिन नहीं एक ही कक्षा के अन्य उदाहरणों पर "।

की कि नीचे लिखते हैं, के रूप में BalusC किया था, और वाई के लिए एक तरीका है जिसके एबी कॉल() वाई के किसी भी अन्य उदाहरण के जोड़ने:

package one; 
public class X { 
    protected void abby() { 
    } 
} 

package other; 
import one.X; 
public class Y extends X { 
    public void callAbbyOf(Y anyOther) { 
     anyOther.abby(); 
    } 
} 

यह संभव है Y कॉल करने के लिए वाई के किसी भी उदाहरण की एबीबी() विधि जिसमें इसका संदर्भ है। तो पुस्तक में जवाब स्पष्ट रूप से गलत है। जावा में इंस्टेंस-विशिष्ट स्कॉप्स नहीं हैं (उदाहरण के लिए स्कैला जिसमें एक उदाहरण-निजी दायरा है)। जो संभव नहीं है -

अगर हम दयालु बनने की कोशिश, शायद सवाल "वाई के किसी भी अन्य उदाहरण" यह की विधि का उपयोग कर सकते है कि कह रही द्वारा मतलब जो होता है वाई के किसी भी मामले स्मृति में होना , क्योंकि जावा में प्रत्यक्ष स्मृति पहुंच नहीं है। लेकिन उस मामले में सवाल इतनी बुरी तरह से लिखा गया है कि आप यह भी जवाब दे सकते हैं: "झूठी। आप उन उदाहरणों पर विधियों को कॉल नहीं कर सकते हैं जो एक अलग जेवीएम पर हैं, या उदाहरण जो कचरा इकट्ठा किया गया है, या एक जेवीएम पर उदाहरण जो एक की मृत्यु हो गई साल पहले आदि "

0

सही या गलत: यदि कक्षा वाई कक्षा X को बढ़ाती है, तो दो वर्ग अलग-अलग पैकेजों में हैं, और कक्षा एक्स में एबीबी() नामक संरक्षित विधि है, तो वाई का कोई भी उदाहरण एबी() विधि को कॉल कर सकता है वाई

का कोई अन्य उदाहरण इसे चित्रित करें।

कक्षा एक्स:

package one; 
public class X { 
    protected void abby() {} 
} 

कक्षा Y:

package other; 
public class Y extends X {} 

testcase:

public static void main(String[] args) { 
    Y y1 = new Y(); 
    Y y2 = new Y(); 
    Y y3 = new Y(); 
    // ... 
} 

अब सवाल पुन: पढ़ने: कर सकते हैं y1y2 पर कॉल abby(), y3, आदि? पर y1 पर कॉलिंग y2, y3 आदि पर भी कॉल करेगा?

भविष्य के प्रश्नों के लिए, पेन और पेपर को पकड़ने और सचमुच प्रश्नों की व्याख्या करने का प्रयास करें। उन तरह के नकली प्रश्नों में बहुत अधिक छेद हैं।

+1

यदि आप वाई के अंदर कुछ विधि बनाते हैं जो वाई प्रकार का कोई ऑब्जेक्ट प्राप्त करता है और abby() को कॉल करने का प्रयास करता है - सबकुछ ठीक होगा। मैंने कोशिश की। – zeroed

+0

क्या प्रश्न/उदाहरण नई विधि जोड़ने के बारे में कुछ कहता है या आपने इसे स्वयं खोजा है? आपको ऐसा नहीं करना चाहिए। संदर्भ वास्तव में सवाल से आगे नहीं जाना चाहिए। अन्यथा सभी सवालों के लिए "हाँ" कहना आसान है। – BalusC

+0

लेकिन एक उदाहरण बिना किसी विधि के किसी अन्य उदाहरण पर कुछ विधि कैसे कॉल कर सकता है? O_o – zeroed

0

यह प्रश्न बुरी तरह से शब्द लगता है - और एक बहुत ही दुर्लभ किनारे के मामले के बारे में पूछता है (कि मुझे एससीजेपी परीक्षण पर भी यकीन नहीं है)। जिस तरीके से इसका उच्चारण किया गया है, वह आपके उत्तर को सही बनाता है और दिया गया उत्तर गलत है। इसी तरह की एक निर्माण कोडिंग और चल रहा यह आसानी से इस साबित होता है ...

package inside; 

public class Base { 

    private String name; 

    public Base(String name) { 
     this.name = name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public String getName() { 
     return name; 
    } 

    protected String abby(String name) { 
     String old = this.name; 
     this.name = name; 
     return old; 
    } 
} 




package outside; 
import inside.Base; 

public class Another extends Base { 

    public Another(String name) { 
     super(name); 
    } 

    public String setAnother(Another another, String hack) { 
     return another.abby(hack); 
    } 

    public static void doCrazyStuff() { 
     Another one = new Another("one"); 
     Another two = new Another("two"); 

     one.abby("Hi one"); 
     two.abby("Hi two"); 
     one.setAnother(two, "Hi two from one"); 

     System.out.println("one = " + one.getName()); 
     System.out.println("two = " + two.getName()); 

    } 

    public static void main(String[] args) { 
     Another.doCrazyStuff(); 
    } 
} 
0

क्योंकि वैरिएबल प्रकार यहाँ अप्रासंगिक है जब तक यह प्रश्न के संदर्भ में 'समझदार' है। विधि abby()X (और Y विरासत में है) से संबंधित है, इससे कोई फर्क नहीं पड़ता कि वाई के किस प्रकार के संदर्भ संदर्भ संदर्भ को घोषित किया गया है: यह या तो X या Y हो सकता है। abby() सुलभ है, हम इसे दोनों चर के माध्यम से कह सकते हैं रहें:

X myY1 = new Y(); 
myY1.abby(); 

Y myY2 = new Y(); 
myY2.abby(); 
1
The Java Language Specification से

:

6.6.2.1 Access to a protected Member

Let वर्ग है, जिसमें एक संरक्षित सदस्य मीटर घोषित किया जाता है हो सकता है सी। प्रवेश केवल सी का एक उपवर्ग एस इसके अलावा के शरीर के भीतर की अनुमति दी है, ईद एक दृष्टांत फ़ील्ड या उदाहरण विधि है, तो अर्थ है यदि:

  • पहुँच एक योग्य नाम Q.Id, जहां क्यू है द्वारा है एक अभिव्यक्ति नाम, तब पहुंच की अनुमति है यदि केवल और अभिव्यक्ति क्यू का प्रकार एस है या एस का उप-वर्ग है।
  • यदि पहुंच फ़ील्ड एक्सेस अभिव्यक्ति ई.आईडी द्वारा है, जहां ई प्राथमिक अभिव्यक्ति है, या एक विधि आमंत्रण अभिव्यक्ति E.Id (।।) द्वारा, जहां ई प्राथमिक अभिव्यक्ति है, तो एक्सेस की अनुमति है यदि और केवल यदि ई के प्रकार एस या एस

का एक उपवर्ग है तो संरक्षित सदस्य एस के सभी उदाहरणों में पहुँचा जा सकता है, और अपनी पुस्तक में इस सवाल का जवाब सिर्फ गलत है।

0

मैं लगभग निश्चित है कि सवाल का मतलब हूँ:

(नहीं वाई) "वाई के किसी भी मामले एक्स के किसी भी अन्य उदाहरण के मठ() विधि कॉल कर सकते हैं"।

उस स्थिति में यह वास्तव में असफल हो जाएगा। उपरोक्त दूसरे उत्तर से उदाहरण उधार लेने के लिए, निम्नलिखित:

package one; 
public class X { 
    protected void abby() { 
    } 
} 

package other; 
import one.X; 
public class Y extends X { 
    public void callAbbyOf(X anyOther) { 
     anyOther.abby(); 
    } 
} 

संकलित करने में विफल रहेगा।

जावा भाषा विशिष्टता बताते यहाँ क्यों: http://java.sun.com/docs/books/jls/third_edition/html/names.html#6.6.2

6.6.2.1 एक संरक्षित सदस्य

Let सी तक पहुंच वर्ग जिसमें एक संरक्षित सदस्य मीटर घोषित किया जाता है हो सकता है। प्रवेश , केवल सी के एक उपवर्ग एस इसके अलावा के शरीर के भीतर की अनुमति दी है, तो ईद एक दृष्टांत फ़ील्ड या उदाहरण विधि, अर्थ है तो है: पहुँच एक योग्य नाम Q.Id, जहां क्यू एक है द्वारा है ExpressionName, तो पहुँच की अनुमति दी है यदि और केवल यदि के प्रकार अभिव्यक्ति क्यू एस या एस का एक उपवर्ग है पहुँच एक क्षेत्र का उपयोग अभिव्यक्ति E.Id, जहां ई एक प्राथमिक अभिव्यक्ति है द्वारा है , या एक विधि आमंत्रण अभिव्यक्ति ई.आईडी (।।), जहां ई प्राथमिक अभिव्यक्ति है, तो पहुंच की अनुमति है अगर केवल तभी ई ई एस या एस (जोर मेरा) का उप-वर्ग है।

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