ইতিমধ্যে এখানে দুর্দান্ত উত্তর রয়েছে। আমি সি ++ তে পাস-বাই-রেফারেন্স এবং জাভাতে পাস-বাই-ভ্যালুর মধ্যে আচরণের বিপরীত একটি খুব সাধারণ উদাহরণ (যা সংকলন করবে) ভাগ করে একটি ছোট অবদান রাখতে চেয়েছিলাম ।
কয়েকটি বিষয়:
- "রেফারেন্স" শব্দটি দুটি পৃথক অর্থ সহ একটি বোঝা। জাভাতে এটি সহজভাবে একটি পয়েন্টার অর্থ, তবে "পাস-বাই-রেফারেন্স" এর প্রসঙ্গে এর অর্থ মূল ভেরিয়েবলের একটি হ্যান্ডেল যা পাস হয়েছিল।
- জাভা হ'ল পাস-বাই-মান । জাভা সি এর অন্যান্য বংশধর (অন্যান্য ভাষার মধ্যে)। সি এর আগে বেশ কয়েকটি (তবে সমস্ত নয়) আগের ভাষা ফরটারান এবং কোবোল পিবিআরকে সমর্থন করেছিল, তবে সি তা করেনি। পিবিআর এই অন্যান্য ভাষাগুলি উপ-রুটিনগুলির মধ্যে পাস ভেরিয়েবলগুলিতে পরিবর্তন আনার অনুমতি দেয়। একই জিনিসটি সম্পাদনের জন্য (যেমন ফাংশনের অভ্যন্তরে ভেরিয়েবলের মান পরিবর্তন করা), সি প্রোগ্রামাররা পয়েন্টারগুলিকে ভেরিয়েবলগুলিতে ফাংশনে রূপান্তরিত করে। জাভা হিসাবে সি দ্বারা অনুপ্রাণিত ভাষাগুলি এই ধারণাটি ধার করে এবং সি হিসাবে পদ্ধতিগুলিতে পয়েন্টারটি প্রদান অবিরত করে, জাভা তার পয়েন্টারগুলিকে রেফারেন্স বলে except আবার এটি "পাস-বাই-রেফারেন্স" এর চেয়ে "রেফারেন্স" শব্দের আলাদা ব্যবহার।
- সি ++ "&" অক্ষর ব্যবহার করে একটি রেফারেন্স প্যারামিটার ঘোষণার মাধ্যমে পাস-বাই-রেফারেন্সের অনুমতি দেয় (যা সি এবং সি ++ উভয় "ভেরিয়েবলের ঠিকানা" নির্দেশ করতে একই অক্ষর হিসাবে ব্যবহৃত হয়)। উদাহরণস্বরূপ, যদি আমরা রেফারেন্স দ্বারা একটি পয়েন্টারে পাস করি, প্যারামিটার এবং আর্গুমেন্ট কেবল একই বস্তুর দিকে নির্দেশ করছে না। বরং তারা একই পরিবর্তনশীল। কেউ যদি অন্য কোনও ঠিকানায় বা নথিতে সেট হয়ে যায়, অন্যটিও তাই করে।
- নীচের সি ++ উদাহরণে আমি রেফারেন্স দ্বারা একটি নাল টার্মিনেটেড স্ট্রিংয়ে একটি পয়েন্টারটি দিচ্ছি । এবং নীচের জাভা উদাহরণে আমি একটি স্ট্রিংয়ের কাছে জাভা রেফারেন্সটি দিয়ে যাচ্ছি (আবার, স্ট্রিংয়ের পয়েন্টারের সমান) মান অনুসারে। মন্তব্যগুলিতে আউটপুটটি লক্ষ্য করুন।
সি ++ রেফারেন্স উদাহরণ দিয়ে পাস:
using namespace std;
#include <iostream>
void change (char *&str){ // the '&' makes this a reference parameter
str = NULL;
}
int main()
{
char *str = "not Null";
change(str);
cout<<"str is " << str; // ==>str is <null>
}
জাভা মান উদাহরণ দ্বারা "একটি জাভা রেফারেন্স" পাস
public class ValueDemo{
public void change (String str){
str = null;
}
public static void main(String []args){
ValueDemo vd = new ValueDemo();
String str = "not null";
vd.change(str);
System.out.println("str is " + str); // ==> str is not null!!
// Note that if "str" was
// passed-by-reference, it
// WOULD BE NULL after the
// call to change().
}
}
সম্পাদনা
বেশিরভাগ লোক মন্তব্য লিখেছেন যা দেখে মনে হয় যে তারা আমার উদাহরণগুলি দেখছেন না বা তারা সি ++ উদাহরণ পান না। সংযোগ বিচ্ছিন্ন কোথায় তা নিশ্চিত নয়, তবে সি ++ উদাহরণ অনুমান করা পরিষ্কার নয়। আমি প্যাসকেলে একই উদাহরণ পোস্ট করছি কারণ আমি মনে করি পাস-বাই-রেফারেন্সটি পাস্কলে পরিষ্কার দেখাচ্ছে তবে আমি ভুল হতে পারি। আমি কেবল মানুষকে আরও বিভ্রান্ত করতে পারি; আমি আশা করি না.
পাস্কলে, পরামিতি দ্বারা উত্সিত প্যারামিটারগুলিকে "ভার প্যারামিটার" বলা হয়। নীচের পদ্ধতিতে সেটনোনিলে, দয়া করে 'ভার' শব্দটি নোট করুন যা প্যারামিটার 'পিটিআর' এর আগে রয়েছে। যখন কোনও পয়েন্টার এই পদ্ধতিতে পাস করা হয়, তখন এটি রেফারেন্স দিয়ে পাস হবে । আচরণটি নোট করুন: যখন এই পদ্ধতিটি পিটিআরটিকে শূন্য করতে নির্ধারণ করে (এটি নাসুলের পক্ষে পাস্কাল কথা বলে) তখন এটি যুক্তিকে শূন্য করে দেয় - আপনি জাভাতে এটি করতে পারবেন না।
program passByRefDemo;
type
iptr = ^integer;
var
ptr: iptr;
procedure setToNil(var ptr : iptr);
begin
ptr := nil;
end;
begin
new(ptr);
ptr^ := 10;
setToNil(ptr);
if (ptr = nil) then
writeln('ptr seems to be nil'); { ptr should be nil, so this line will run. }
end.
সম্পাদনা 2
কেন আর্নল্ড, জেমস গোসলিং (জাভা আবিষ্কার করেছেন এমন লোক) এবং ডেভিড হোমস, অধ্যায় ২, বিভাগ ২.6.৫ এর "দ্য জাভা প্রোগ্রামিং ল্যাঙ্গুয়েজ" এর কিছু অংশ
পদ্ধতিতে সমস্ত পরামিতি "মান দ্বারা" পাস করা হয় । অন্য কথায়, কোনও পদ্ধতিতে প্যারামিটার ভেরিয়েবলের মানগুলি আর্গুমেন্ট হিসাবে উল্লিখিত চালকের অনুলিপি হয়।
তিনি অবজেক্ট সম্পর্কে একই পয়েন্ট তৈরি করতে চলেছেন। । ।
আপনি সচেতন থাকা আবশ্যক যে যখন পরামিতি একটি বস্তু রেফারেন্স, এটা অবজেক্ট রেফারেন্স নয় বস্তুর নিজেই-যে হয় "মান দ্বারা" পাস ।
এবং একই বিভাগের শেষের দিকে তিনি জাভা সম্পর্কে কেবল একটি মূল্য দিয়ে পাস এবং কখনও রেফারেন্স দ্বারা পাস না হওয়া সম্পর্কে একটি বিস্তৃত বিবৃতি দেন।
জাভা প্রোগ্রামিংয়ের ভাষা রেফারেন্স দ্বারা অবজেক্টগুলি পাস করে না; এটি
মান দ্বারা অবজেক্ট রেফারেন্স পাস করে । একই রেফারেন্সের দুটি অনুলিপি একই প্রকৃত অবজেক্টকে বোঝায়, একটি রেফারেন্স ভেরিয়েবলের মাধ্যমে করা পরিবর্তনগুলি অন্যটির মাধ্যমে দৃশ্যমান। ঠিক একটি প্যারামিটার পাসিং মোড আছে - মান অনুসারে পাস করুন এবং জিনিসগুলি সহজ রাখতে সহায়তা করে।
বইয়ের এই বিভাগে জাভাতে প্যারামিটার পাস করার এবং পাস-বাই-রেফারেন্স এবং পাস-বাই-মানের মধ্যে পার্থক্য সম্পর্কে দুর্দান্ত ব্যাখ্যা রয়েছে এবং এটি জাভা স্রষ্টার দ্বারা প্রকাশিত। আমি কাউকে এটি পড়তে উত্সাহিত করব, বিশেষত যদি আপনি এখনও নিশ্চিত হন না।
আমি মনে করি দুটি মডেলের মধ্যে পার্থক্যটি খুব সূক্ষ্ম এবং যদি আপনি প্রোগ্রামিং না করেন যেখানে আপনি যেখানে পাস-বাই-রেফারেন্সটি ব্যবহার করেছেন, এটি সহজেই মিস করা যায় যেখানে দুটি মডেলের পার্থক্য রয়েছে।
আমি আশা করি এটি বিতর্ক নিষ্পত্তি করে তবে সম্ভবত তা হবে না।
সম্পাদনা 3
আমি এই পোস্টে কিছুটা অবসন্ন হতে পারি। সম্ভবত কারণ আমার মনে হয় যে জাভা নির্মাতারা অজান্তে ভুল তথ্য ছড়িয়ে দিয়েছেন। পয়েন্টারগুলির জন্য "রেফারেন্স" শব্দটি ব্যবহার করার পরিবর্তে তারা অন্য কিছু ব্যবহার করেছিলেন, ডিংলবেরি বলুন, কোনও সমস্যা হত না। আপনি বলতে পারেন, "জাভা ডিঙ্গেলবেরিকে মান দ্বারা পাস করে রেফারেন্স দ্বারা নয়" এবং কেউ বিভ্রান্ত হবে না।
কেবল জাভা বিকাশকারীদেরই এটি নিয়ে সমস্যা রয়েছে। তারা "রেফারেন্স" শব্দটির দিকে তাকিয়ে থাকে এবং তারা মনে করে যে এর অর্থটি ঠিক কী তারা জানে তাই তারা বিরোধী যুক্তি বিবেচনা করতেও বিরক্ত করে না।
যাইহোক, আমি একটি পুরানো পোস্টে একটি মন্তব্য লক্ষ্য করেছি, এটি একটি বেলুন সাদৃশ্য তৈরি করেছে যা আমি সত্যিই পছন্দ করেছি। এতটা যে আমি পয়েন্টটি চিত্রিত করার জন্য কার্টুনগুলির একটি সেট তৈরি করতে কিছু ক্লিপ-আর্ট একসাথে আঠালো করার সিদ্ধান্ত নিয়েছি।
মান দ্বারা একটি রেফারেন্স পাস করা - রেফারেন্সের পরিবর্তনগুলি কলারের সুযোগগুলিতে প্রতিফলিত হয় না, তবে অবজেক্টের পরিবর্তনগুলি। এটি কারণ রেফারেন্স অনুলিপি করা হয়েছে, তবে মূল এবং অনুলিপি উভয়ই একই বস্তুকে উল্লেখ করে।
রেফারেন্স দ্বারা পাস - রেফারেন্সের কোন অনুলিপি নেই। একক রেফারেন্স কলার এবং কল করা ফাংশন উভয় দ্বারা ভাগ করা হয়। রেফারেন্সে বা অবজেক্টের ডেটার কোনও পরিবর্তনই কলারের সুযোগগুলিতে প্রতিফলিত হয়।
সম্পাদনা 4
আমি এই বিষয়টিতে এমন পোস্টগুলি দেখেছি যা জাভাতে পরামিতিগুলির নিম্ন স্তরের প্রয়োগের বর্ণনা দেয়, যা আমি মনে করি দুর্দান্ত এবং খুব সহায়ক কারণ এটি একটি বিমূর্ত ধারণাটি কংক্রিট করে। তবে, আমার কাছে প্রশ্নটি ভাষাটির স্পেসিফিকেশনে বর্ণিত আচরণ সম্পর্কে আচরণের প্রযুক্তিগত বাস্তবায়ন সম্পর্কে বেশি। এটি জাভা ল্যাঙ্গুয়েজ স্পেসিফিকেশন, বিভাগ 8.4.1 এর একটি অংশ :
যখন পদ্ধতি বা কনস্ট্রাক্টরটি আহ্বান করা হয় (.115.12), আসল আর্গুমেন্ট এক্সপ্রেশনগুলির মানগুলি পদ্ধতি বা কনস্ট্রাক্টরের শরীরের নির্বাহের আগে নতুনভাবে তৈরি প্যারামিটার ভেরিয়েবলগুলি শুরু করে। ডিক্লেয়ারআইডে প্রদর্শিত আইডেন্টিফায়ারটি আনুষ্ঠানিক প্যারামিটারটি উল্লেখ করার জন্য পদ্ধতি বা কনস্ট্রাক্টরের শরীরে সাধারণ নাম হিসাবে ব্যবহার করা যেতে পারে।
যার অর্থ, জাভা কোনও পদ্ধতি চালানোর আগে পাস হওয়া প্যারামিটারগুলির একটি অনুলিপি তৈরি করে। অধিকাংশ লোক যারা কলেজে কম্পাইলার চর্চিত ভালো লেগেছে, আমি ব্যবহৃত "ড্রাগন বই" যা কম্পাইলার বই। এটি অধ্যায় 1-এ "কল-বাই-মান" এবং "কল-বাই-রেফারেন্স" এর একটি ভাল বর্ণনা রয়েছে The
নব্বইয়ের দশকে সংকলক-অধ্যয়নকালে আমি 1986 সাল থেকে বইটির প্রথম সংস্করণটি ব্যবহার করেছি যা জাভা প্রায় 9 বা 10 বছর পূর্বে তৈরি হয়েছিল। যাইহোক, আমি শুধু একটি কপি জুড়ে দৌড়ে 2nd Eddition 2007 থেকে যা আসলে জাভা উল্লেখ! বিভাগের ১.6..6 লেবেলযুক্ত "প্যারামিটার পাসিং মেকানিজম" প্যারামিটারটিকে সুন্দরভাবে পাস করার বর্ণনা দিয়েছে। "কল-বাই-মান" শিরোনামের নীচে একটি অংশ এখানে জাভা উল্লেখ করেছে:
কল-বাই-ভ্যালুতে, আসল প্যারামিটারটি মূল্যায়ন করা হয় (এটি যদি একটি এক্সপ্রেশন হয়) বা অনুলিপি করা হয় (যদি এটি ভেরিয়েবল হয়)। মানটি প্রক্রিয়াটির তথ্যের সাথে সম্পর্কিত আনুষ্ঠানিক প্যারামিটারের সাথে অবস্থিত। এই পদ্ধতিটি সি এবং জাভাতে ব্যবহৃত হয় এবং এটি সি ++ এর পাশাপাশি বেশিরভাগ অন্যান্য ভাষায় একটি সাধারণ বিকল্প।