জাভা (প্রোগ্রামিং ভাষা)

[ডান|থাম্ব|[জেমস গসলিং, জাভা প্রোগ্রামিং ভাষার জনক]]

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

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

## ইতিহাস
জাভা ১৯৯১ সালে সান মাইক্রোসিস্টেমস-এ জেমস গসলিং, প্যাট্রিক নটন, ক্রিস ওয়ার্থ, এড ফ্রাঙ্ক, এবং মাইক শেরিডান দ্বারা উদ্ভাবিত হয়। এই ভাষাটির প্রাথমিক নাম ছিল "Oak" তবে ১৯৯৫ সালে এর নাম পরিবর্তন করে "Java" রাখা হয়।   জেমস গসলিং এবং একটি ডেভেলপার দলের সদস্যরা ১৯৯০-এর দশকে সান মাইক্রোসিস্টেমসে একটি ইন্টারেক্টিভ টিভি প্রকল্পে কাজ করছিলেন যখন গসলিং সি++ প্রোগ্রামিং ভাষার ব্যবহারে হতাশ হয়ে পড়েন। সি++ একটি অবজেক্ট-অরিয়েন্টেড প্রোগ্রামিং ভাষা যা একটি দশক আগে C ভাষার সম্প্রসারণ হিসাবে তৈরি করা হয়েছিল।

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

জাভা প্রথমবারের মতো ২৩ মার্চ, ১৯৯৫-এ "আলফা সংস্করণ 1.0a2" হিসাবে প্রকাশিত হয়। এর মূলনীতি ছিল "একবার লিখুন, যে কোনো জায়গায় চালান (Write Once, Run Anywhere or WORA)"। যদিও ভাষার বেশিরভাগ বৈশিষ্ট্য সি++ (এবং বর্তমান জাভা) এর তুলনায় প্রাথমিক ছিল, এতে আকর্ষণীয় ব্যবহার ছিল: বিশেষ জাভা প্রোগ্রাম, যেগুলি অ্যাপলেট নামে পরিচিত, সেই সময়ের সবচেয়ে জনপ্রিয় ওয়েব ব্রাউজার, নেটস্কেপ ন্যাভিগেটরে ওয়েব পৃষ্ঠার অংশ হিসাবে চালানো যেত।

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

সান মাইক্রোসিস্টেমস জাভা ভাষার উন্নয়ন নিয়ন্ত্রণ করেছিল এর শুরু থেকে ২০১০ সাল পর্যন্ত, যখন কোম্পানিটি ৭.৪ বিলিয়ন ডলারের একটি চুক্তিতে ডেটাবেস এবং এন্টারপ্রাইজ সফটওয়্যার দৈত্য অরাকলের দ্বারা অধিগৃহীত হয়। অরাকল, যা তার নিজস্ব পণ্যের উপর ভাষাটির দীর্ঘকালীন ব্যবহারকারী, জাভাকে সমর্থন করার প্রতি দৃঢ় প্রতিশ্রুতি রয়েছে এবং প্রতিটি নতুন রিলিজের সাথে এর সক্ষমতা বৃদ্ধি করতে থাকে।

## মূলনীতি
১. এটি হবে সরল, অবজেক্ট ওরিয়েন্টেড এবং পরিচিত।

২. এটি হবে শক্তিশালী এবং সুরক্ষিত।

৩. এটি কোন নির্দিষ্ট প্লাটফর্মের উপর নির্ভর করবে না আর এর থাকবে বহনযোগ্যতা।

৪. এটি অনেক উচ্চ কার্যশীলতাসম্পন্ন হবে।

৫. এটি হবে ইন্টারপ্রিটেড, থ্রেডেড এবং ডাইনামিক।
## জাভা'র গুরুত্বপূর্ণ দিকগুলো

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

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

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

### মাল্টিথ্রেডেড
থাম্ব|664x664পিক্সেল|জাভা কম্পাইলেশন এবং এক্সিকিউশন প্রক্রিয়া
থাম্ব|366x366পিক্সেল|Bytecode
জাভা মাল্টিথ্রেডেড প্রোগ্রামিংয়ের অন্তর্নিহিত সমর্থন প্রদান করে। একটি মাল্টিথ্রেডেড প্রোগ্রামে দুটি বা তার বেশি অংশ থাকে যা একসাথে চলতে পারে। এই ধরনের প্রোগ্রামের প্রতিটি অংশকে থ্রেড বলা হয়, এবং প্রতিটি থ্রেড আলাদা কার্যকরী পথ নির্ধারণ করে। এর ফলে, মাল্টিথ্রেডিং মাল্টিটাস্কিংয়ের একটি বিশেষায়িত রূপ। একটি থ্রেড-ভিত্তিক মাল্টিটাস্কিং পরিবেশে, থ্রেড হল কোডের সবচেয়ে ছোট ইউনিট যা বিতরণযোগ্য। এর মানে হল যে একটি একক প্রোগ্রাম একসাথে দুটি বা তার বেশি কাজ সম্পন্ন করতে পারে। জাভা রান-টাইম সিস্টেম অনেক কিছু করতে থ্রেডগুলোর উপর নির্ভর করে, এবং সমস্ত ক্লাস লাইব্রেরি মাল্টিথ্রেডিংয়ের বিষয়টি মাথায় রেখে ডিজাইন করা হয়েছে।  জাভা থ্রেডগুলি ব্যবহার করে পুরো পরিবেশটিকে অ্যাসিঙ্ক্রোনাস করতে সক্ষম করে। এটি সিপিইউ সাইকেলের অপচয় প্রতিরোধ করে কার্যক্ষমতা কমাতে সাহায্য করে।

## জাভার অসুবিধা
* ধীরগতি ও কর্মক্ষমতা: জাভার কার্যকরী গতি ও কর্মক্ষমতা অন্যান্য ভাষার তুলনায় কিছুটা ধীর।
* বিস্তৃত সিনট্যাক্স: জাভার সিনট্যাক্স কিছুটা জটিল এবং দীর্ঘ।
* মেমোরি ব্যবহারে উচ্চ চাহিদা: জাভা প্রচুর মেমোরি ব্যবহার করে, যা হালকা কাজের ক্ষেত্রে চ্যালেঞ্জ হতে পারে।
* লো-লেভেল অ্যাক্সেসের অভাব: জাভা সরাসরি লো-লেভেল মেমোরি ম্যানেজমেন্ট বা হার্ডওয়্যার অ্যাক্সেস সরবরাহ করে না।
* একাধিক ইনহেরিটেন্সের অভাব: জাভায় সরাসরি একাধিক ইনহেরিটেন্স সমর্থিত নয়, যা কিছু ক্ষেত্রে সীমাবদ্ধতা সৃষ্টি করে।
* লেগ্যাসি কোডের সাথে সামঞ্জস্যতা: পুরোনো কোডের সাথে জাভার সামঞ্জস্যতা কিছুটা চ্যালেঞ্জিং হতে পারে।
* শেখার কষ্টসাধ্যতা: জাভার জটিলতা ও নিয়মগুলো শেখার জন্য নতুন ব্যবহারকারীদের জন্য কিছুটা কঠিন হতে পারে।

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

