সি জাঙ্কারের চেয়ে জাভা রেফারেন্স কীভাবে আলাদা?


97

সি এর পয়েন্টার রয়েছে এবং জাভাতে রেফারেন্স বলা হয়। এগুলি এই অর্থে কিছু জিনিস প্রচলিত রয়েছে যে তারা সকলেই কোনও কিছুর প্রতি নির্দেশ দেয়। আমি জানি যে সিতে পয়েন্টারগুলি তারা যে ঠিকানাগুলিতে নির্দেশ করে সেগুলি সঞ্চয় করে। রেফারেন্সও কি ঠিকানা সঞ্চয় করে? পয়েন্টারটি আরও নমনীয় এবং ত্রুটি-প্রবণ ছাড়া কীভাবে তারা আলাদা হয়?


10
নোট সি ++ এও রেফারেন্স রয়েছে যা পয়েন্টার বা জাভা রেফারেন্স
জে কে

@jk। আমি ভেবেছিলাম এটি জাভা হিসাবে একই হবে। পার্থক্য কি?
গিঞ্জুহুজ

17
সি ++ রেফারেন্সগুলি পুনঃতমনযোগ্য নয় (অর্থাত্ আপনি মনোনীত বস্তুটি পরিবর্তন করতে পারবেন না) এবং শনাক্তযোগ্য নয় (অর্থাত্ তাদের যথাযথভাবে কোনও বস্তুর রেফারেন্স থাকতে পারবেন না)।
এপ্রোগ্রামার

@ গ্র্নিজোহজ @ এপ্রোগ্রামার যা বলেছিলেন তার পুনঃপ্রণালী: finalজাভাতে একটি রেফারেন্স প্রায় এক সি ++ রেফারেন্সের সমান। এগুলি ঠিক সমতুল্য না হওয়ার কারণটি হ'ল একটি সি ++ রেফারেন্স অতিরিক্তভাবে ছোট হয় না, তবে finalজাভাতে একটি উল্লেখ উল্লেখযোগ্য হয় ul
উত্কু

উত্তর:


142

ঠিকানাগুলি সংরক্ষণ করে রেফারেন্সগুলি প্রয়োগ করা যেতে পারে। সাধারণত জাভা রেফারেন্সগুলি পয়েন্টার হিসাবে প্রয়োগ করা হবে, তবে এটি নির্দিষ্টকরণের দ্বারা প্রয়োজন হয় না। তারা আরও সহজে আবর্জনা সংগ্রহ সক্ষম করার জন্য বাড়তি দিকনির্দেশের একটি স্তর ব্যবহার করছেন। তবে শেষ পর্যন্ত এটি (প্রায় সর্বদা) (সি-স্টাইল) পয়েন্টারগুলিকে (জাভা-স্টাইল) রেফারেন্সগুলি প্রয়োগের সাথে জড়িত থাকার জন্য সিদ্ধ করে দেবে।

আপনি রেফারেন্স সহ পয়েন্টার পাটিগণিত করতে পারবেন না। সি এর পয়েন্টার এবং জাভাতে একটি রেফারেন্সের মধ্যে সর্বাধিক গুরুত্বপূর্ণ পার্থক্য হ'ল আপনি আসলে জাভাতে কোনও রেফারেন্সের অন্তর্নিহিত মানটি পেতে (এবং হেরফের করতে পারবেন না)। অন্য কথায়: আপনি পয়েন্টার পাটিগণিত করতে পারবেন না।

সিতে আপনি একটি পয়েন্টারে (অর্থাত্ ঠিকানা) কিছু যুক্ত করতে পারেন বা "কাছাকাছি" থাকা জিনিসগুলিতে বা কোনও জায়গায় যে জায়গাগুলি নির্দেশ করতে পারেন তার দিকে নির্দেশ করতে কোনও কিছু বিয়োগ করতে পারেন ।

