Package Access, Package Contents

एक package classes, interfaces और subpackages hold करता है, और यह एक access boundary है: default (no-modifier) members सिर्फ़ इसके अंदर visible हैं, और एक public class को अपने ही नाम की एक file में रहना चाहिए।

10 min read · 9 cards · 2 checks

Read in: English · हिन्दी · ગુજરાતી


Theory

वह Helper जिसे Backstage रहना चाहिए

circulation package के अंदर आप FineTable लिखते हैं, एक small helper जो days-late को rupees में map करता है। यह plumbing है: अगर reports package (आपके teammate का code) इसे directly call करना शुरू करे, आपका हर change उसकी month-end report तोड़ देगा।

आप चाहते हैं FineTable हर circulation class के लिए usable हो और बाकी सबके लिए invisible।

Unit 2 का वह mysterious no-modifier access level याद है, "पूरा package" की तरह defined? यह वह lesson है जहाँ यह अपनी living earn करता है।

Theory

एक Package के अंदर क्या रहता है

एक package के contents हैं:

  • classes (Book, IssueRegister, FineTable)
  • interfaces (Printable, Payable)
  • exception classes (OverdueException: यह भी एक class है)
  • subpackages (circulation.fines), जो अलग packages हैं जो बस name prefix share करते हैं

Exam weight वाला एक physical rule: एक public class को exactly अपने नाम की file में declared होना चाहिए (public class IssueRegister सिर्फ़ IssueRegister.java में), और एक file में ज़्यादा से ज़्यादा एक public class हो सकती है।

At a glance

Access Levels, दूसरे Package से देखे गए

Member MarkedSame Package इसे देखता है?दूसरा Package इसे देखता है?
privateNo (सिर्फ़ own class)No
(default, कोई modifier नहीं)YesNo
protectedYesसिर्फ़ इसकी subclasses
publicYesYes

Practical

Default से Backstage

// file: circulation/FineTable.java
package circulation;

class FineTable {                 // no 'public': package-private CLASS
    static int fineFor(int daysLate) {
        return daysLate * 2;      // Rs 2 per late day
    }
}

// file: circulation/ReturnDesk.java
package circulation;

public class ReturnDesk {         // the package's public face
    public int settle(int daysLate) {
        return FineTable.fineFor(daysLate);   // same package: fine
    }
}

// In package reports, both lines below would be COMPILE ERRORS:
// circulation.FineTable.fineFor(3);     class not visible
// new circulation.FineTable();          class not visible

Quiz

class Helper { } (कोई modifier नहीं) package circulation में बैठता है। Package reports में code new circulation.Helper(); try करता है। क्या होता है?

  1. काम करता है: fully qualified name access rules bypass कर देता है
  2. Compile error: एक default-access class अपने package के बाहर invisible है
  3. काम करता है, पर सिर्फ़ Helper के public members usable हैं
  4. Constructor execute होने पर runtime exception
Show the answer

Compile error: एक default-access class अपने package के बाहर invisible है

CLASS पर कोई modifier नहीं का मतलब है package-private: बाकी हर package के लिए, Helper बस exist नहीं करता, और compiler यही कहता है। Option A वह tempting myth है जिसे यह question kill करता है: एक fully qualified name एक address है, key नहीं; यह कभी access control override नहीं करता। Option C को पहले class खुद visible होना चाहिए। Option D बहुत देर से है: Java के हर access violation की तरह, यह compile time पर मरता है।

Think first

दो Reports, कोई Fight नहीं

आपका circulation package और आपके teammate का reports package दोनों Summary नाम की एक class declare करते हैं। Tap करने से पहले: क्या project अभी भी compile होता है, और Java इन्हें कैसे अलग बताता है?

Show the answer

यह happily compile होता है। एक class का real name इसका fully qualified name है: circulation.Summary और reports.Summary पूरी तरह अलग names हैं जो बस alike खत्म होते हैं, जैसे Riya नाम की 2 students surname से distinguish होती हैं। यह packages namespaces की तरह act कर रहे हैं, access control के अलावा वे क्यों exist करते हैं इसका दूसरा बड़ा reason। एक file जिसे दोनों एक साथ चाहिए वह किसी को import नहीं करती और पूरे names लिखती है।

Watch out

जहाँ Package Access लोगों को Surprise करता है

Class पर public भूल जाना: अंदर सब कुछ public हो सकता है, पर अगर CLASS default है, कोई दूसरा package इसमें से कुछ भी touch नहीं कर सकता। जब एक import mysteriously fail हो, पहले class के अपने modifier को check कीजिए।

Packages के आर-पार protected: एक protected member दूसरे package तक सिर्फ़ एक subclass के अंदर पहुँचता है। वहाँ unrelated classes कुछ नहीं देखतीं; और Java का protected अभी भी पूरा home package include करता है, BCA304 के C++ rule से wider।

Theory

Boundary के साथ Design कीजिए

Professional Java package line deliberately इस्तेमाल करता है: shelf के front की तरह कुछ public classes (ReturnDesk), helpers इनके पीछे package-private छोड़े गए (FineTable)। Plumbing freely बदलिए; outsiders इस पर कभी depend नहीं हुए। यही Unit 2 का encapsulation है एक class से एक पूरे shelf तक scaled up। आख़िरी package lesson पूछता है machinery run time पर इन सारे shelves को कैसे FIND करती है: folders, classpath, और Package object।

Summary

Key takeaways

  • एक package classes, interfaces, exception classes और subpackages contain करता है।
  • Default (no-modifier) access = package-private: package के अंदर हर जगह visible, बाहर invisible।
  • एक default-access CLASS दूसरे packages से unusable है, इसके members चाहे कुछ भी कहें।
  • public class Name को Name.java में रहना चाहिए; per file एक public class।
  • protected = पूरा home package + दूसरे packages में subclasses।
  • 2 packages में same class name fine है: fully qualified names real names हैं।
  • Memory hook: package shelf है; no-modifier का मतलब है staff only।

Study this properly

This page is the lesson to read. In Gri-Learn the same topic is a graded deck: the self-checks are scored and your weak topics are tracked. Free to start.

Start this topic

Already have an account? Sign in

More from Threads and Packages

Gri-Learn · syllabus-mapped B.C.A. lessons in English, Hindi and Gujarati

Package Access, Package Contents · Java Programming Language · Gri-Learn