tl; ডা
জন্য ক্ষেত্র , int b = b + 1
অবৈধ কারণ b
একটি অবৈধ এগিয়ে রেফারেন্স b
। আপনি আসলে লেখার মাধ্যমে int b = this.b + 1
এটি ঠিক করতে পারেন , যা অভিযোগ ছাড়াই সংকলন করে।
জন্য স্থানীয় ভেরিয়েবল , int d = d + 1
অবৈধ কারণ d
ব্যবহারের পূর্বে সক্রিয়া করা হয় না। ক্ষেত্রগুলির ক্ষেত্রে এটি নয় , যা সর্বদা ডিফল্ট-আরম্ভ হয়।
সংকলনের চেষ্টা করে আপনি পার্থক্যটি দেখতে পাচ্ছেন
int x = (x = 1) + x;
ক্ষেত্রের ঘোষণা হিসাবে এবং স্থানীয় পরিবর্তনশীল ঘোষণা হিসাবে। পূর্বের ব্যর্থ হবে, তবে শব্দার্থক পার্থক্যের কারণে পরবর্তীকালে সফল হবে।
ভূমিকা
প্রথমত, ক্ষেত্র এবং স্থানীয় পরিবর্তনশীল প্রারম্ভিকগুলির জন্য বিধিগুলি খুব আলাদা। সুতরাং এই উত্তরটি দুটি অংশে নিয়মগুলি মোকাবেলা করবে।
আমরা এই পরীক্ষার প্রোগ্রাম জুড়ে ব্যবহার করব:
public class test {
int a = a = 1;
int b = b + 1;
public static void Main(String[] args) {
int c = c = 1;
int d = d + 1;
}
}
ঘোষণাপত্রটি b
অবৈধ এবং একটি illegal forward reference
ত্রুটির সাথে ব্যর্থ ।
ঘোষণাপত্রটি d
অবৈধ এবং একটি variable d might not have been initialized
ত্রুটির সাথে ব্যর্থ ।
এই ত্রুটিগুলি পৃথক হওয়ার বিষয়টি উল্লেখ করা উচিত যে ত্রুটিগুলির কারণগুলিও পৃথক।
ক্ষেত্র
জাভাতে ফিল্ড ইনিশিয়ালাইজারগুলি জেএলএস §8.3.2 , ক্ষেত্রগুলির সূচনা দ্বারা পরিচালিত হয় ।
সুযোগ একটি ক্ষেত্রের সংজ্ঞায়িত করা হয় JLS §6.3 একটি ঘোষণাপত্র ব্যাপ্তি।
প্রাসঙ্গিক বিধিগুলি হ'ল:
m
শ্রেণীর প্রকার সি (§8.1.6) দ্বারা ঘোষিত বা উত্তরাধিকার সূত্রে প্রাপ্ত কোনও সদস্যের ঘোষণার সুযোগ হ'ল কোনও নেস্টেড ধরণের ঘোষণাসহ সি এর পুরো সংস্থা।
- উদাহরণস্বরূপ ভেরিয়েবলগুলির জন্য সূচনাপ্রকাশের অভিব্যক্তি ক্লাস দ্বারা ঘোষিত বা উত্তরাধিকার সূত্রে প্রাপ্ত কোনও স্থিতিশীল ভেরিয়েবলের সাধারণ নাম ব্যবহার করতে পারে, এমনকি যার ঘোষণা পরে পাঠ্যভাবে আসে occurs
- উদাহরণস্বরূপ ভেরিয়েবলগুলির ব্যবহারের ঘোষণাপত্রের ব্যবহারের ব্যবহারটি কখনও কখনও সীমাবদ্ধ হওয়ার পরেও পাঠ্যগতভাবে প্রদর্শিত হয়, যদিও এই উদাহরণগুলি ভেরিয়েবলগুলি সুযোগসুবিধাতে রয়েছে। উদাহরণস্বরূপ ভেরিয়েবলের জন্য অগ্রণী রেফারেন্স পরিচালনা করার সঠিক নিয়মের জন্য §8.3.2.3 দেখুন।
§8.3.2.3 বলেছেন:
সদস্যের ক্লাস বা ইন্টারফেস সি এর উদাহরণ (যথাক্রমে স্থিতিশীল) ক্ষেত্র এবং নিম্নলিখিত সকল শর্তটি ধারণ করলেই সদস্যের ঘোষণাপত্রটি পাঠ্যক্রমে উপস্থিত হওয়া প্রয়োজন:
- ব্যবহার সি এর একটি উদাহরণে (যথাক্রমে স্ট্যাটিক) পরিবর্তনশীল ইনিশিয়ালাইজার বা সি এর একটি উদাহরণে (যথাক্রমে স্ট্যাটিক) ইনিশিয়ালাইজারে ঘটে
- ব্যবহার কোনও অ্যাসাইনমেন্টের বাম দিকে নেই।
- ব্যবহারটি একটি সাধারণ নামের মাধ্যমে।
- সি হল অভ্যন্তরীণতম শ্রেণি বা ইন্টারফেসটি ব্যবহারটি ঘিরে।
নির্দিষ্ট ক্ষেত্রে বাদে আপনি ক্ষেত্রগুলি ঘোষণার আগে তাদের উল্লেখ করতে পারেন। এই বিধিনিষেধগুলি কোডের মতো প্রতিরোধ করার উদ্দেশ্যে তৈরি
int j = i;
int i = j;
সংকলন থেকে। জাভা স্পেস বলছে "উপরোক্ত বিধিনিষেধগুলি সংকলন সময়ে, বিজ্ঞপ্তি বা অন্যথায় ত্রুটিযুক্ত প্রাথমিককরণগুলি ধরার জন্য ডিজাইন করা হয়েছে।"
এই নিয়মগুলি আসলে কীভাবে সিদ্ধ হয়?
সংক্ষেপে, নিয়মগুলি মূলত বলেছে যে আপনাকে অবশ্যই সেই ক্ষেত্রের রেফারেন্সের আগে ক্ষেত্র ঘোষণা করতে হবে যদি (ক) রেফারেন্স ইনিশিয়ালাইজারে থাকে, (খ) রেফারেন্সটি বরাদ্দ করা হয়নি, (গ) রেফারেন্সটি একটি সাধারণ নাম (কোনও যোগ্যতা অর্জনকারী নয় this.
) এবং (ঘ) এটি কোনও অভ্যন্তরীণ শ্রেণীর মধ্যে থেকে অ্যাক্সেস করা হচ্ছে না। সুতরাং, চারটি শর্ত পূরণ করে এমন একটি ফরোয়ার্ড রেফারেন্স অবৈধ, তবে একটি ফরোয়ার্ড রেফারেন্স যা কমপক্ষে একটি শর্তে ব্যর্থ হয় ঠিক আছে।
int a = a = 1;
প্রনয়ন করা হয়েছে কারণ এটি লঙ্ঘন করে (খ): রেফারেন্স a
হয় নির্ধারিত হচ্ছে, তাই এটি পড়ুন করার বৈধতা পাবে a
আগাম a
'র সম্পূর্ণ ঘোষণা।
int b = this.b + 1
এটি (সি) লঙ্ঘন করার কারণে এটিও সংকলন করে: রেফারেন্সটি this.b
কোনও সাধারণ নাম নয় (এটি এর সাথে যোগ্য this.
)। এই বিজোড় নির্মাণটি এখনও নিখুঁতভাবে সংজ্ঞায়িত, কারণ this.b
মান শূন্য রয়েছে।
সুতরাং, প্রাথমিকভাবে, আরম্ভকারীদের মধ্যে ক্ষেত্রের রেফারেন্সের উপর বিধিনিষেধগুলি int a = a + 1
সফলভাবে সংকলন হতে বাধা দেয় ।
লক্ষ করুন যে মাঠের ঘোষণাটি সংকলন int b = (b = 1) + b
করতে ব্যর্থ হবে , কারণ ফাইনালটি b
এখনও অবৈধ ফরওয়ার্ড রেফারেন্স।
স্থানীয় পরিবর্তনশীল
স্থানীয় পরিবর্তনশীল ঘোষণাগুলি জেএলএস -14.4 , স্থানীয় চলক ঘোষণার বিবৃতি দ্বারা পরিচালিত হয় ।
সুযোগ একটি স্থানীয় ভেরিয়েবলের সংজ্ঞায়িত করা হয় JLS §6.3 , একটি ঘোষণাপত্র ব্যাপ্তি:
- একটি ব্লকের স্থানীয় ভেরিয়েবল ঘোষণার সুযোগ (.414.4) যেখানে ব্লকের বাকী অংশটি যেখানে ঘোষণাপত্রটি উপস্থিত হয় তার নিজস্ব আরম্ভকারী দিয়ে শুরু করে এবং স্থানীয় ভেরিয়েবল ঘোষণার বিবৃতিতে ডানদিকে আরও কোনও ঘোষককে অন্তর্ভুক্ত করে।
নোট করুন যে ইনিশিয়ালাইজারগুলি ভেরিয়েবল ঘোষণার পরিধির মধ্যে রয়েছে। তাহলে কেন int d = d + 1;
সংকলন হয় না ?
নির্দিষ্ট অ্যাসাইনমেন্টের ( জাএলএস -16 ) জাভার নিয়মের কারণে কারণ । ডিফিনেট অ্যাসাইনমেন্টটি মূলত বলেছে যে স্থানীয় ভেরিয়েবলের প্রতিটি অ্যাক্সেসের অবশ্যই সেই চলকটির পূর্বের অ্যাসাইনমেন্ট থাকতে হবে, এবং জাভা সংকলকটি লুপ এবং শাখাগুলি পরীক্ষা করে পরীক্ষা নিরীক্ষা করে যে কোনও ব্যবহারের আগে সর্বদা উপস্থিত হয় তা নিশ্চিত করা যায় (এ কারণেই নির্দিষ্ট অ্যাসাইনমেন্টের সম্পূর্ণ স্পেসিফিকেশন বিভাগ নিবেদিত থাকে এটি)। প্রাথমিক নিয়মটি হ'ল:
- একটি স্থানীয় পরিবর্তনশীল বা খালি চূড়ান্ত ক্ষেত্র প্রতিটি অ্যাক্সেসের জন্য
x
, x
স্পষ্টভাবে এক্সেস আগে নিয়োগ করা হবে, অথবা একটি কম্পাইল-টাইম এরর দেখা দেয়।
মধ্যে int d = d + 1;
, অ্যাক্সেস d
স্থানীয় পরিবর্তনশীল জরিমানা সমাধান করা হয়, কিন্তু যেহেতু অ্যাক্সেস d
করার আগে বরাদ্দ d
করা হয়নি, সংকলক একটি ত্রুটি জারি করে। ইন int c = c = 1
, c = 1
প্রথমে ঘটে, যা বরাদ্দ করে c
এবং তারপরে c
সেই অ্যাসাইনমেন্টের ফলাফলের সাথে আরম্ভ করা হয় (যা 1)।
মনে রাখবেন যে নির্দিষ্ট অ্যাসাইনমেন্ট বিধিগুলির কারণে, স্থানীয় পরিবর্তনশীল ঘোষণাটি সফলভাবে সংকলন int d = (d = 1) + d;
করবে ( ক্ষেত্রের ঘোষণার বিপরীতেint b = (b = 1) + b
), কারণ d
অবশ্যই ফাইনালটি d
পৌঁছানোর সময় দ্বারা নির্ধারিত হয়েছে ।
static
শ্রেণি-স্কোপ ভেরিয়েবলটিতে কীওয়ার্ডটি যুক্ত করে থাকেন তবেstatic int x = x + 1;
আপনি কি একই ত্রুটি পাবেন? কারণ সি # এ এটি স্থিতিশীল বা অ-স্থিতিশীল থাকলে কোনও পার্থক্য আনবে।