JShell জাভা ৯-এ একটি ইন্টারেক্টিভ টুল যা ইউজার ইনপুট নেয়, ইভ্যালুয়েট করে, এবং আউটপুট ইউজারের কাছে প্রিন্ট করে।
ভ্যালু টাইপের বিপরীতে, একটি রেফারেন্স টাইপ সরাসরি তার মান স্টোর করে না। বরং এটি সেটি স্টোর করে অ্যাড্রেস যেখানে মানটি স্টোর করা আছে। এর মানে হলো একটি রেফারেন্স টাইপ একটি পয়েন্টার ধারণ করে অন্য একটি মেমরি লোকেশনের দিকে যেটি ডেটা ধারণ করে। রেফারেন্স টাইপগুলো হলো String, অ্যারে, ক্লাস, এবং ডেলিগেটস।
নিচের কোড স্নিপেটে, যখন আমরা Animal-এর একটি নতুন ইনস্ট্যান্স তৈরি করি, এটি হিপ মেমরি-এ তৈরি হয়। new Animal() হিপে একটি অবজেক্ট তৈরি করে। Animal@73846619, অবজেক্টটি হিপে 73846619 অ্যাড্রেসে স্টোর করা আছে।
স্নিপেট-১
jshell> class Animal {
...> }
| created class Animal
jshell> Animal dog = new Animal();
dog ==> Animal@73846619
নিচের কোড স্নিপেটে, দুটি নতুন Animal অবজেক্ট হিপে তৈরি হয়। তাদের মেমরি লোকেশন (রেফারেন্স) রেফারেন্স ভেরিয়েবল dog এবং cat-এ স্টোর করা থাকে। জাভায়, সব ক্লাস রেফারেন্স টাইপস। প্রিমিটিভ ভেরিয়েবল ইনস্ট্যান্স ছাড়া, সকল ইনস্ট্যান্স বা অবজেক্ট হিপে সংরক্ষিত থাকে। অবজেক্টগুলোর রেফারেন্স রেফারেন্স ভেরিয়েবল যেমন dog এবং cat-এ স্টোর করা থাকে।
স্নিপেট-২
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
নিচের কোড স্নিপেটে, "j = i" "i"-এর মান "j"-এ কপি করে। পরে, যখন "j"-এর মান পরিবর্তন করা হয়, "i" প্রভাবিত হয় না। প্রিমিটিভ ভেরিয়েবল ব্যবহার করে, তাদের মান কম্পেয়ার করা হয়।
স্নিপেট-৩
jshell> int i = 5; i ==> 5 jshell> int j; j ==> 0 jshell> j = i; j ==> 5 jshell> j = 10; j ==> 10 jshell> i; i ==> 5 jshell> i == j; $11 ==> false jshell> j = 5; j ==> 5 jshell> i == j; $13 ==> true