Is Data Passed by Reference or by Value in Java?
সাধারণত জাভাতে দুই ধরনের ডাটা, এক মেথড থেকে অন্য মেথডে পাস করা যায়
- প্রিমিটিভ ডাটা (int, boolean, long)
- অবজেক্ট
প্রথমে দেখে নেই প্রিমিটিভ ডাটা পাস হলে কি হয়
public class App {public static void main(String[] args) throws Exception {int data = 7;printData(data);System.out.println(data); // 7}private static void printData(int data) {data = data + 3;System.out.println(data); // 10}}
এখানে printData(data); যখন কল করা হয়েছে তখন data হিসাবে ৭ কপি করে পাঠানো হচ্ছে। যার ফলে printData মেথডে ডাটা পরিবর্তন করলেও মূল মেথড ডাটার মান অপরিবর্তিত থেকেছে। এখানে থেকে স্পষ্ট পিমিটিভ এর ক্ষেত্রে জাভা পাস বাই ভেলু হিসাবে ডাটা পাস করে।
এবার অবজেক্ট পাস করে দেখা যাক,
কোডের রেজাল্ট দেখে মনে হবে জাভা অবজেক্টের ক্ষেত্রে রেফারেন্স পাস করেছে, তা না হলে মেথডে ডাটা পরিবর্তন করার পর মেইন মেথডেও কিভাবে পরিবর্তন হয়? কথা কিছুটা সত্য। এখানে জাভা Data ক্লাস এর রেফারেন্স এর ভ্যালু কপি করে printData মেথডে পাঠিয়েছে। তাই এই ডাটা ক্লাসে পরিবর্তন করলে মেইন মেথডে পরিবর্তন পাওয়া যায়।
কিন্তু আমি যদি সেই রেফারেন্স অন্য ডাটা রাখি, তাহলে মূল ডাটার কোনো পরিবর্তন হবে না। যদি হত, তাহলে পাস বাই রেফারেন্স হত। তাই নিশ্চিতভাবে বলতে পারি, অবজেক্টের ক্ষেত্রেও জাভা অবজেক্টের রেফারেন্স ভ্যালু আকারে পাস করে।
public class App {public static void main(String[] args) throws Exception {Data data = new Data();data.setX(7);printData(data);System.out.println(data.getX()); // 7}private static void printData(Data data) {data = new Data();data.setX(10);System.out.println(data.getX()); // 10}}class Data {private int x;public int getX() {return x;}public void setX(int x) {this.x = x;}}
তাই প্রিমিটিভ এবং অবজেক্ট সব ক্ষেত্রেই জাভা মেথড কলে ডাটা ভেলু হিসাবে পাস করে, রেফারেন্স হিসাবে নয়।