JShell Java 9 का इंटरैक्टिव टूल है जो रेफरेंस प्रकारों (कक्षाएं, इंटरफेस, ऐरे, स्ट्रिंग्स) के साथ प्रयोग करने की अनुमति देता है। प्रिमिटिव प्रकारों के विपरीत, रेफरेंस प्रकार मान को सीधे संग्रहीत नहीं करते - वे हीप पर ऑब्जेक्ट का पता (रेफरेंस) संग्रहीत करते हैं।
रेफरेंस प्रकार बनाम प्रिमिटिव प्रकार
| पहलू | प्रिमिटिव (int, boolean, आदि) | रेफरेंस (String, Class, Array) |
|---|---|---|
| संग्रहण | मान सीधे (स्टैक) | पता/रेफरेंस (स्टैक) → ऑब्जेक्ट (हीप) |
| डिफ़ॉल्ट मान | 0, false, आदि | null |
| असाइनमेंट | मान कॉपी करता है | रेफरेंस कॉपी करता है (उसी ऑब्जेक्ट को इंगित करता है) |
| तुलना (==) | मान तुलना | पहचान तुलना (समान ऑब्जेक्ट?) |
| उदाहरण | int, double, boolean, char | String, Object, Arrays, Interfaces |
JShell सत्र: कक्षा इंस्टेंस (रेफरेंस प्रकार)
jshell> class Animal { }
| created class Animal
jshell> Animal dog = new Animal()
dog ==> Animal@73846619
// dog हीप पर Animal ऑब्जेक्ट का रेफरेंस रखता है (पता 73846619)
JShell सत्र: एकाधिक ऑब्जेक्ट्स, अलग रेफरेंस
jshell> class Animal {
...> int id;
...> public Animal(int id) { this.id = id; }
...> }
| created class Animal
jshell> Animal dog = new Animal(10)
dog ==> Animal@6adede5
jshell> Animal cat = new Animal(20)
cat ==> Animal@5025a98f
// दो अलग-अलग ऑब्जेक्ट्स, दो अलग-अलग हीप पते
// dog और cat अलग-अलग रेफरेंस वेरिएबल्स हैं
JShell सत्र: प्रिमिटिव बनाम रेफरेंस असाइनमेंट
jshell> // प्रिमिटिव: मान कॉपी
jshell> int i = 5
i ==> 5
jshell> int j = i // i का मान j में कॉपी
j ==> 5
jshell> j = 10 // j बदलता है
j ==> 10
jshell> i // i अप्रभावित!
i ==> 5
jshell> i == j
$11 ==> false
jshell> j = 5
j ==> 5
jshell> i == j // मान समान
$13 ==> true
JShell सत्र: रेफरेंस असाइनमेंट (शेयर्ड ऑब्जेक्ट)
jshell> class Box { int value; }
| created class Box
jshell> Box box1 = new Box()
box1 ==> Box@12345678
jshell> box1.value = 100
$2 ==> 100
jshell> Box box2 = box1 // रेफरेंस कॉपी - समान ऑब्जेक्ट!
box2 ==> Box@12345678
jshell> box2.value = 200 // box1 के माध्यम से भी दिखाई देता है
$4 ==> 200
jshell> box1.value
$5 ==> 200 // बदल गया!
jshell> box1 == box2 // समान पहचान
$6 ==> true
JShell सत्र: ऐरे (रेफरेंस प्रकार)
jshell> int[] arr1 = {1, 2, 3}
arr1 ==> int[3] { 1, 2, 3 }
jshell> int[] arr2 = arr1 // समान ऐरे रेफरेंस
arr2 ==> int[3] { 1, 2, 3 }
jshell> arr2[0] = 99
$3 ==> 99
jshell> arr1[0] // arr1 के माध्यम से भी बदल गया
$4 ==> 99
jshell> // कॉपी बनाने के लिए:
jshell> int[] arr3 = arr1.clone()
arr3 ==> int[3] { 99, 2, 3 }
jshell> arr3[0] = 0
$6 ==> 0
jshell> arr1[0] // अप्रभावित
$7 ==> 99
JShell सत्र: String (विशेष रेफरेंस प्रकार)
jshell> String s1 = "hello"
s1 ==> "hello"
jshell> String s2 = "hello" // स्ट्रिंग पूल - समान ऑब्जेक्ट!
s2 ==> "hello"
jshell> s1 == s2
$3 ==> true
jshell> String s3 = new String("hello") // हीप पर नया ऑब्जेक्ट
s3 ==> "hello"
jshell> s1 == s3
$5 ==> false
jshell> s1.equals(s3)
$6 ==> true
jshell> // इम्मुटेबिलिटी: संशोधन नया ऑब्जेक्ट बनाता है
jshell> String s4 = s1.toUpperCase()
s4 ==> "HELLO"
jshell> s1 // अपरिवर्तित
s1 ==> "hello"
नल रेफरेंस
jshell> String str = null
str ==> null
jshell> str.length()
| Exception java.lang.NullPointerException
| at (#1:1)
jshell> // नल-सुरक्षित पैटर्न
jshell> str?.length() // Java 21+ (नहीं JShell 9 में)
| Error: unexpected token
jshell> // Java 9 पैटर्न
jshell> str != null ? str.length() : 0
$3 ==> 0
jshell> // Objects.requireNonNull
jshell> import java.util.Objects
jshell> Objects.requireNonNull(str, "str नल नहीं हो सकता")
| Exception java.lang.NullPointerException: str नल नहीं हो सकता
रेफरेंस प्रकार के लिए सर्वोत्तम अभ्यास
- तुलना के लिए .equals() का उपयोग करें (सामग्री), == पहचान के लिए (समान ऑब्जेक्ट?)
- नल जांचें डीरेफरेंसिंग से पहले
- रक्षात्मक कॉपी बनाएं परिवर्तनीय ऑब्जेक्ट्स वापस/पास करते समय
- अपरिवर्तनीयता पसंद करें - रेफरेंस साझाकरण बग्स से बचाता है
- ऐरे क्लोन करें साझाकरण से बचने के लिए:
arr.clone()याArrays.copyOf()
सारांश
- रेफरेंस प्रकार = हीप पर ऑब्जेक्ट का पता संग्रहीत करते हैं
- असाइनमेंट रेफरेंस कॉपी करता है, ऑब्जेक्ट नहीं
- सभी कक्षाएं, इंटरफेस, ऐरे, स्ट्रिंग्स रेफरेंस प्रकार हैं
- प्रिमिटिव = मान संग्रहीत करते हैं, रेफरेंस = पता संग्रहीत करते हैं
==पहचान जांचता है,.equals()सामग्री जांचता है- स्ट्रिंग्स अपरिवर्तनीय हैं + पूल्ड (लिटरल्स)