Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> Java

JShell में Java 9: रेफरेंस प्रकार घोषित करना और उपयोग करना

JShell Java 9 का इंटरैक्टिव टूल है जो रेफरेंस प्रकारों (कक्षाएं, इंटरफेस, ऐरे, स्ट्रिंग्स) के साथ प्रयोग करने की अनुमति देता है। प्रिमिटिव प्रकारों के विपरीत, रेफरेंस प्रकार मान को सीधे संग्रहीत नहीं करते - वे हीप पर ऑब्जेक्ट का पता (रेफरेंस) संग्रहीत करते हैं।

रेफरेंस प्रकार बनाम प्रिमिटिव प्रकार

पहलूप्रिमिटिव (int, boolean, आदि)रेफरेंस (String, Class, Array)
संग्रहणमान सीधे (स्टैक)पता/रेफरेंस (स्टैक) → ऑब्जेक्ट (हीप)
डिफ़ॉल्ट मान0, false, आदिnull
असाइनमेंटमान कॉपी करता हैरेफरेंस कॉपी करता है (उसी ऑब्जेक्ट को इंगित करता है)
तुलना (==)मान तुलनापहचान तुलना (समान ऑब्जेक्ट?)
उदाहरणint, double, boolean, charString, 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() सामग्री जांचता है
  • स्ट्रिंग्स अपरिवर्तनीय हैं + पूल्ड (लिटरल्स)
  1. - JShell में Java 9: सिस्टम प्रॉपर्टीज कैसे प्राप्त करें

    JShell Java 9 का REPL टूल है जो बिना main() मेथड के Java कोड को इंटरैक्टिव रूप से चलाने की अनुमति देता है। इसे कमांड लाइन पर jshell टाइप करके शुरू किया जा सकता है। सिस्टम प्रॉपर्टीज एक्सेस करने के तरीके 1. एकल प्रॉपर्टी प्राप्त करना: System.getProperty(key) विशिष्ट कुंजी के लिए मान लौटाता है, या य

  1. Java 9 में JavaFX का उपयोग करके JShell को प्रोग्रामेटिक रूप से लागू करें Java 9 में JavaFX का उपयोग करके JShell को प्रोग्रामेटिक रूप से लागू करें

    Java 9 ने jdk.jshell API पेश किया जो डेवलपर्स को अपने एप्लिकेशन में JShell कार्यक्षमता को एम्बेड करने की अनुमति देता है। यह लेख दिखाता है कि एक JavaFX एप्लिकेशन कैसे बनाया जाए जो JShell का उपयोग करके कोड स्निपेट्स का मूल्यांकन करता है और परिणाम प्रदर्शित करता है। आवश्यक निर्भरताएं Java 9+ (JSh

  1. - जावा 9 में JShell क्या है?

    JShell जावा 9 संस्करण में पेश की गई एक नई अवधारणा है। यह जावा को REPL (रीड-इवैल-प्रिंट-लूप) क्षमता प्रदान करता है। JShell का उपयोग करके, हम इसे कंपाइल किए बिना जावा-आधारित लॉजिक और एक्सप्रेशन का परीक्षण कर सकते हैं। REPL तत्काल फीडबैक लूप के रूप में कार्य करता है और उस विशेष भाषा में उत्पादकता पर बह