2010-09-07 7 views
15

अंतिम कक्षाओं में संरक्षित सदस्यों को क्यों अनुमति दी जाती है?अंतिम जावा कक्षाओं में संरक्षित सदस्यों को क्यों अनुमति दी जाती है?

क्या यह संकलन-समय त्रुटि नहीं होनी चाहिए?

संपादित करें: जैसा कि लोगों ने इंगित किया है, आप इसके बजाय डिफ़ॉल्ट संशोधक का उपयोग करके समान पैकेज एक्सेस प्राप्त कर सकते हैं। इसे बिल्कुल उसी तरह व्यवहार करना चाहिए, क्योंकि संरक्षित सिर्फ डिफ़ॉल्ट + उप-वर्ग है, और अंतिम संशोधक स्पष्ट रूप से सबक्लासिंग से इनकार करता है, इसलिए मुझे लगता है कि उत्तर केवल उसी पैकेज पहुंच प्रदान करने के लिए अधिक है।

+0

सवाल का एक प्रकार अभी भी मान्य है: क्यों हम निजी स्थिर अंतिम तरीकों हो सकती है? "निजी" का अर्थ है "अंतिम" साथ ही साथ "स्थैतिक", है ना? क्या यह अनावश्यक नहीं है? – gawi

+0

@gawi: मुझे यकीन नहीं है कि आपकी टिप्पणी की व्याख्या कैसे करें, लेकिन 'निजी' निश्चित रूप से 'स्थिर '/' अंतिम' का अर्थ नहीं है। – BalusC

+0

@ गैवी: निजी गैर-वर्चुअल, स्थैतिक नहीं है, और यह कहने का कोई मतलब नहीं है कि "निजी का मतलब अंतिम है" क्योंकि "अंतिम" केवल विरासत विधियों के संबंध में है। मैं इस बात से सहमत हूं क्योंकि मुझे निजी विधि घोषणा में "अंतिम" का उपयोग करने का वैध कारण नहीं मिला है। –

उत्तर

17

protected संशोधक तरीकों कि एक आधार वर्ग से protected तरीकों को ओवरराइड पर आवश्यक है बदलने के लिए, public करने के लिए उन सदस्यों प्रकट किए बिना नहीं करना चाहिए।

सामान्य रूप से, आप असम्बद्ध संयोजनों (जैसे protected static) को रोकने के लिए बहुत सारे अनावश्यक नियम पेश कर सकते हैं, लेकिन इससे ज्यादा मदद नहीं मिलती है। आप मूर्खता को दूर नहीं कर सकते हैं।

+0

आह, ठीक है, क्योंकि आप उन्हें डिफ़ॉल्ट या निजी बनाने के लिए दृश्यता को कम नहीं कर सकते हैं (जो शायद अंतिम श्रेणी में क्या है), ताकि आप उन्हें संरक्षित कर सकें या उन्हें बेनकाब कर सकें सार्वजनिक रूप से। हालांकि इस मामले में उन्हें डिफ़ॉल्ट बनाना दृश्यता को कम नहीं करता है (क्योंकि कोई सबक्लासिंग संभव नहीं है), इसलिए आईएमएचओ कंपाइलर शू एलडी रुकना बंद करो। –

+0

हां। मुझे कहना चाहिए था कि आप उन्हें 'सार्वजनिक' बना सकते हैं लेकिन आप नहीं चाहते हैं। असल में 'संरक्षित' असाधारण व्यवहार करता है यदि आप एक अलग पैकेज में ओवरराइड करते हैं। मैं 'संरक्षित' का प्रशंसक नहीं हूं। –

+0

अच्छा बिंदु, तरीके भी सदस्य हैं! ठोस काउंटर उदाहरण। –

14

क्योंकि संरक्षित सदस्यों को उसी पैकेज में अन्य कक्षाओं के साथ-साथ उप-वर्गों तक पहुंचा जा सकता है।

+6