জাভা উচ্চ-স্তরের প্রোগ্রামারদের জন্য (যেমন আপনার মতো) প্ল্যাটফর্ম সমস্যাটি দূর করতে সক্ষম হয়েছে কারণ এটি কম্পাইল-লিংক-এক্সিকিউট সিকোয়েন্সকে কম্পাইলারের একটি অন্তর্নিহিত স্তরে পুনর্গঠিত করেছে। জাভা কম্পাইলার একটি অবজেক্ট ফাইল তৈরি করে না, বরং এটি একটি বাইটকোড ফাইল তৈরি করে যা মূলত একটি ভার্চুয়াল মেশিনের জন্য একটি অবজেক্ট ফাইল। আসলে, জাভা কম্পাইলারকে প্রায়শই জেভিএম কম্পাইলার (Java Virtual Machine এর জন্য) বলা হয়।

ফলস্বরূপ, আপনি যেকোনো প্ল্যাটফর্মে একটি জাভা প্রোগ্রাম লিখতে পারেন এবং JVM কম্পাইলার (যাকে javac বলা হয়) ব্যবহার করে একটি বাইটকোড ফাইল (বাইটকোড ফাইলের এক্সটেনশন .class হয়) তৈরি করতে পারেন। এই বাইটকোড ফাইলটি যেকোনো প্ল্যাটফর্মে ব্যবহার করা যেতে পারে (যেখানে জাভা ইনস্টল করা আছে)। তবে, বাইটকোড একটি এক্সিকিউটেবল ফাইল নয়। একটি বাইটকোড ফাইল কার্যকর করতে, আপনাকে প্রকৃতপক্ষে একটি জাভা ইন্টারপ্রেটার (যাকে java বলা হয়) আহ্বান করতে হবে। প্রতিটি প্ল্যাটফর্মের নিজস্ব জাভা ইন্টারপ্রেটার রয়েছে যা স্বয়ংক্রিয়ভাবে প্ল্যাটফর্ম-নির্দিষ্ট সমস্যাগুলি সমাধান করবে যা আর স্থগিত রাখা যাবে না। যখন বাইটকোড দ্বারা প্ল্যাটফর্ম-নির্দিষ্ট অপারেশন প্রয়োজন হয়, জাভা ইন্টারপ্রেটার প্ল্যাটফর্মের জন্য নির্দিষ্ট উপযুক্ত কোড লিংক করে।জাভা কীভাবে কাজ করে (প্ল্যাটফর্ম স্বাধীনতা অর্জনের জন্য) তা সংক্ষেপে বলতে গেলে, কম্পাইল-লিংক-এক্সিকিউট সাইকেলটি বিবেচনা করুন। পূর্ববর্তী প্রোগ্রামিং ভাষাগুলিতে, এই সাইকেলটি "কম্পাইল-লিংক তারপর এক্সিকিউট" হিসাবে আরও সুনির্দিষ্টভাবে সংজ্ঞায়িত। কিন্তু জাভাতে, সাইকেলটি "কম্পাইল তারপর লিংক-এক্সিকিউট" এর কাছাকাছি। ইন্টারপ্রেটেড ভাষাগুলির মতো, বাইটকোডকে একটি এক্সিকিউটেবলে কম্পাইল করার মাধ্যমে জাভা প্রোগ্রামগুলিকে দ্রুত চালানো সম্ভব; তবে এর অসুবিধা হল যে এই ধরনের এক্সিকিউটেবল শুধুমাত্র সেই প্ল্যাটফর্মে কাজ করবে যেখানে এটি তৈরি করা হয়েছে। 

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

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

জাভাতে লেখা কোড কম্পাইল হয়ে সরাসরি মেশিন কোড-এ রূপান্তরিত হয় না। বরং তা বাইট কোড নামক বিশেষ একটি মধ্যবর্তি অবস্থায় আসে যা .class ফাইলে থাকে। এই ক্লাস ফাইল সরাসরি চলতে পারে না। একে চালাতে গেলে জাভা ভার্চুয়াল মেশিন এর মাধ্যমে চালাতে হয়। কারণ বাইট কোড কেবলমাত্র জাভা ভার্চুয়াল মেশিন বুঝতে পারে ।

## সি++ এর সাথে ভিন্নতা
জাভা সি++ এর তুলনায় সহজ করার জন্য নিম্নলিখিত উপায়ে ডিজাইন করা হয়েছিল:
* জাভা স্বয়ংক্রিয়ভাবে মেমরি বরাদ্দ এবং ডিলোকেশন পরিচালনা করে, প্রোগ্রামারদের এই ত্রুটিপূর্ণ এবং ক্লান্তিকর কাজ থেকে মুক্তি দেয়।
* জাভায় পয়েন্টার অন্তর্ভুক্ত নয়, যা অভিজ্ঞ প্রোগ্রামারদের জন্য একটি শক্তিশালী বৈশিষ্ট্য হলেও সহজেই অপব্যবহার করা যায় এবং বড় নিরাপত্তা দুর্বলতা তৈরি করতে পারে।
* জাভায় অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিংয়ে শুধুমাত্র একক ইনহেরিট্যান্স রয়েছে।
* জাভাকে প্রতিটি ভিন্ন প্ল্যাটফর্মে কম্পাইল করতে হয় না, সর্বত্র একই বাইটকোড কার্যকর করে।
* পয়েন্টার না থাকা এবং স্বয়ংক্রিয় মেমরি ব্যবস্থাপনার উপস্থিতি জাভা নিরাপত্তার দুটি মূল উপাদান।
## বাক্যরীতি
জাভার বাক্যরীতি মূলত সি++ থেকে নেওয়া। সি++ এর মত এতে বাক্যরীতি রয়েছে স্ট্রাকচারড, জেনেরিক এবং অবজেক্ট অরিয়েন্টেড প্রোগ্রামিং এর জন্য। তবে সি++ বিশুদ্ধ অবজেক্ট অরিয়েন্টেড না হলেও জাভা বিশুদ্ধ অবজেক্ট অরিয়েন্টেড প্রোগ্রামিং ভাষা

