Theory
कोई भी Catalog Vandalise कर सकता है
पिछला lesson एक uncomfortable note पर खत्म हुआ। Program में कहीं भी, कोई भी code लिख सकता है:
b1.copies = -50;
Minus 50 copies। या एक prank: collection से ठीक पहले member.fineDue = 0;। Compiler इसे सब approve करता है, क्योंकि हर field अभी सबके लिए open है।
Real systems records को एक counter के पीछे रखते हैं: आप एक change request करते हैं, और desk rules apply करती है। Java का counter access controls से बना है।
Theory
new असल में क्या करता है
पहले, object creation की precise anatomy, एक exam favourite:
Book b = new Book();
3 चीज़ें होती हैं:
Book bएक reference variable declare करता है (यह एक Book की तरफ़ point कर सकता है, currently किसी की तरफ़ नहीं)new Book()heap पर एक Book के fields के लिए memory allocate करता है और इसका constructor run करता है=reference को उस नए object की तरफ़ point कराता है
Split form equally legal है: Book b; b = new Book();
At a glance
4 Access Levels, Narrowest पहले
| Modifier | इसे कौन Access कर सकता है |
|---|---|
| private | सिर्फ़ same class के अंदर का code |
| (no modifier / default) | same package में कोई भी class |
| protected | Same package, plus कहीं भी subclasses |
| public | हर जगह |
Practical
copies Counter के पीछे जाता है
class Book {
private int copies = 3; // locked: only Book's own code may touch
String title; // default access: whole package
public boolean issue() { // the public front desk
if (copies > 0) {
copies--;
return true;
}
return false; // never goes below 0
}
public int getCopies() { return copies; }
}
public class BookBridge {
public static void main(String[] args) {
Book b = new Book();
b.issue();
System.out.println(b.getCopies()); // 2
// b.copies = -50; // uncomment: compile error, private access
}
}
Quiz
एक field को बिल्कुल कोई access modifier नहीं दिया गया: int copies; इसे कौन access कर सकता है?
- सब, हर जगह: कोई modifier का मतलब है कोई restriction नहीं
- सिर्फ़ वह class जिसने इसे declare किया
- Same package में कोई भी class
- सिर्फ़ declaring class की subclasses
Show the answer
Same package में कोई भी class
कोई modifier खुद एक level है, जिसे default या package-private कहा जाता है: पूरा package (Java का folder-जैसा grouping, Unit 4) इसे access कर सकता है, outsiders नहीं कर सकते। Option A trap है; Java में कोई fully-unrestricted-by-omission rule नहीं है। Option B private describe करता है, option D roughly protected का extra grant है। Exams default को exactly इसीलिए पसंद करते हैं क्योंकि students assume करते हैं absence का मतलब है either everything या nothing।
Think first
Vandal कब पकड़ा जाता है?
copies अब private होने के साथ, कोई BookBridge के main में b.copies = -50; लिखता है। Tap करने से पहले: क्या यह program run होने पर fail होता है, या पहले?
Show the answer
पहले: यह कभी compile ही नहीं होता। javac copies has private access in Book के साथ रुकता है। Access control compile time पर enforce होता है, तो illegal touches program exist कर पाने से पहले catch हो जाते हैं, Java की robustness का एक और example। इसे पिछले lesson के NullPointerException से contrast कीजिए, जो एक runtime crash है: exams पूछना पसंद करते हैं कौन सी failures compile-time हैं और कौन सी runtime।
Watch out
दो Subtle Rules जो Marks खोते हैं
private per-class है, per-object नहीं: Book के अपने code के अंदर, एक Book दूसरे Book की private fields touch कर सकता है (this.copies + other.copies एक Book method में legal है)। Wall class के आस-पास खड़ी है।
Java का protected C++ से wider है: यह पूरा package PLUS कहीं भी subclasses grant करता है। BCA304 ने protected को "class + children only" सिखाया; उस definition को एक Java answer में carry करना package half खो देता है।
Theory
यह Encapsulation Born हो रहा है
Private data plus public methods जो इसे guard करते हैं: उस pattern का एक नाम है, encapsulation, OOP के 3 pillars में से एक, और इसे जल्द ही अपना पूरा lesson मिलता है। नोट कीजिए guard ने हमें क्या दिया: issue() copies को 0 से नीचे push नहीं कर सकता, तो invalid state अब impossible है, सिर्फ़ unlikely नहीं। अगला lesson problem का बाकी आधा हिस्सा fix करता है: पहली जगह हर Book sensible values के साथ born हो यह ensure करना, constructors के ज़रिए।
Summary
Key takeaways
- Book b = new Book(); एक reference declare करता है, object allocate करता है, और दोनों को connect करता है।
- 4 access levels: private (class), default (package), protected (package + subclasses), public (हर जगह)।
- कोई modifier का मतलब है package-private, open-to-all नहीं।
- Access violations compile-time errors हैं; illegal program कभी run नहीं होता।
- private class guard करता है, हर object को नहीं: same-class code सब देखता है।
- Java का protected package include करता है, C++ के protected से wider।
- Memory hook: private, package, protected, public: हर step पर door ज़्यादा wide खुलता है।