জাভাতে, একটি উল্লেখ কেবল একটি জিনিস এবং সেই জিনিসটির দিকে নির্দেশ করে। আপনি কোনও ভেরিয়েবলকে আলাদা রেফারেন্স ধরে রাখতে পারেন তবে আপনি এটি "মূল জিনিসটির পরে জিনিস" নির্দেশ করতে বলতে পারেন না।

তথ্যসূত্র দৃ strongly়ভাবে টাইপ করা হয়। আরেকটি পার্থক্য হল যে একটি রেফারেন্স ধরণ হয় অনেক বেশি কঠোরভাবে জাভা নিয়ন্ত্রিত চেয়ে পয়েন্টার ধরণ সি রয়েছে সি ইন আপনি একটি থাকতে পারে int*এবং সামনে ছুঁড়ে char*ও ঠিক সেই অবস্থানে মেমরি পুনরায় ব্যাখ্যা। জাভাতে এই পুনরায় ব্যাখ্যার কাজ হয় না: আপনি কেবলমাত্র রেফারেন্সের অন্য প্রান্তে বস্তুটি ইতিমধ্যে এমন কিছু হিসাবে ব্যাখ্যা করতে পারেন (অর্থাত্ বস্তুটি আসলে একটি হলেObject আপনি কেবলমাত্রString রেফারেন্সের রেফারেন্স দিতে পারেনString )।

এই পার্থক্যগুলি সি পয়েন্টারগুলিকে আরও শক্তিশালী, তবে আরও বিপজ্জনক করে তোলে। এই দুটি সম্ভাবনাই (পয়েন্টার পাটিগণিত এবং পুনরায় ব্যাখ্যা করে মূল্যবোধের দিকে নির্দেশ করা হচ্ছে) সিটিতে নমনীয়তা যুক্ত করে এবং ভাষার কিছু শক্তির উত্স হয়। কিন্তু তারা আরো সমস্যার বড় উত্স, যদি ভুল করে ব্যবহার করা তারা সহজে অনুমানের যে আপনার কোড চারপাশে নির্মিত হয় ভাঙ্গতে পারে কারণ। এবং এগুলি ভুলভাবে ব্যবহার করা বেশ সহজ।


18
জন্য +1 শক্তি । বাস্তবায়ন বিশদ উপর নির্ভর করবেন না।
একটি সিভিএন

2
+1 আবর্জনা সংগ্রহ নির্দিষ্ট বোল্ড পয়েন্ট হিসাবে উল্লেখের যোগ্য নয়? এটি আরেকটি উপায়ে যে সি পয়েন্টারগুলি আরও শক্তিশালী তবে আরও বিপজ্জনক (মেমরির দুর্নীতি সৃষ্টিকারী স্মৃতি ফাঁসের ঝুঁকির ঝুঁকি, স্মৃতি ফাঁসের ঝুঁকি)
মার্কজে

রেফারেন্স এবং পয়েন্টারগুলির মধ্যে আরেকটি পার্থক্য হ'ল সি এর একটি পয়েন্টার সংখ্যার ক্রমতে রূপান্তরিত হতে পারে (যেমন memcpyএকটিতে একটিতে সরানোর জন্য ব্যবহার করে char[]) এবং বিপরীতে। যদি কোনও পয়েন্টার সংখ্যার ক্রমে রূপান্তরিত হয় যা কোথাও সঞ্চিত রয়েছে (সম্ভবত পর্দায় প্রদর্শিত হবে এবং অপারেটর দ্বারা কাগজের স্লিপে অনুলিপি করা হয়েছে), কম্পিউটারের মধ্যে পয়েন্টারের সমস্ত কপি নষ্ট হয়ে যায়, এবং সংখ্যার ক্রমটি রূপান্তরিত হয় কোনও পয়েন্টারে ফিরে (সম্ভবত অপারেটর টাইপ করার পরে), পয়েন্টারটি অবশ্যই এর আগে একই জিনিসটি নির্দেশ করবে। একটি প্রোগ্রাম যা ...
সুপারক্যাট

