🧬
Memory & Lifecycle

Init Blocks, Cloning और Serialization

Object Lifecycle Extras
💡 Static block एक building का "एक-बार-होने-वाला" inauguration है — class load होते ही सिर्फ़ एक बार चलता है। Cloning एक photocopier है जो object की हूबहू copy बना देता है। Serialization एक suitcase में object को pack करके कहीं भेज देना है, ताकि बाद में वही चीज़ वापस निकाल (deserialize) सको।

Static block { } class load होते ही एक बार चलता है — static variables initialize करने के लिए best। Instance block हर object बनते वक़्त चलता है (constructor से पहले)।

clone() Object class का method है जो एक existing object की copy बना देता है (Cloneable interface implement करना पड़ता है)।

Serializable interface implement करके object को bytes में convert कर सकते हो (जैसे file में save करना या network पर भेजना), और बाद में deserialize करके वापस object बना सकते हो।

class Config implements Cloneable, Serializable {
  static { System.out.println("Loaded once!"); }
  int value = 10;
}
🧬
Static block एक building का "एक-बार-होने-वाला" inauguration है — class load होते ही सिर्फ़ एक बार चलता है। Cloning एक photocopier है जो object की हूबहू copy बना देता है। Serialization एक suitcase में object को pack करके कहीं भेज देना है, ताकि बाद में वही चीज़ वापस निकाल (deserialize) सको।
1 / 5
⚡ झट से Recap
  • static block = class load पर एक बार
  • clone() = object की copy
  • Serializable = object को save/भेजो, वापस बनाओ
इस page में (4 subtopics)

Shallow clone (default clone() behavior, Object class से inherited) सिर्फ top-level fields copy करता है — अगर field खुद एक object (reference type) है, दोनों clones उस *same* nested object को point करते हैं (एक change करेगा तो दूसरे में भी दिखेगा, क्योंकि reference copy हुई है, object नहीं)।

Deep clone nested objects को भी individually copy करता है — पूरी तरह independent copy, लेकिन manually implement करना पड़ता है (हर nested object का भी अपना clone() call करना, recursively)।

Shallow CloneDeep Clone
Primitive fieldsCopy होती हैंCopy होती हैं
Reference fields (objects)Same object share होता हैनया independent copy बनता है
Implement करनाआसान (default clone())Manual, हर nested object clone करना
// Shallow: dono objects ka "address" field same object point karta hai
Person clone = original.clone();
clone.address.city = "Mumbai"; // original.address.city bhi change ho jaayega!

Serialization के वक्त कुछ fields skip करना हो (जैसे password, या किसी cache जो re-computable है, या कोई field जो Serializable ही नहीं है जैसे Thread), उन्हें transient mark करो — serialize होते वक्त ये fields ignore हो जाते हैं, और deserialize होने पर उनकी default value (0/null) मिलती है।

class User implements Serializable {
  String username;
  transient String password; // serialize NAHI hoga
}
⚠️Common Mistake: अगर एक class के अंदर कोई field खुद Serializable नहीं है (जैसे एक Thread या Socket object), और तुम उसे transient mark नहीं करते, पूरी class को serialize करने की कोशिश पर NotSerializableException आएगी।

Serializable class में एक static final long serialVersionUID define करना best practice है — यह एक "version number" है जो बताता है class का structure कैसा था जब object serialize हुआ। अगर तुम इसे explicitly नहीं लिखते, JVM automatically compute कर देता है (class के structure से), लेकिन यह compiler/platform के हिसाब से बदल सकता है।

अगर बाद में class change हो जाए (नया field add हो) और पुराना serialized data deserialize करो, JVM serialVersionUID check करके incompatible version detect कर लेता है (InvalidClassException) — explicit UID रखने से तुम control करते हो कि कब "compatible" माना जाए।

जब class पहली बार load होती है: (1) static variables/blocks उनके declaration order में एक बार चलते हैं (पूरे program में सिर्फ एक बार)। हर बार जब "new" से object बनता है: (2) instance variables/blocks declaration order में चलते हैं, (3) फिर constructor चलता है।

इसलिए static block सबसे पहले (एक बार, class load पर), instance block हर object के लिए constructor से just पहले। Inheritance के साथ order और interesting हो जाता है — parent के static blocks पहले, फिर child के static blocks, फिर (object बनते वक्त) parent के instance blocks + constructor, फिर child के।