निश्चित रूप से सच है, यद्यपि यदि ऐसा होता है तो आपको डिफ़ॉल्ट (पैकेज) पहुंच का उपयोग करके एक ही परिणाम मिलता है, इसलिए यह अभी भी संकलन त्रुटि हो सकता है। मुझे लगता है कि यह सिर्फ इतना सबूत है कि उन्हें सबक्लास दृश्यता और पैकेज/आंतरिक-वर्ग दृश्यता को पूरी तरह से अलग अवधारणाओं के रूप में रखना चाहिए था। वे मुझे कौन बताते हैं कि यदि उप-वर्ग में दृश्यता है, तो पैकेज भी होना चाहिए? –

+0

@ मार्क: हाँ, यह स्पष्ट रूप से सोचा नहीं जा सकता था। – skaffman

+0

"संरक्षित सदस्यों को उसी पैकेज में अन्य कक्षाओं द्वारा एक्सेस किया जा सकता है": ओ सच में ?! मैंने सोचा कि पैकेज क्या निजी है? –

9

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

+0

30 सेकंड भी sloooooooow :( – Affe

0

आप तर्क दे सकते हैं, लेकिन वैसे भी कोई वास्तविक नुकसान नहीं है। एक गैर-अंतिम वर्ग में एक संरक्षित सदस्य भी हो सकता है, लेकिन कोई उप-वर्ग नहीं है, यह किसी को भी परेशान नहीं करेगा।

+2

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

+0

आप इसे कैसे बेकार साबित कर सकते हैं? एक अंतिम श्रेणी को अंतिम श्रेणी में बदलने के लिए बाइनरी संगतता भी नहीं तोड़ती है। – irreputable

6

तर्क यहाँ कहा गया है कि protected सदस्यों को एक ही पैकेज के वर्गों द्वारा पहुँचा जा सकता है मान्य है, लेकिन इस मामले में protected डिफ़ॉल्ट दृश्यता (पैकेज-निजी) के बराबर हो जाता है, और प्रश्न बना रहता है - क्यों दोनों की अनुमति है।

  • कोई जरूरत नहीं, ना करे के लिए यह
  • एक वर्ग final अस्थायी रूप से किया जा सकता है जब तक एक डिजाइन निर्णय किया जाता है:

    मैं दो बातें लगता है कि चाहते हैं। एक जाने के लिए और सभी दृश्यता संशोधक हर बार जब वह कहते हैं या निकाल देता final

+2

+1: हालांकि मुझे आश्चर्य हुआ कि "गलत" उत्तरों कितने तेज़ हो गए। क्या यह औसत ज्ञान के बारे में कुछ बताता है? – BalusC

-1
package p; 

import java.sql.Connection; 

public final class ProtectedTest { 
    String currentUser; 
    Connection con = null; 

    protected Object ProtectedMethod(){ 
     return new Object(); 
    } 
    public ProtectedTest(){ 
    } 
    public ProtectedTest(String currentUser){ 
     this.currentUser = currentUser; 
    } 
} 

package p; 

public class CallProtectedTest { 
    public void CallProtectedTestMethod() { 
     System.out.println("CallProtectedTestMethod called :::::::::::::::::"); 
     ProtectedTest p = new ProtectedTest(); 
     Object obj = p.ProtectedMethod(); 
     System.out.println("obj >>>>>>>>>>>>>>>>>>>>>>>"+obj); 
    } 
} 

package p1; 

import p.CallProtectedTest; 

public class CallProtectedTestFromp2 { 
    public void CallProtectedTestFromp2Method(){ 
     CallProtectedTest cpt = new CallProtectedTest(); 
     cpt.CallProtectedTestMethod(); 
    } 

    public static void main(String[] args) { 
     CallProtectedTestFromp2 cptf2 = new CallProtectedTestFromp2(); 
     cptf2.CallProtectedTestFromp2Method(); 
    } 
} 
+2

कुछ स्पष्टीकरण शायद ? – cheesemacfly

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

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