... একটি পয়েন্টারকে সংখ্যা হিসাবে প্রদর্শিত হয় এবং তারপরে ম্যানুয়ালি প্রবেশ করা সংখ্যাকে একটি পয়েন্টারে রূপান্তরিত করা হতে পারে "দুষ্টু" হতে পারে তবে অপারেটর যদি এমন সংখ্যায় টাইপ না করে যা কোনও বৈধ রূপ হিসাবে দেখানো হয়নি unless পয়েন্টার। সাধারণভাবে আবর্জনা সংগ্রহ পুরোপুরি পোর্টেবল সিতে অসম্ভব, কারণ কম্পিউটারটি জানতে পারে এমন কোনও উপায় নেই যে মহাবিশ্বে কোনও পয়েন্টারের অনুলিপি থাকতে পারে কিনা exist
সুপারক্যাট

জেএলএস অনুসারে, §4.3.1, জাভায় রেফারেন্সগুলি পয়েন্টার হিসাবে রয়েছে, সুতরাং "সাধারণত জাভা রেফারেন্সগুলি পয়েন্টার হিসাবে প্রয়োগ করা হবে, তবে এটি নির্দিষ্টকরণের দ্বারা প্রয়োজনীয় নয়" " মিথ্যা
লিউ ব্লচ

8

সি ++ রেফারেন্সগুলি আবার আলাদা।

সেগুলি সূচনা করতে হবে এবং নাল হতে পারে না (কমপক্ষে একটি সুগঠিত প্রোগ্রামে নয়) এবং অন্য কোনও কিছু উল্লেখ করার জন্য পুনর্বাসনা করা যায় না। একটি সি ++ রেফারেন্স অনেক বেশি কোনও জিনিসের জন্য একটি উপামের মতো।

পয়েন্টার এবং জাভা / সি ++ রেফারেন্সের মধ্যে আরেকটি গুরুত্বপূর্ণ পার্থক্য হ'ল আপনি কোনও পয়েন্টারের ঠিকানা নিতে পারেন যা আপনি কোনও রেফারেন্সের ঠিকানা অ্যাক্সেস করতে পারবেন না (আসলে কোনও সি ++ রেফারেন্স আসলে মেমরির কোনও বস্তু হিসাবে উপস্থিত থাকতে পারে না) ফলস্বরূপ আপনার একটি থাকতে পারে পয়েন্টারটিতে পয়েন্টার তবে রেফারেন্সের কোনও রেফারেন্স নয়


4

জাভা রেফারেন্স এবং সি পয়েন্টার ঠিক দুটি পয়েন্টের মধ্যে পৃথক:

  1. প্রাক্তনটির জন্য কোনও পয়েন্টার-গাণিতিক নেই।
  2. এবং আপনি যা চান তাতে জাভা রেফারেন্স তৈরি করতে পারবেন না, আপনি কেবল সেগুলি সংরক্ষণযোগ্য কোনও স্থানে (স্থিতিশীল ক্ষেত্র, অবজেক্টের ক্ষেত্রগুলি, স্থানীয় ভেরিয়েবলগুলি) অনুলিপি করতে পারেন বা ফাংশন-অনুরোধগুলি (যেমন কনস্ট্রাক্টর-কলস) দ্বারা ফিরে এসেছেন, যা সমস্ত জাভা উল্লেখ করে বস্তু (কখনো রেফারেন্স মত মৌলিক প্রকারের, char, intইত্যাদি)।

কেউ লিখেছেন যে রেফারেন্সগুলি দৃ strongly়ভাবে টাইপ করা হয়, কারণ আপনি সংকলকটিকে একটি int*হিসাবে বিবেচনা করতে বাধ্য করতে পারবেন না char*
সেই নির্দিষ্ট রূপান্তরটি আসলে নিরাপদ এই বিষয়টি থেকে সম্পূর্ণ আলাদা , সি-তে কোনও পলিমারফিজম নেই, যাতে তুলনাটি একটি অ-স্টার্টার।
অবশ্যই জাভা সি এর চেয়ে বেশি জোরালোভাবে টাইপ করা হয়েছে, এটি জা জাফারেন্স বনাম সি পয়েন্টারগুলির একটি বৈশিষ্ট্য নয়, আপনার প্রকারের সুরক্ষা (জেনেরিক বিধিনিষেধ উপেক্ষা করা বাদ দিয়ে) জেএনআই ব্যবহার করতে হবে, তবে সিতেও আপনাকে বাধ্য করতে হবে সংকলক