জাভাতে সমস্ত কোড ক্লাসের ভিতরে লেখা হয়, এবং প্রতিটি ডেটা আইটেম একটি অবজেক্ট, মৌলিক ডেটা প্রকারগুলি (যেমন পূর্ণসংখ্যা, ফ্লোটিং-পয়েন্ট সংখ্যা, বুলিয়ান মান এবং ক্যারেক্টার) বাদ দিয়ে, যা কার্যকারিতার কারণে বস্তু নয়। জাভা সি++ এর কিছু জনপ্রিয় দিক (যেমন printf মেথড) পুনরায় ব্যবহার করে।

সি++ এর বিপরীতে, জাভা অপারেটর ওভারলোডিং বা ক্লাসের জন্য একাধিক উত্তরাধিকার সমর্থন করে না, যদিও একাধিক উত্তরাধিকার ইন্টারফেসের জন্য সমর্থিত।

জাভা সি++ এর মতই মন্তব্য ব্যবহার করে। মন্তব্যের তিনটি ভিন্ন শৈলী রয়েছে: একটি একক লাইন শৈলী যা দুটি স্ল্যাশ (//) দিয়ে চিহ্নিত করা হয়েছে, একটি একাধিক লাইন শৈলী /* দিয়ে খোলা হয়েছে এবং */ দিয়ে বন্ধ হয়েছে, এবং Javadoc মন্তব্য শৈলীটি /** দিয়ে খোলা হয়েছে এবং */ দিয়ে বন্ধ হয়। .

### হ্যালো ওয়ার্ল্ড
নিম্নলিখিত একটি "হ্যালো, ওয়ার্ল্ড!" এর একটি সাধারণ উদাহরণ। প্রোগ্রাম যা স্ট্যান্ডার্ড আউটপুটে একটি বার্তা লেখে:
```java
public class Example {
    public static void main(String[] args) {
        System.out.println("Hello World!");
    }
}
```


### শনাক্তকারী
শনাক্তকারী হল কোডের এমন একটি উপাদান যা ভেরিয়েবল, ফাংশন, শ্রেণি, বা অন্যান্য উপাদানকে চিহ্নিত করতে ব্যবহৃত হয়। জাভাতে শনাক্তকারীগুলি **কেস-সংবেদনশীল** এবং সেগুলিকে নামকরণের জন্য নির্দিষ্ট নিয়ম অনুসরণ করতে হয়। শর্তাবলী (নামকরণের নিয়ম)

**শুদ্ধ শনাক্তকারী হতে পারে:**

* যেকোনো ইউনিকোড অক্ষর (অক্ষর বা অঙ্ক, যেমন রোমান অঙ্ক বা হিন্দু-আরবিক সংখ্যা)।
* মুদ্রার চিহ্ন (যেমন ¥)।
* সংযোগ বিরামচিহ্ন অক্ষর (যেমন `_`, যাকে underscore বলা হয়)।

**শুদ্ধ শনাক্তকারী হতে পারে না:**

* একটি অঙ্ক দিয়ে শুরু করা**।** উদাহরণ: `123Name` → ভুল, কিন্তু `_123Name` → শুদ্ধ।
* সংরক্ষিত কীওয়ার্ড ব্যবহার করা। উদাহরণ: `int`, `null`, `true`, `false` → শনাক্তকারী হিসাবে ব্যবহার করা যাবে না।
* ভুল শনাক্তকারী কোড কম্পাইল করবে না এবং সংশ্লিষ্ট সিনট্যাক্স ত্রুটি দেখাবে।

```java
// সঠিক শনাক্তকারী
 int age = 25; // সাধারণ ভেরিয়েবল
 String $name = "John"; // ডলার চিহ্ন সহ শনাক্তকারী
 double _value = 12.5; // আন্ডারস্কোর দিয়ে শুরু শনাক্তকারী
 
 // ভুল শনাক্তকারী
 int 1number = 10; // সংখ্যা দিয়ে শুরু হওয়া ভুল
 String class = "MyClass"; // সংরক্ষিত কীওয়ার্ড ব্যবহার করা ভুল
 boolean true = false; // বুলিয়ান লিটারাল ব্যবহার করা ভুল
```


### কীওয়ার্ড

### অক্ষরসমূহ

ডিফল্টভাবে ইন্টিজার লিটারেলগুলো int টাইপের হয়, যদি না লং টাইপ নির্দিষ্ট করা হয় L বা l সাফিক্স যোগ করে, যেমন 367L। জাভা এসই 7 থেকে, পঠনযোগ্যতা বাড়ানোর জন্য সংখ্যার ডিজিটের মধ্যে অন্ডারস্কোর ব্যবহার করা সম্ভব; উদাহরণস্বরূপ, একটি সংখ্যা 145608987 কে 145_608_987 হিসাবে লেখা যায়।

### ভেরিয়েবল
ভেরিয়েবল হল এমন একটি শনাক্তকারী যা ডেটার মান সংরক্ষণ এবং পরিচালনার জন্য ব্যবহৃত হয়। এটি ভেরিয়েবলের ধরন (type) এবং নাম লিখে ঘোষণা করা হয়। ভেরিয়েবলের মান ঘোষণা করার সময়ই নির্ধারণ করা যেতে পারে, অথবা পরে আলাদা করে সেট করা যায়।


```java
int count;      //একটি অনারম্ভকৃত ভেরিয়েবল যার নাম 'count' এবং ধরন 'int', তা ঘোষণা করা হচ্ছে।
count = 35;     //ভেরিয়েবল ইনিশিয়ালাইজ করা
int count = 35; //Declaring and initializing the variable at the same time
```


একাধিক ভেরিয়েবল একই বিবৃতিতে কমা (,) ব্যবহার করে ঘোষণা বা আরম্ভ করা যায়।

```java
int a, b;         //Declaring multiple variables of the same type
int a = 2, b = 3; //Declaring and initializing multiple variables of the same type
```

### অপারেটর
জাভা এবং C++ অপারেটরগুলি অনেকটা একই রকম, তবে কিছু গুরুত্বপূর্ণ পার্থক্য রয়েছে। জাভা স্বয়ংক্রিয় আবর্জনা সংগ্রহ ব্যবহার করে, যার ফলে `delete` অপারেটরের প্রয়োজন হয় না। এছাড়াও, জাভা পয়েন্টারকে সমর্থন করে না, পরিবর্তে রেফারেন্স ব্যবহার করে। জাভাতে একটি স্বাক্ষরবিহীন রাইট শিফট অপারেটর (`>>>`) রয়েছে, যা C-এ নেই। অবশেষে, জাভা অপারেটর ওভারলোডিংকে সমর্থন করে না।

### কোড ব্লক
জাভায় কোড ব্লক এবং নতুন স্কোপ নির্দেশ করতে  `{`  এবং `}`  ব্যবহার করা হয়। বিভিন্ন পরিস্থিতিতে এই ব্রেসের ভিতরে ক্লাসের সদস্য এবং একটি মেথডের শরীরের মতো জিনিসগুলি থাকতে পারে।

মেথডের শরীরের ভিতরে, নিম্নলিখিতভাবে নতুন স্কোপ তৈরি করতে ব্রেস ব্যবহার করা যেতে পারে:
```java
void doSomething() {
    int a;

    {
        int b;
        a = 1;
    }

    a = 2;
    b = 3; // Illegal because the variable b is declared in an inner scope..
}
```


### কমেন্ট
জাভায় তিন ধরণের কমেন্ট রয়েছে: সাধারণ কমেন্ট, লাইনের শেষের কমেন্ট এবং ডকুমেন্টেশন কমেন্ট।

সাধারণ কমেন্ট, যা ব্লক কমেন্ট নামেও পরিচিত, `/*` দিয়ে শুরু হয় এবং `*/` দিয়ে শেষ হয়, এগুলি একাধিক লাইনে বিস্তৃত হতে পারে। এই ধরনের কমেন্ট C এবং C++ থেকে উদ্ভূত।
```java
/* This is a multi-line comment.
It may occupy more than one line. */
```
লাইনের শেষের কমেন্টগুলি `//` দিয়ে শুরু হয় এবং বর্তমান লাইনের শেষ পর্যন্ত বিস্তৃত হয়। এই কমেন্টের ধরণটি C++ এবং আধুনিক C-তেও উপস্থিত রয়েছে।
```java
// This is an end-of-line comment
```
ডকুমেন্টেশন কমেন্টগুলি জাভাডক টুল দ্বারা ডকুমেন্টেশন তৈরি করতে, সোর্স ফাইলগুলিতে প্রক্রিয়াজাত করা হয়। এই ধরনের কমেন্টটি সাধারণ কমেন্টের সাথে সাদৃশ্যপূর্ণ, তবে এটি `/**` দিয়ে শুরু হয় এবং জাভাডক টুল দ্বারা সংজ্ঞায়িত কনভেনশনগুলি অনুসরণ করে। কারিগরিভাবে, এই কমেন্টগুলি একটি বিশেষ ধরনের সাধারণ কমেন্ট এবং এগুলি ভাষা স্পেসিফিকেশনে বিশেষভাবে সংজ্ঞায়িত নেই।
```java
/**
 * This is a documentation comment.
 * 
 * @author John Doe
 */
```


### ইউনিভার্সাল টাইপ
`java.lang` প্যাকেজের ক্লাসগুলি প্রতিটি প্রোগ্রামে অন্তর্নিহিতভাবে আমদানি করা হয়, যতক্ষণ না কোনো স্পষ্টভাবে আমদানি করা টাইপের একই নাম থাকে। গুরুত্বপূর্ণ কিছু অন্তর্ভুক্ত:

#### java.lang.Object
`java.lang.Object` হলো জাভা'র শীর্ষ টাইপ। এটি এমন সমস্ত ক্লাসের সুপারক্লাস।

#### java.lang.String
`java.lang.String` হলো জাভা'র মৌলিক স্ট্রিং টাইপ। এটি অপরিবর্তনীয়।

#### java.lang.Throwable
জাভা'র `throw` এবং `catch` স্টেটমেন্ট দিয়ে নিক্ষেপ বা ধরা যেতে পারে এমন সবকিছুর সুপারটাইপ হল `java.lang.Throwable`।

## প্রোগ্রাম গঠন
জাভা অ্যাপ্লিকেশন ক্লাসের সমষ্টি দিয়ে গঠিত হয়। ক্লাসগুলিকে প্যাকেজে সংগঠিত করা হয় এবং অন্য ক্লাসের ভিতরেও সংজ্ঞায়িত করা যেতে পারে।

### <code>main</code> পদ্ধতি
প্রতিটি জাভা অ্যাপ্লিকেশনের একটি এন্ট্রি পয়েন্ট থাকতে হবে, যা `main` পদ্ধতি। এটি গ্রাফিকাল ইউজার ইন্টারফেস অ্যাপ্লিকেশন এবং কনসোল অ্যাপ্লিকেশন উভয়ের জন্যই প্রযোজ্য। `main` পদ্ধতি সর্বজনীন, স্ট্যাটিক এবং শূন্য ফেরত টাইপের হতে হবে, এবং এটি একটি স্ট্রিং অ্যারে হিসেবে কমান্ড-লাইন আর্গুমেন্ট গ্রহণ করে।

```java
public static void main(String[] args) {
}
```


### প্যাকেজ
প্যাকেজ হল জাভায় ক্লাসগুলোকে গোষ্ঠীভুক্ত করার একটা উপায়। এটা ক্লাসের নামের একটা অংশ হিসেবে কাজ করে এবং ক্লাসগুলোকে অন্য ক্লাস থেকে আলাদা করতে সাহায্য করে। একই নামের দুটি ক্লাস যদি আলাদা আলাদা প্যাকেজে থাকে তাহলে তারা একই নাম থাকা সত্ত্বেও আলাদা হিসেবে বিবেচিত হবে। প্যাকেজ আরেকটা কাজ করে অ্যাক্সেস মডিফায়ারের সাথে কাজ করে। অর্থাৎ কোন ক্লাস বা মেথড অন্য কোন ক্লাস থেকে অ্যাক্সেসযোগ্য হবে কি না তা প্যাকেজ নির্ধারণ করে। উদাহরণস্বরূপ, java.io.InputStream এই নামটা দেখলে বোঝা যায় যে InputStream নামের একটা ক্লাস আছে যা java.io নামক প্যাকেজের মধ্যে রয়েছে। কোন ফাইলে কোন প্যাকেজের ক্লাস ব্যবহার করা হবে তা ফাইলের শুরুতে প্যাকেজ ঘোষণা করে জানানো হয়।

```java
package myapplication.mylibrary;

public class MyClass {
}
```


### ইমপোর্ট ডিক্লারেশন

#### টাইপ ইমপোর্ট ডিক্লারেশন
জাভা প্রোগ্রামে প্রায়ই অন্যান্য লাইব্রেরি বা প্যাকেজের ক্লাস, মেথড বা ভেরিয়েবল ব্যবহার করতে হয়। ইমপোর্ট ডিক্লারেশন এর মাধ্যমে এই বাইরের রিসোর্সগুলোকে সহজেই প্রোগ্রামে আনা যায়। ইমপোর্ট ডিক্লারেশনগুলো ফাইলের শুরুতে, `package` ডিক্লারেশনের পরে রাখতে হবে।

ইমপোর্ট ডিক্লারেশনের দুটি প্রধান ধরণ:

১। সিঙ্গেল টাইপ ইমপোর্ট ডিক্লারেশনঃ এটি একটি নির্দিষ্ট ক্লাস বা টাইপকে ইমপোর্ট করে।
```java
package myPackage;

import java.util.Random; // Random ক্লাসটি ইমপোর্ট করা হলো

public class ImportsTest {
    public static void main(String[] args) {
        /* The following line is equivalent to
         * java.util.Random random = new java.util.Random();
         * It would've been incorrect without the import.
         */
        Random random = new Random();
    }
}
```
২। ইমপোর্ট-অন-ডিমান্ড ডিক্লারেশনঃ এটি একটি প্যাকেজের সব ক্লাসকে ইমপোর্ট করে।
```java
import java.util.*;  /*This form of importing classes makes all classes
    in package java.util available by name, could be used instead of the
    import declaration in the previous example. */
import java.*; /*This statement is legal, but does nothing, since there
    are no classes directly in package java. All of them are in packages
    within package java. This does not import all available classes.*/
```


#### স্ট্যাটিক ইমপোর্ট ডিক্লারেশন
জাভা ৫ থেকে স্ট্যাটিক ইমপোর্ট নামে একটি ফিচার যুক্ত হয়েছে। এটি কোনো ক্লাসের স্ট্যাটিক মেথড বা ভেরিয়েবল সরাসরি ব্যবহার করতে দেয়, ক্লাসের নাম বারবার উল্লেখ করার প্রয়োজন হয় না।
```java
import static java.lang.System.out; //'out' is a static field in java.lang.System

public class HelloWorld {
    public static void main(String[] args) {
        /* The following line is equivalent to
             System.out.println("Hi World!");
           and would have been incorrect without the import declaration. */
        out.println("Hello World!");
    }
}
```


#### Enum ব্যবহার করে স্ট্যাটিক ইমপোর্ট
Enum হলো এমন একটি বিশেষ টাইপ, যা নির্দিষ্ট কিছু কনস্ট্যান্ট সংজ্ঞায়িত করে। স্ট্যাটিক ইমপোর্ট ব্যবহার করে এগুলো সহজে রেফার করা যায়।
```java
public enum Color {
    RED, GREEN, BLUE
}

import static Color.*; // Color এনামের সব কনস্ট্যান্ট ইমপোর্ট করা হলো

public class TestEnum {
    public static void main(String[] args) {
        Color myColor = RED; // সরাসরি RED ব্যবহার করা যাচ্ছে
        if (myColor == RED) {
            System.out.println("It's red!");
        }
    }
}
```


## নিয়ন্ত্রণ কাঠামো

`if`জাভাতে বিবৃতি C-এর মত হয় এবং একই সিনট্যাক্স ব্যবহার করে:

```java
if (i == 3) {
    doSomething();
}
```


`if` বিবৃতিতে ঐচ্ছিক অন্য ব্লক অন্তর্ভুক্ত থাকতে পারে, সেক্ষেত্রে এটি একটি if-then-else বিবৃতিতে পরিণত হয়:

```java
if (i == 3) {
    doSomething();
} else {
    doSomethingElse();
}
```


C-এর মতো, else-যদি নির্মাণে কোনো বিশেষ কীওয়ার্ড জড়িত না থাকে, তবে এটি পৃথক if-then-else বিবৃতিগুলির একটি ক্রম হিসাবে গঠিত হয়:

```java
if (i == 3) {
    doSomething();
} else if (i == 2) {
    doSomethingElse();
} else {
    doSomethingDifferent();
}
```


#### <code>switch</code> বিবৃতি
জাভায় সুইচ স্টেটমেন্ট ব্যবহার করে আমরা বিভিন্ন শর্তের ভিত্তিতে কোডের বিভিন্ন অংশ কার্যকর করতে পারি। এই স্টেটমেন্টে আমরা byte, short, char, int এবং এদের মতো ডেটা টাইপ ব্যবহার করতে পারি কিন্তু long ব্যবহার করতে পারি না।

সুইচ স্টেটমেন্টে আমরা বিভিন্ন কেস লেবেল দিয়ে সেই শর্তগুলোকে নির্দিষ্ট করি যেগুলোর ভিত্তিতে কোন কোড কার্যকর হবে। এই লেবেলগুলোতে শুধু ধ্রুবক মানই দিতে হবে। যেমন: enum ধ্রুবক বা string। যখন সুইচ স্টেটমেন্টের শর্তের মান কোনো একটি কেস লেবেলের মানের সাথে মিলে যাবে তখন সেই লেবেলের পরের কোড কার্যকর হবে।

যদি কোনো কেস লেবেলের মান শর্তের মানের সাথে মিলে না যায় তাহলে ডিফল্ট লেবেলের কোড কার্যকর হবে। ডিফল্ট লেবেল বসানো বাধ্যতামূলক নয়।

প্রতিটি কেস লেবেলের পরে সাধারণত ব্রেক কীওয়ার্ড ব্যবহার করা হয়। এটি নিশ্চিত করে যে যখন একটি কেস লেবেলের কোড কার্যকর হয়ে যাবে তখন সুইচ স্টেটমেন্ট থেকে বের হয়ে যাবে। যদি ব্রেক কীওয়ার্ড না দেওয়া হয় তাহলে পরের কেস লেবেলের কোডও কার্যকর হতে থাকবে। তবে এটি ভালো অনুশাসন নয় কারণ এতে বাগ আসার সম্ভাবনা থাকে।
```java
switch (ch) {
    case 'A':
        doSomething(); // Triggered if ch == 'A'
        break;
    case 'B':
    case 'C':
        doSomethingElse(); // Triggered if ch == 'B' or ch == 'C'
        break;
    default:
        doSomethingDifferent(); // Triggered in any other case
        break;
}
```


### পুনরাবৃত্তি বিবৃতি
পুনরাবৃত্তি বিবৃতি হল এমন এক ধরনের বিবৃতি যেখানে কোন নির্দিষ্ট শর্ত সত্য থাকা পর্যন্ত একই সেট কোড বারবার চলতে থাকে। জাভায় মূলত চার ধরনের পুনরাবৃত্তি বিবৃতি আছে। এই বিবৃতিগুলোতে যে শর্ত দেওয়া হয় সেটা অবশ্যই সত্য বা মিথ্যা হতে হবে অর্থাৎ বুলিয়ান টাইপের হতে হবে।


```c
while (1) {
    doSomething();
}
```


সংকলন ত্রুটি ফলাফল আসবে।

#### <code>while</code> লুপ
`while` লুপের শুরুতেই শর্ত পরীক্ষা করা হয়। যদি শর্ত সত্য হয়, তাহলে লুপের ভিতরের কোড চলে এবং আবার শর্ত পরীক্ষা করা হয়। যদি শর্ত মিথ্যা হয়, তাহলে লুপ থেকে বের হয়ে যাওয়া হয়।


```java
while (i < 10) {
    doSomething();
}
```


#### <code>do ... while</code> লুপ
`do ... while` লুপের ভিতরের কোড অন্তত একবার চলবে, তারপর শর্ত পরীক্ষা করা হয়। যদি শর্ত সত্য হয়, তাহলে লুপের ভিতরের কোড চলে। যদি শর্ত মিথ্যা হয়, তাহলে লুপ থেকে বের হয়ে যাওয়া হয়।


```java
// doSomething() is called at least once
do {
    doSomething();
} while (i < 10);
```


#### <code>for</code> লুপ
`for` লুপে সাধারণত তিনটা অংশ থাকে: শুরুতে ভেরিয়েবলের মান নির্ধারণ, লুপ চলার শর্ত এবং প্রতিবার লুপ চলার পর ভেরিয়েবলের মান পরিবর্তন। কমা (,) ব্যবহার করে একাধিক ভেরিয়েবল একই সাথে ঘোষণা করা যায় এবং লুপের ভিতরে একাধিক কাজ একসাথে করা যায়।


```java
for (int i = 0; i < 10; i++) {
    doSomething();
}
 
// A more complex loop using two variables
for (int i = 0, j = 9; i < 10; i++, j -= 3) {
    doSomething();
}
```


তিনটি এক্সপ্রেশনই ঐচ্ছিক। নিচের লুপটি চলতে থাকবে যতক্ষণ না কোনো ব্রেক বা রিটার্ন স্টেটমেন্ট ব্যবহার করে অথবা কোনো এক্সেপশন উৎপন্ন না হয়।

```java
for (;;) {
    doSomething();
}
```


#### এনহ্যান্সড <code>for</code> লুপ
এই ধরনের লুপকে **এনহ্যান্সড ফর লুপ** বলা হয়। এই লুপের মাধ্যমে অ্যারে বা কালেকশনের প্রতিটি আইটেমের ওপর সহজেই লুপ চালানো যায়। লুপের ভিতরে প্রতিটি আইটেম অ্যাক্সেস করা যায়। যখন লুপের ব্লক একবার চলে যায়, তখন পরের আইটেম অ্যাক্সেস করা যায়। এই লুপে কোনো বিশেষ কীওয়ার্ড ব্যবহার করা হয় না, বরং একটি ভিন্ন নোটেশন স্টাইল ব্যবহার করা হয়।


```java
for (int i : intArray) {
    doSomething(i);
}
```


### জাম্প বিবৃতি

#### লেবেল
জাভা কোডে লেবেল ব্যবহার করা হয় নির্দিষ্ট পয়েন্টকে চিহ্নিত করার জন্য, বিশেষ করে লুপ এবং সুইচ স্টেটমেন্টের ভিতরে। এই লেবেলগুলো প্রধানত `break` এবং `continue` স্টেটমেন্টের সাথে ব্যবহৃত হয় কোডের এক্সিকিউশন ফ্লো নিয়ন্ত্রণ করার জন্য।


```java
start:
someMethod();
```


#### <code>break</code> বিবৃতি
`break` বিবৃতি সবচেয়ে কাছের লুপ বা সুইচ স্টেটমেন্ট থেকে অবিলম্বে বের হয়ে আসা।


```java
for (int i = 0; i < 10; i++) {
    while (true) {
        break;
    }
    // Will break to this point
}
```


লেবেল ব্যবহার করে বাইরের লুপ থেকে বেরিয়ে আসা সম্ভব।


```java
outer:
for (int i = 0; i < 10; i++) {
    while (true) {
        break outer;
    }
}
// Will break to this point
```


#### <code>continue</code> বিবৃতি
`continue` বিবৃতি লুপের বর্তমান পুনরাবৃত্তিকে অসম্পূর্ণ রেখে পরবর্তী পুনরাবৃত্তিতে চলে যায়। অর্থাৎ, যখন কোডে `continue` স্টেটমেন্টটি মিলবে, তখন লুপের বাকি অংশ বাদ দিয়ে সরাসরি পরবর্তী পুনরাবৃত্তি শুরু হয়ে যাবে।


```java
int ch;
while (ch == getChar()) {
    if (ch == ' ') {
        continue; // Skips the rest of the while-loop
    }

    // Rest of the while-loop, will not be reached if ch == ' '
    doSomething();
}
```


লেবেলগুলো কন্টিনিউ স্টেটমেন্ট এবং ব্রেক স্টেটমেন্টে নির্দিষ্ট করা যেতে পারে।


```java
outer:
for (String str : stringsArr) {
    char[] strChars = str.toCharArray();
    for (char ch : strChars) {
        if (ch == ' ') {
            /* Continues the outer cycle and the next
            string is retrieved from stringsArr */
            continue outer;
        }
        doSomething(ch);
    }
}
```


#### <code>return</code> বিবৃতি
রিটার্ন স্টেটমেন্ট, মেথড এক্সিকিউশন শেষ করতে এবং একটি মান ফেরত দিতে ব্যবহৃত হয়। মেথড দ্বারা প্রত্যাবর্তিত মান রিটার্ন কীওয়ার্ডের পরে লেখা হয়। যদি পদ্ধতিটি void ব্যতীত কিছু ফেরত দেয়, তবে কিছু মান ফেরত দিতে অবশ্যই রিটার্ন স্টেটমেন্ট ব্যবহার হয়।


```java
void doSomething(boolean streamClosed) {
    // If streamClosed is true, execution is stopped
    if (streamClosed) {
        return;
    }
    readFromStream();
}

int calculateSum(int a, int b) {
    int result = a + b;
    return result;
}
```


রিটার্ন স্টেটমেন্ট অবিলম্বে এক্সিকিউশন শেষ করে, একটি কেস ব্যতীত: যদি স্টেটমেন্টটি একটি ট্রাই ব্লকের মধ্যে সম্মুখীন হয় এবং  নিয়ন্ত্রণ finally ব্লকে চলে যায়।


```java
void doSomething(boolean streamClosed) {
    try {
        if (streamClosed) {
            return;
        }
        readFromStream();
    } finally {
        /* Will be called last even if 
        readFromStream() was not called */
        freeResources();
    }
}
```


## ডাটা কাঠামো/স্ট্রাকচার
জাভাতে এগুলোর জন্য আলাদা বাক্যরীতি রয়েছে। উল্লেখ্য, এরে এবং স্ট্রিং সাধারণ/primitive ডাটা টাইপ নয়, তারা reference ডাটা টাইপ এবং তাদের কে java.lang.Object থেকে আনা হয়।

### সাধারণ/মৌলিক ডাটা টাইপগুলো
জাভা প্রোগ্রামিং ভাষায় প্রিমিটিভ ডাটা প্রকারগুলো হলো পূর্ণসংখ্যা, ফ্লটিং-পয়েন্ট সংখ্যা, UTF-16 কোড ইউনিট এবং বুলিয়ান। 

### রেফারেন্স টাইপ
রেফারেন্স টাইপে ক্লাস টাইপ, ইন্টারফেস টাইপ এবং অ্যারে টাইপ অন্তর্ভুক্ত। যখন কনস্ট্রাক্টর কল করা হয়, তখন হিপে একটি অবজেক্ট তৈরি করা হয় এবং একটি রেফারেন্স ভেরিয়েবলে এসাইন করা হয়। যখন একটি অবজেক্টের ভেরিয়েবল স্কোপের বাইরে চলে যায়, তখন রেফারেন্সটি ভেঙে যায় এবং যখন কোন রেফারেন্স বাকি থাকে না, তখন অবজেক্টটিকে গার্বেজ হিসাবে চিহ্নিত করা হয়। গার্বেজ কালেক্টর পরে কিছু সময়ের পরে এটিকে সংগ্রহ এবং ধ্বংস করে। একটি রেফারেন্স ভেরিয়েবল নাল হয় যখন এটি কোন অবজেক্টের রেফারেন্স করে না।

### অ্যারে
জাভা-তে অ্যারে, ক্লাস ইনস্ট্যান্সের মতোই রানটাইমে তৈরি হয়। অ্যারের দৈর্ঘ্য তৈরির সময় নির্ধারিত হয় এবং পরে পরিবর্তন করা যায় না।
```java
int[] numbers = new int[5];
numbers[0] = 2;
numbers[1] = 5;
int x = numbers[0];
```


#### ইনিশিয়ালাইজার

```java
// Long syntax
int[] numbers = new int[] {20, 1, 42, 15, 34};
// Short syntax
int[] numbers2 = {20, 1, 42, 15, 34};
```


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

#### ঘোষণা

#### ইনস্ট্যান্টেশন/দৃষ্টান্ত
ক্লাসের নন-স্ট্যাটিক সদস্যগুলো ইন্সট্যান্স ভেরিয়েবল এবং মেথডের ধরন নির্ধারণ করে, যা সেই ক্লাস থেকে তৈরি করা অবজেক্টগুলোর সাথে সম্পর্কিত। এই অবজেক্টগুলো তৈরি করার জন্য, ক্লাসটিকে `new` অপারেটর ব্যবহার করে ইনস্ট্যান্সিয়েট করতে হবে এবং ক্লাস কনস্ট্রাক্টরকে কল করতে হবে।
```java
Foo foo = new Foo();
```


#### সদস্য অ্যাক্সেস করা
ইনস্ট্যান্স এবং স্ট্যাটিক উভয় ধরনের ক্লাসের সদস্যগুলোকেই `.` (ডট) অপারেটর ব্যবহার করে অ্যাক্সেস করা হয়।

**ইনস্ট্যান্স সদস্য অ্যাক্সেস করা**

ইনস্ট্যান্স সদস্যগুলোকে একটি ভেরিয়েবলের নামের মাধ্যমে অ্যাক্সেস করা যায়।
```java
String foo = "Hello";
String bar = foo.toUpperCase();
```
**স্ট্যাটিক ক্লাস সদস্য অ্যাক্সেস করা**

স্ট্যাটিক সদস্যগুলোকে ক্লাসের নাম বা অন্য কোনো টাইপের মাধ্যমে অ্যাক্সেস করা হয়। এর জন্য ক্লাসের কোনো ইনস্ট্যান্স তৈরি করার প্রয়োজন হয় না। স্ট্যাটিক সদস্যগুলোকে `static` মডিফায়ার ব্যবহার করে ঘোষণা করা হয়।
```java
public class Foo {
    public static void doSomething() {
    }
}

// Calling the static method
Foo.doSomething();
```


#### মডিফায়ার
মডিফায়ার হল কিওয়ার্ড যা টাইপ এবং টাইপ সদস্যের ঘোষণাকে সংশোধন করতে ব্যবহৃত হয়।

* **<code>abstract</code>** - নির্দেশ করে যে একটি ক্লাস কেবল একটি বেস ক্লাস হিসাবে কাজ করে এবং ইনস্ট্যান্সিয়েট করা যাবে না।
* **<code>static</code>** -  কেবল সদস্য ক্লাসের জন্য ব্যবহৃত হয়, নির্দেশ করে যে সদস্য ক্লাসটি ধারক ক্লাসের নির্দিষ্ট ইনস্ট্যান্সের অন্তর্গত নয়।
* **<code>final</code>** - **<code>final</code>**  ক্লাসগুলিকে প্রসারিত করা যাবে না এবং এর কোনো সাবক্লাস থাকতে পারে না।

##### অ্যাক্সেস মডিফায়ার
অ্যাক্সেস মডিফায়ার বা ইনহেরিটেন্স মডিফায়ার ক্লাস, মেথড এবং অন্যান্য সদস্যদের অ্যাক্সেসযোগ্যতা সেট করে। পাবলিক হিসাবে চিহ্নিত সদস্যগুলো যেকোন জায়গা থেকে পৌঁছানো যায়। যদি কোনো ক্লাস বা তার সদস্যের কোনো মডিফায়ার না থাকে, তাহলে ডিফল্ট অ্যাক্সেস ধরে নেওয়া হয়।
```java
public class Foo {
    int go() {
        return 0;
    }

    private class Bar {
    }
}
```
নিম্নলিখিত টেবিলটি দেখায় যে অ্যাক্সেস করা হচ্ছে এমন ক্লাস বা ক্লাস সদস্যের মডিফায়ার এবং অ্যাক্সেস করার ক্লাসের অবস্থানের উপর নির্ভর করে একটি ক্লাসের মধ্যে কোড কীভাবে ক্লাস বা মেথড অ্যাক্সেস করতে পারে:

থাম্ব|This image describes the class member scope within classes and packages.|295x295পিক্সেল

#### কনস্ট্রাক্টর এবং ইনিশিয়ালাইজার
কনস্ট্রাক্টর হল একটি বিশেষ ধরনের মেথড যা একটি ক্লাসের অবজেক্টকে ইনিশিয়ালাইজ করতে ব্যবহৃত হয়। এর নাম ক্লাসের নামের সাথে একই হয় এবং `new` কিওয়ার্ড ব্যবহার করে যখন ক্লাসের একটি অবজেক্ট তৈরি করা হয়, তখন এটি কল করা হয়। কনস্ট্রাক্টরের কোনো রিটার্ন টাইপ থাকে না, এমনকি `void` ও নয়। কনস্ট্রাক্টর ওভারলোড করা যায়, অর্থাৎ আপনি একই নামের কিন্তু ভিন্ন প্যারামিটার লিস্টের সাথে একাধিক কনস্ট্রাক্টর রাখতে পারেন। যদি আপনি কোনো কনস্ট্রাক্টর সংজ্ঞায়িত না করেন, তাহলে জাভা একটি ডিফল্ট নো-আর্গুমেন্ট কনস্ট্রাক্টর প্রদান করে। তবে, একবার আপনি একটি কনস্ট্রাক্টর সংজ্ঞায়িত করলে, ডিফল্ট কনস্ট্রাক্টর আর প্রদান করা হয় না।
```java
class Foo {
    String str;

    Foo() { // Constructor with no arguments

        // Initialization
    }

    Foo(String str) { // Constructor with one argument
        this.str = str;
    }
}
```
ইনিশিয়ালাইজার একটি ক্লাসের ইনস্ট্যান্স ভেরিয়েবলগুলোকে ইনিশিয়ালাইজ করতে ব্যবহৃত হয়। দুই ধরনের ইনিশিয়ালাইজার আছে।

১। স্ট্যাটিক ইনিশিয়ালাইজারঃ কেবল একবার কার্যকর হয়, যখন ক্লাস প্রথম লোড হয়। ডিফল্ট মানের সাথে স্ট্যাটিক ভেরিয়েবলগুলোকে ইনিশিয়ালাইজ করতে ব্যবহৃত হয়।
```java5
public class Person {
    private static int count = 0;

    // Static initializer
    static {
        count = 100;
    }
}
```
২। ইনস্ট্যান্স ইনিশিয়ালাইজারঃ অবজেক্টের কনস্ট্রাক্টরের আগে কার্যকর হয়। ডিফল্ট মানের সাথে ইনস্ট্যান্স ভেরিয়েবলগুলোকে ইনিশিয়ালাইজ করতে ব্যবহৃত হয়।

একটি ক্লাস কেবলমাত্র একবার তৈরি হয়। অতএব, স্ট্যাটিক ইনিশিয়ালাইজার একাধিকবার কল করা হয় না। বিপরীতে, ইনস্ট্যান্স ইনিশিয়ালাইজার স্বয়ংক্রিয়ভাবে ক্লাসের একটি ইনস্ট্যান্স তৈরি হওয়ার প্রতিবার কনস্ট্রাক্টর কল করার আগে কল করা হয়। কনস্ট্রাক্টরের বিপরীতে ইনস্ট্যান্স ইনিশিয়ালাইজার কোনো আর্গুমেন্ট নিতে পারে না এবং সাধারণত তারা কোনো চেকড এক্সেপশন ছুড়তে পারে না (কয়েকটি বিশেষ ক্ষেত্র ব্যতীত)। ইনস্ট্যান্স ইনিশিয়ালাইজার কোনো কিওয়ার্ড ছাড়া একটি ব্লকের মধ্যে ঘোষণা করা হয়:
```java5
public class Person {
    private String name;
    private int age;

    // ইনস্ট্যান্স ইনিশিয়ালাইজার
    {
        name = "Unknown";
        age = 0;
    }

    // কনস্ট্রাক্টর
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
}
```
যেহেতু জাভা একটি গার্বেজ কালেকশন মেকানিজম রয়েছে, তাই কোনো ডিস্ট্রাক্টর নেই। তবে, প্রতিটি অবজেক্টের একটি `finalize()` পদ্ধতি রয়েছে যা গার্বেজ কালেকশনের আগে কল করা হয়। `finalize()` পদ্ধতিটি একটি নির্দিষ্ট অবজেক্টের জন্য গার্বেজ কালেক্টর চালানোর আগে সিস্টেম রিসোর্স মুক্ত করে।

### মেথড
জাভাতে সমস্ত বিবৃতি অবশ্যই মেথডের মধ্যে থাকবে। পদ্ধতিগুলি ক্লাসের অন্তর্গত ছাড়া ফাংশনের অনুরূপ। একটি মেথড একটি রিটার্ন মান, একটি নাম এবং সাধারণত কিছু প্যারামিটার শুরু হয় যখন এটিকে কিছু আর্গুমেন্ট সহ কল ​​করা হয়। C++ এর মতো, কিছুই ফেরত না দেওয়া পদ্ধতিগুলিকে রিটার্ন টাইপ অকার্যকর হিসাবে ঘোষণা করা হয়েছে। C++ এর বিপরীতে, জাভাতে মেথডগুলিকে ডিফল্ট আর্গুমেন্ট মান থাকতে দেওয়া হয় না এবং মেথডগুলি সাধারণত ওভারলোড করা হয়। একটি মেথড একই নামে একাধিকবার লেখা যায়, যদি তাদের প্যারামিটার ভিন্ন হয়। একে মেথড ওভারলোডিং বলে।
```java
class Foo {
    int bar(int a, int b) {
        return (a*2) + b;
    }

    /* Overloaded method with the same name but different set of arguments */
    int bar(int a) {
        return a*2;
    }
}
```
একটি পদ্ধতিকে একটি বস্তুর উপর `.` নোটেশন ব্যবহার করে অথবা একটি স্ট্যাটিক পদ্ধতির ক্ষেত্রে, স্ট্যাটিক মেথড ক্লাসের অন্তর্গত, কোনো নির্দিষ্ট অবজেক্টের নয়। এটি সরাসরি ক্লাসের নাম ব্যবহার করে কল করা হয়।
```java
Foo foo = new Foo();
int result = foo.bar(7, 2); // Non-static method is called on foo

int finalResult = Math.abs(result); // Static method call
```
যদি কোনো মেথডের কাজ করার সময় সমস্যা (exception) হতে পারে, তবে সেটি `throws` ব্যবহার করে ডিক্লেয়ার করতে হয়।
```java
void openStream() throws IOException, myException { // Indicates that IOException may be thrown
}
```


#### মেথড মডিফায়ার
মেথডের আচরণ নির্ধারণ করার জন্য কিছু মডিফায়ার ব্যবহার করা হয়:

### অ্যাবস্ট্র্যাক্ট ক্লাস

## তথ্যসূত্র

## আরও দেখুন

* স্প্রিং কাঠামো

## বহিঃসংযোগ

* বাংলায় জাভা প্রোগ্রামিং শেখার কোর্স

বিষয়শ্রেণী:প্রোগ্রামিং ভাষা
বিষয়শ্রেণী:ক্লাস-ভিত্তিক প্রোগ্রামিং ভাষা
বিষয়শ্রেণী:জাভা প্রোগ্রামিং
বিষয়শ্রেণী:জাভা প্ল্যাটফর্ম
বিষয়শ্রেণী:বস্তু-সংশ্লিষ্ট প্রোগ্রামিং ভাষা