কেউ লিখেছেন যে জাভা রেফারেন্সগুলি সি পয়েন্টার হিসাবে প্রয়োগ করা যেতে পারে, যার কাছে আমি নিশ্চিত বলেছি যে, 32 বিট মেশিনে তারা সাধারণত কম শক্তিশালী হয়, যদি সিভিতে জেভিএম প্রয়োগ করা হয় । যদিও B৪ বিট মেশিনে, তারা স্থান এবং ব্যান্ডউইদথ বাঁচাতে সাধারণভাবে সংক্ষেপিত সাধারণ-অবজেক্ট-পয়েন্টার ("সংকুচিত ওওপিগুলি") থাকে।
যাইহোক, এই সি পয়েন্টারগুলি হার্ডওয়্যার অ্যাড্রেসের সমতুল্য হওয়া উচিত নয়, এমনকি যদি তারা সাধারণত (> বাস্তবায়নের 99%) কর্মক্ষমতা কারণে হয়।
পরিশেষে, এটি একটি বাস্তবায়ন বিশদ যা প্রোগ্রামারটির কাছে প্রকাশিত হয় না।


-1

এগুলি কিছুটা আলাদা। জাভাতে রেফারেন্সের একটি অনুলিপি কলিং ফাংশনটির স্ট্যাকের সাথে অনুলিপি করা হয়, কলিং ফাংশন হিসাবে একই বস্তুর দিকে নির্দেশ করে এবং আপনাকে সেই অবজেক্টটি ম্যানিপুলেট করার অনুমতি দেয়। যাইহোক আপনি কলিং ফাংশনটি উল্লেখ করা বস্তুটি পরিবর্তন করতে পারবেন না।

নিম্নলিখিত জাভা কোড বিবেচনা করুন

public static void changeRValue(StringBuffer sb){
    sb = new StringBuffer("helllllo"); /*attempt to assign the reference
                                        to a new object*/
}
public static void main(String[] args) {
    StringBuffer sb = new StringBuffer("hi");     //Create a new string buffer
    changeRValue(sb);                             //Call changeRValue
    System.out.println(sb.toString());            //Prints "hi" not "hello"
}

এখন সি ++ তে একটি পয়েন্টার বিবেচনা করুন:

void func(Dog* dog){
    *dog = Dog("hello world"); //Change the value of dog to a new object
}

int main(int argc, const char * argv[]) {
    Dog dog1("hi");                            //Create a dog object
    func(&dog1);                               //pass the address of dog
    cout << dog1.name;                         //Prints "hello world" not hi.
    return 0;
}

আমি ভেবেছিলাম আমি যুক্ত করতে পারি যে এটি কোনও
কনট

2
আপনি জাভাতে পয়েন্ট-টু অবজেক্টটি সি ++ এর মতো একই স্বাচ্ছন্দ্যে পরিবর্তন করতে পারেন। আপনার সঠিক সদস্যদের অ্যাক্সেস থাকা দরকার। জাভা অবজেক্টে অ্যাসাইনমেন্ট-অপারেটর নেই কারণ জাভা ব্যবহারকারী-সংজ্ঞায়িত অপারেটর-ওভারলোডিং সমর্থন করে না, তাই আপনি একটি ওভারলোডেড অপারেটর, বড় চুক্তি ব্যবহার করতে পারবেন না। জাভাটির অভাবের সাথে জাভা উল্লেখগুলি পয়েন্টার-গাণিতিকের সি ++ পয়েন্টার বিয়েরফট হিসাবে একই বলে কিছু হয় না।
উত্সাহক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.