Java একটি Object-Oriented Programming (OOP) ভাষা, যেখানে প্রোগ্রামিংয়ের প্রতিটি উপাদান একটি অবজেক্ট হিসেবে কাজ করে। নিচে Java OOPs Concepts সম্পর্কিত কিছু সাধারণ ইন্টারভিউ প্রশ্ন এবং তাদের উত্তর দেওয়া হলো:
1. OOP কী?
- উত্তর: OOP (Object-Oriented Programming) একটি প্রোগ্রামিং প্যারাডাইম যা অবজেক্ট এবং ক্লাস ধারণার উপর ভিত্তি করে। এটি কোডের পুনঃব্যবহারযোগ্যতা, নমনীয়তা এবং রক্ষণাবেক্ষণের সুবিধা প্রদান করে। OOP এর প্রধান চারটি মূলনীতি হল:
- Encapsulation
- Inheritance
- Polymorphism
- Abstraction
2. Encapsulation কী?
- উত্তর: Encapsulation হল একটি OOP কনসেপ্ট যার মাধ্যমে অবজেক্টের ডাটা (প্রোপার্টি) এবং মেথডগুলো একত্রিত করা হয় এবং সেই ডাটাকে সুরক্ষিত রাখা হয়। একে "ডাটা হাইডিং"ও বলা হয়, যেখানে ডাটার অ্যাক্সেস কন্ট্রোল করার জন্য getter এবং setter মেথড ব্যবহার করা হয়।
উদাহরণ:
class Employee {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
3. Inheritance কী?
- উত্তর: Inheritance হল একটি OOP কনসেপ্ট যেখানে একটি ক্লাস অন্য ক্লাস থেকে বৈশিষ্ট্য এবং আচরণ (methods) গ্রহণ করে। এটি কোডের পুনঃব্যবহারযোগ্যতা এবং সহজ maintenance এর সুবিধা প্রদান করে। একটি ক্লাস যে ক্লাস থেকে বৈশিষ্ট্য গ্রহণ করে তাকে superclass বা parent class এবং যে ক্লাস বৈশিষ্ট্য গ্রহণ করে তাকে subclass বা child class বলা হয়।
উদাহরণ:
class Animal {
void eat() {
System.out.println("Animal is eating");
}
}
class Dog extends Animal {
void bark() {
System.out.println("Dog is barking");
}
}
4. Polymorphism কী?
- উত্তর: Polymorphism হল একটি OOP কনসেপ্ট যেখানে একাধিক মেথড বা অপারেটরের সাহায্যে একাধিক আচরণ নির্ধারণ করা যায়। এটি দুই ধরনের হতে পারে:
- Compile-time Polymorphism (Method Overloading): একই মেথডের বিভিন্ন ভার্সন একাধিক আর্গুমেন্ট দিয়ে তৈরি করা হয়।
- Runtime Polymorphism (Method Overriding): একটি মেথড সাবক্লাসে পুনরায় ডিফাইন করা হয়, যা সুপারক্লাসের মেথডকে ওভাররাইড করে।
উদাহরণ:
Method Overloading (Compile-time):
class Calculator { int add(int a, int b) { return a + b; } double add(double a, double b) { return a + b; } }Method Overriding (Runtime):
class Animal { void sound() { System.out.println("Animal makes a sound"); } } class Dog extends Animal { @Override void sound() { System.out.println("Dog barks"); } }
5. Abstraction কী?
- উত্তর: Abstraction হল একটি OOP কনসেপ্ট যেখানে অবজেক্টের অন্তর্নিহিত ডিটেইলগুলি লুকিয়ে রাখা হয় এবং শুধুমাত্র গুরুত্বপূর্ণ বা প্রয়োজনীয় অংশ প্রদর্শিত হয়। এটি abstract class এবং interface ব্যবহার করে অর্জন করা হয়। abstract class সাধারণত partial implementation দেয়, এবং interface শুধুমাত্র মেথড সিগনেচার প্রদান করে।
উদাহরণ:
abstract class Animal {
abstract void sound(); // abstract method
void eat() {
System.out.println("Animal is eating");
}
}
class Dog extends Animal {
void sound() {
System.out.println("Dog barks");
}
}
6. Interface এবং Abstract Class-এর মধ্যে পার্থক্য কী?
- উত্তর:
- Abstract Class:
- একটি ক্লাস যা abstract মেথড (যেগুলির implementation নেই) এবং non-abstract মেথড (যেগুলির implementation আছে) ধারণ করতে পারে।
- একাধিক abstract class থেকে ইনহেরিট করা যায় না।
- Interface:
- শুধুমাত্র abstract মেথড থাকতে পারে (যদিও Java 8 থেকে default এবং static মেথডের অনুমতি দেয়া হয়েছে)।
- একাধিক interface থেকে implements করা যায়।
- Abstract Class:
উদাহরণ:
interface Animal {
void sound();
}
class Dog implements Animal {
public void sound() {
System.out.println("Dog barks");
}
}
7. Constructor কী? এবং এর প্রকারভেদ কী?
- উত্তর: Constructor হল একটি বিশেষ মেথড যা ক্লাসের অবজেক্ট তৈরির সময় স্বয়ংক্রিয়ভাবে কল হয়। এটি ক্লাসের ইনিশিয়ালাইজেশন কাজ করে।
- Default Constructor: কোনো প্যারামিটার ছাড়া তৈরি হওয়া কন্সট্রাক্টর।
- Parameterized Constructor: প্যারামিটার সহ কন্সট্রাক্টর।
উদাহরণ:
class Person {
String name;
int age;
// Default constructor
Person() {
name = "Unknown";
age = 0;
}
// Parameterized constructor
Person(String name, int age) {
this.name = name;
this.age = age;
}
}
8. Static Keyword কী?
- উত্তর:
staticএকটি মডিফায়ার যা জাভা ক্লাসের সদস্য (ভেরিয়েবল বা মেথড) কে ক্লাস লেভেলে নির্দেশ করে। এর মানে হল যে এটি ক্লাসের সব অবজেক্টের মধ্যে শেয়ার করা হয়। - Static Variable: এটি ক্লাসের সকল অবজেক্টের জন্য একটি সাধারণ ভেরিয়েবল।
- Static Method: এটি কোন অবজেক্ট তৈরি না করেই ক্লাস থেকে সরাসরি কল করা যায়।
উদাহরণ:
class Counter {
static int count = 0;
Counter() {
count++;
}
static void showCount() {
System.out.println("Count: " + count);
}
}
9. What is the difference between method overloading and method overriding?
- Method Overloading: এটি compile-time polymorphism। একই মেথড নামের একাধিক সংস্করণ তৈরি করা হয়, তবে ভিন্ন ভিন্ন প্যারামিটার লিস্ট থাকে।
- Method Overriding: এটি runtime polymorphism। যখন একটি subclass superclass এর মেথডকে নতুনভাবে সংজ্ঞায়িত করে, তখন সেটিকে মেথড ওভাররাইডিং বলা হয়।
10. What is the "this" keyword in Java?
- উত্তর:
thisকীওয়ার্ড অবজেক্টের বর্তমান instance বা অবজেক্টের প্রতি রেফারেন্স প্রদান করে। এটি সাধারণত instance ভেরিয়েবল এবং মেথডে ব্যবহার করা হয়, বিশেষ করে যখন মেথডের প্যারামিটার নাম instance ভেরিয়েবলের সাথে মিলে যায়।
উদাহরণ:
class Person {
String name;
Person(String name) {
this.name = name; // this refers to the instance variable
}
}
এই প্রশ্নগুলি Java OOPs কনসেপ্টের বিভিন্ন দিক নিয়ে। OOPs নিয়ে ভালোভাবে জানলে, আপনি Java ইন্টারভিউতে সফলভাবে উত্তীর্ণ হতে পারবেন।
Inheritance (উত্তরাধিকার) হল একটি OOP (Object-Oriented Programming) ধারণা, যেখানে একটি ক্লাস (subclass বা derived class) অন্য ক্লাস (superclass বা base class) এর বৈশিষ্ট্য (properties) এবং আচরণ (methods) উত্তরাধিকার সূত্রে গ্রহণ করে। এটি কোড পুনঃব্যবহারযোগ্যতা, লুকানো (abstraction), এবং দ্রুত ডেভেলপমেন্টে সহায়তা করে।
Java তে Inheritance একটি অত্যন্ত গুরুত্বপূর্ণ ধারণা, যা একাধিক শ্রেণী এবং উপাদানগুলির মধ্যে সম্পর্ক তৈরি করতে ব্যবহৃত হয়। এর মাধ্যমে আপনি একটি ক্লাস থেকে অন্য ক্লাসে বৈশিষ্ট্য এবং আচরণ সরাসরি ব্যবহার করতে পারেন, ফলে কোডের পুনঃব্যবহার এবং রক্ষণাবেক্ষণ সহজ হয়।
Inheritance এর প্রকারভেদ:
- Single Inheritance (একক উত্তরাধিকার):
- ধারণা: Single Inheritance হল একটি পরিস্থিতি যেখানে একটি সাবক্লাস শুধুমাত্র একটিই সুপারক্লাস থেকে বৈশিষ্ট্য এবং আচরণ উত্তরাধিকার পায়।
উদাহরণ:
class Animal { void eat() { System.out.println("This animal eats food."); } } class Dog extends Animal { void bark() { System.out.println("Dog barks."); } } public class Test { public static void main(String args[]) { Dog d = new Dog(); d.eat(); // Animal class method d.bark(); // Dog class method } }- বিবরণ: এখানে
Dogক্লাসটিAnimalক্লাস থেকেeat()মেথড উত্তরাধিকার পেয়েছে এবংbark()মেথডটি নিজে থেকে সংজ্ঞায়িত করেছে।
- Multiple Inheritance (একাধিক উত্তরাধিকার):
- ধারণা: Multiple Inheritance হল একটি পরিস্থিতি যেখানে একটি ক্লাস একাধিক সুপারক্লাস থেকে বৈশিষ্ট্য এবং আচরণ উত্তরাধিকার পায়। Java তে সরাসরি একাধিক ক্লাসের মাধ্যমে Multiple Inheritance সমর্থিত নয়, তবে আপনি এটি Interfaces ব্যবহার করে অর্জন করতে পারেন।
উদাহরণ (Interfaces এর মাধ্যমে):
interface Animal { void eat(); } interface Sound { void makeSound(); } class Dog implements Animal, Sound { public void eat() { System.out.println("Dog eats food."); } public void makeSound() { System.out.println("Dog barks."); } } public class Test { public static void main(String args[]) { Dog d = new Dog(); d.eat(); // Animal interface method d.makeSound(); // Sound interface method } }- বিবরণ: এখানে
Dogক্লাসটি দুটি ইন্টারফেস (Animal এবং Sound) ইমপ্লিমেন্ট করে এবং দুটি আলাদা আচরণ অর্জন করছে।
- Multilevel Inheritance (বহুতল উত্তরাধিকার):
- ধারণা: Multilevel Inheritance হল একটি পরিস্থিতি যেখানে একটি ক্লাস একটি সুপারক্লাস থেকে উত্তরাধিকার পায় এবং সেই ক্লাস আবার অন্য একটি ক্লাসকে উত্তরাধিকার দেয়। এটি "ধাপে ধাপে" উত্তরাধিকার প্রদানের একটি পদ্ধতি।
উদাহরণ:
class Animal { void eat() { System.out.println("This animal eats food."); } } class Dog extends Animal { void bark() { System.out.println("Dog barks."); } } class BabyDog extends Dog { void weep() { System.out.println("Baby dog weeps."); } } public class Test { public static void main(String args[]) { BabyDog bd = new BabyDog(); bd.eat(); // Animal class method bd.bark(); // Dog class method bd.weep(); // BabyDog class method } }- বিবরণ: এখানে
BabyDogক্লাসটি প্রথমেDogথেকে এবং তারপরAnimalক্লাস থেকে বৈশিষ্ট্য এবং আচরণ উত্তরাধিকার পেয়েছে।
- Hierarchical Inheritance (হায়ারারকিকাল উত্তরাধিকার):
- ধারণা: Hierarchical Inheritance হল একটি পরিস্থিতি যেখানে একটি সুপারক্লাস একাধিক সাবক্লাসের জন্য সাধারণ বৈশিষ্ট্য এবং আচরণ সরবরাহ করে। এই ক্ষেত্রে একাধিক ক্লাস একই সুপারক্লাস থেকে উত্তরাধিকার পায়।
উদাহরণ:
class Animal { void eat() { System.out.println("This animal eats food."); } } class Dog extends Animal { void bark() { System.out.println("Dog barks."); } } class Cat extends Animal { void meow() { System.out.println("Cat meows."); } } public class Test { public static void main(String args[]) { Dog d = new Dog(); d.eat(); // Animal class method d.bark(); // Dog class method Cat c = new Cat(); c.eat(); // Animal class method c.meow(); // Cat class method } }- বিবরণ: এখানে
DogএবংCatদুটি আলাদা ক্লাসAnimalক্লাস থেকে বৈশিষ্ট্য এবং আচরণ উত্তরাধিকার পেয়েছে, যা হায়ারারকিকাল ইনহেরিটেন্সের একটি উদাহরণ।
- Hybrid Inheritance (হাইব্রিড উত্তরাধিকার):
- ধারণা: Hybrid Inheritance হল একটি পরিস্থিতি যেখানে একাধিক উত্তরাধিকার শৈলী একত্রিত হয়, যেমন একাধিক ক্লাস থেকে উত্তরাধিকার পাওয়া এবং ইন্টারফেস ব্যবহার করা। Java তে এই ধরনের উত্তরাধিকার সাধারণত ইন্টারফেস এবং ক্লাসের মিশ্রণ ব্যবহার করে অর্জিত হয়।
উদাহরণ (Interface + Class):
interface Animal { void eat(); } interface Sound { void makeSound(); } class Dog implements Animal, Sound { public void eat() { System.out.println("Dog eats food."); } public void makeSound() { System.out.println("Dog barks."); } } class Puppy extends Dog { void play() { System.out.println("Puppy plays."); } } public class Test { public static void main(String args[]) { Puppy p = new Puppy(); p.eat(); // Animal interface method p.makeSound(); // Sound interface method p.play(); // Puppy class method } }- বিবরণ: এখানে
Puppyক্লাসটিDogক্লাস থেকে উত্তরাধিকার পেয়েছে, এবংDogক্লাসটি দুটি ইন্টারফেস (Animal এবং Sound) ইমপ্লিমেন্ট করেছে, যা Hybrid Inheritance এর একটি উদাহরণ।
Java তে Inheritance প্রক্রিয়া কোডের পুনঃব্যবহারযোগ্যতা, কাঠামোগত প্রোগ্রামিং এবং জটিলতা কমানোর জন্য অত্যন্ত গুরুত্বপূর্ণ। Single Inheritance একক ক্লাস থেকে উত্তরাধিকার গ্রহণ করে, Multiple Inheritance ইন্টারফেসের মাধ্যমে সম্ভব হয়, Multilevel Inheritance ধাপে ধাপে উত্তরাধিকার প্রদানের একটি প্রক্রিয়া, Hierarchical Inheritance একাধিক ক্লাসের জন্য এক সুপারক্লাস ব্যবহার করা হয়, এবং Hybrid Inheritance একাধিক উত্তরাধিকার শৈলী একত্রিত করে। এগুলি OOP এর শক্তিশালী বৈশিষ্ট্যগুলির মধ্যে একটি।
Method Overloading এবং Method Overriding জাভা প্রোগ্রামিং ভাষায় পলিমরফিজমের দুটি গুরুত্বপূর্ণ অংশ। এই দুটি বৈশিষ্ট্যই একই নামের মেথডকে ব্যবহারের মাধ্যমে বিভিন্ন আচরণ প্রদান করে, তবে তাদের মধ্যে মূল পার্থক্য আছে।
1. Method Overloading (মেথড ওভারলোডিং)
- বর্ণনা: মেথড ওভারলোডিং হল একটি প্রক্রিয়া যেখানে একটি ক্লাসে একই নামের একাধিক মেথড থাকে, কিন্তু তাদের প্যারামিটার সংখ্যা বা টাইপ ভিন্ন হয়। অর্থাৎ, একই নামের মেথড বিভিন্ন আর্গুমেন্টের সাথে ব্যবহার করা হয়।
- কী পরিবর্তন হয়:
- মেথডের নাম একই থাকে, কিন্তু প্যারামিটার (সংখ্যা, টাইপ, বা আর্ডার) পরিবর্তিত হয়।
- রিটার্ন টাইপ পরিবর্তন করা সম্ভব নয়।
- এটি কম্পাইল টাইম (স্ট্যাটিক) পলিমরফিজম।
উদাহরণ:
class Calculator { // Method to add two integers public int add(int a, int b) { return a + b; } // Overloaded method to add three integers public int add(int a, int b, int c) { return a + b + c; } // Overloaded method with different parameter types public double add(double a, double b) { return a + b; } }এখানে,
addমেথড তিনটি ভিন্ন ভিন্ন প্যারামিটার (সংখ্যা এবং টাইপ) নিয়ে ওভারলোড করা হয়েছে।
2. Method Overriding (মেথড ওভাররাইডিং)
- বর্ণনা: মেথড ওভাররাইডিং হল একটি প্রক্রিয়া যেখানে একটি সাবক্লাস (child class) তার সুপারক্লাস (parent class) থেকে একটি মেথডকে পুনরায় সংজ্ঞায়িত (redefine) করে। এটি মূলত সুপারক্লাসের মেথডের আচরণ পরিবর্তন করতে ব্যবহৃত হয়।
- কী পরিবর্তন হয়:
- মেথডের নাম, প্যারামিটার, এবং রিটার্ন টাইপ একই থাকে।
- এটি রানটাইম (ডাইনামিক) পলিমরফিজম।
@Overrideঅ্যানোটেশন ব্যবহার করা হয়।
উদাহরণ:
class Animal { // Parent class method public void sound() { System.out.println("Some animal makes a sound"); } } class Dog extends Animal { // Overriding the parent class method @Override public void sound() { System.out.println("Bark"); } } class TestOverriding { public static void main(String[] args) { Animal myAnimal = new Dog(); // Upcasting myAnimal.sound(); // Output: Bark } }এখানে,
Dogক্লাসেsound()মেথডটিAnimalক্লাস থেকে ওভাররাইড করা হয়েছে এবং এর আচরণ পরিবর্তন করা হয়েছে।
Method Overloading এবং Method Overriding এর মধ্যে পার্থক্য:
| বৈশিষ্ট্য | Method Overloading | Method Overriding |
|---|---|---|
| নাম | একই নামের মেথড বিভিন্ন প্যারামিটার সহ ব্যবহৃত হয় | একই নাম, প্যারামিটার এবং রিটার্ন টাইপ সহ মেথড রিপ্লেস করা হয় |
| প্যারামিটার | প্যারামিটার সংখ্যা বা টাইপ পরিবর্তন হয় | প্যারামিটার সংখ্যা বা টাইপ পরিবর্তন হয় না |
| রিটার্ন টাইপ | রিটার্ন টাইপ পরিবর্তন করা যায় না | রিটার্ন টাইপ একই থাকে |
| পলিমরফিজম | কম্পাইল টাইম (স্ট্যাটিক) পলিমরফিজম | রানটাইম (ডাইনামিক) পলিমরফিজম |
| অ্যাক্সেস মডিফায়ার | কোন সমস্যা নেই | প্যারেন্ট ক্লাসের মেথডে অ্যাক্সেস মডিফায়ারটি কমপক্ষে সাবক্লাসের মেথডের মতো হতে হবে |
| অ্যানোটেশন | @Override ব্যবহার করা হয় না | @Override অ্যানোটেশন ব্যবহৃত হয় |
- Method Overloading: একই নামের মেথড, কিন্তু প্যারামিটার সংখ্যা বা টাইপ ভিন্ন। এটি স্ট্যাটিক পলিমরফিজম।
- Method Overriding: সাবক্লাসে সুপারক্লাসের মেথড পুনঃসংজ্ঞায়িত করা, এবং এটি রানটাইম পলিমরফিজম তৈরি করে।
এটি প্রোগ্রামিংয়ে গুরুত্বপূর্ণ পদ্ধতি হিসেবে ব্যবহার করা হয় এবং কোডের পুনঃব্যবহারযোগ্যতা এবং নমনীয়তা বৃদ্ধি করে।
Abstract Class এবং Interface দুটি গুরুত্বপূর্ণ ধারণা Java-তে, যেগুলি সাধারণত ইন্টারভিউ প্রশ্নে আসে। উভয়ই একটি ক্লাসের ভেরিয়েবল এবং মেথডের সংজ্ঞা (definition) সরবরাহ করতে সহায়তা করে, তবে তাদের মধ্যে কিছু মৌলিক পার্থক্য রয়েছে। নিচে এই দুইটির মধ্যে পার্থক্য এবং তাদের ব্যবহারের ক্ষেত্রগুলো বিস্তারিতভাবে আলোচনা করা হলো:
1. Abstract Class (অ্যাবস্ট্র্যাক্ট ক্লাস)
- ডিফিনেশন: একটি abstract class এমন একটি ক্লাস, যা সরাসরি ইনস্ট্যান্স (অবজেক্ট) তৈরি করা যায় না, তবে এটি অন্যান্য ক্লাস থেকে ইনহেরিট করা যেতে পারে। এটি পূর্ণাঙ্গ (concrete) মেথড এবং বিমূর্ত (abstract) মেথড উভয়ই থাকতে পারে।
- বৈশিষ্ট্য:
- মেথড: একটি abstract class তে abstract মেথড থাকতে পারে (যেগুলোর কোনো ইমপ্লিমেন্টেশন নেই) এবং concrete মেথড থাকতে পারে (যেগুলোর ইমপ্লিমেন্টেশন থাকে)।
- ডেটা মেম্বার: এটি সাধারণভাবে ইনস্ট্যান্স ভেরিয়েবল (non-static) এবং static ভেরিয়েবল ধারণ করতে পারে।
- কনস্ট্রাক্টর: abstract class কনস্ট্রাক্টর থাকতে পারে, যা ইনহেরিটিং ক্লাসের জন্য ব্যবহার করা যেতে পারে।
- ইনহেরিটেন্স: এটি একাধিক ইনহেরিটেন্স সমর্থন করে না। এক ক্লাস শুধুমাত্র একটি abstract class থেকে ইনহেরিট করতে পারে।
উদাহরণ:
abstract class Animal {
abstract void sound(); // abstract method
void sleep() { // concrete method
System.out.println("Animal is sleeping");
}
}
class Dog extends Animal {
void sound() {
System.out.println("Woof");
}
}
2. Interface (ইন্টারফেস)
- ডিফিনেশন: একটি interface শুধুমাত্র মেথডের সাইনেচার (signature) সংজ্ঞায়িত করে, তবে এর কোনো ইমপ্লিমেন্টেশন থাকে না। যে কোনো ক্লাস এটি ইমপ্লিমেন্ট (implement) করতে পারে এবং তার প্রয়োজনীয় ইমপ্লিমেন্টেশন প্রদান করতে পারে।
- বৈশিষ্ট্য:
- মেথড: একটি interface তে সব মেথড abstract হয়, এবং আগের Java সংস্করণে এগুলোর ইমপ্লিমেন্টেশন থাকত না। Java 8 থেকে, interfaces-এ default এবং static মেথডের ইমপ্লিমেন্টেশন প্রদান করা সম্ভব।
- ডেটা মেম্বার: interface তে সব ভেরিয়েবল public static final হয় (যদিও এগুলোর মান পরিবর্তনযোগ্য নয়)।
- ইনহেরিটেন্স: একটি ক্লাস একাধিক ইন্টারফেস ইমপ্লিমেন্ট করতে পারে, যা Java-এ multiple inheritance এর সমাধান হিসেবে ব্যবহৃত হয়।
- কনস্ট্রাক্টর: interface এর কোনো কনস্ট্রাক্টর থাকে না।
উদাহরণ:
interface Animal {
void sound(); // abstract method
default void sleep() { // default method with implementation
System.out.println("Animal is sleeping");
}
}
class Dog implements Animal {
public void sound() {
System.out.println("Woof");
}
}
Abstract Class এবং Interface এর মধ্যে পার্থক্য:
| বৈশিষ্ট্য | Abstract Class | Interface |
|---|---|---|
| মেথড ইমপ্লিমেন্টেশন | এটি concrete (পূর্ণাঙ্গ) মেথড এবং abstract মেথড থাকতে পারে। | সব মেথড default বা static ছাড়া abstract থাকে। |
| Multiple Inheritance | একাধিক ইনহেরিটেন্স সমর্থন করে না। | একাধিক ইন্টারফেস ইমপ্লিমেন্ট করা যায়। |
| ভেরিয়েবল | সাধারণভাবে instance variables এবং static variables থাকতে পারে। | সব ভেরিয়েবল public static final হয়। |
| কনস্ট্রাক্টর | এটি কনস্ট্রাক্টর থাকতে পারে। | কনস্ট্রাক্টর থাকে না। |
| ইনহেরিটেন্স | একটি ক্লাস শুধুমাত্র একটি abstract class থেকে ইনহেরিট করতে পারে। | একটি ক্লাস একাধিক ইন্টারফেস ইমপ্লিমেন্ট করতে পারে। |
| বিভিন্ন মেথড টাইপ | abstract, static, final, synchronized মেথড থাকতে পারে। | শুধুমাত্র abstract, default, static মেথড থাকতে পারে। |
| বাইন্ডিং টাইম | এটি compile-time binding (early binding) ব্যবহার করে। | এটি runtime binding (late binding) ব্যবহার করে। |
কখন Abstract Class এবং Interface ব্যবহার করবেন?
- Abstract Class: যখন আপনাকে কিছু সাধারণ ফাংশনালিটি (concrete methods) এবং কিছু একে অপরের মধ্যে ভাগ করা আচরণ (common behavior) শেয়ার করতে হয়, তখন abstract class ব্যবহার করা উপযুক্ত।
- Interface: যখন আপনি একাধিক ভিন্ন ভিন্ন ক্লাসে একই ধরনের আচরণ (behavior) প্রয়োগ করতে চান এবং আপনার পক্ষে একাধিক ক্লাসে আচরণ শেয়ার করা সম্ভব না হলে (multiple inheritance), তখন ইন্টারফেস ব্যবহার করা উচিত।
Abstract class এবং Interface দুটি গুরুত্বপূর্ণ কনসেপ্ট Java তে, তবে তাদের মধ্যে পার্থক্যগুলি পরিষ্কারভাবে বুঝে, সঠিক সময়ে সঠিক ব্যবহার করতে হবে। Abstract class সাধারণত সাধারণ বৈশিষ্ট্য এবং আচরণ শেয়ার করতে ব্যবহৃত হয়, যেখানে interface একটি শূন্য শ্রেণি হিসাবে কার্যকরী পদ্ধতি ঘোষণা করে যা একাধিক ক্লাসে ইমপ্লিমেন্ট করা যায়।
Java তে Constructor এবং Destructor দুটি গুরুত্বপূর্ণ ধারণা, যা Object-Oriented Programming (OOP) এর মূল অংশ। এই দুটি ব্যবহার করে ক্লাসের অবজেক্ট তৈরি এবং ধ্বংস করা হয়।
১. Constructor:
Constructor একটি বিশেষ ধরনের মেথড যা একটি ক্লাসের অবজেক্ট তৈরি করার সময় স্বয়ংক্রিয়ভাবে কল হয়। এটি new কিওয়ার্ডের সাথে ব্যবহৃত হয় এবং একটি ক্লাসের নতুন অবজেক্ট তৈরি করে।
Constructor এর বৈশিষ্ট্য:
- নাম: Constructor এর নাম অবশ্যই ক্লাসের নামের সাথে মিল থাকতে হবে।
- রিটার্ন টাইপ: Constructor এর কোনো রিটার্ন টাইপ (যেমন
void,int,Stringইত্যাদি) থাকে না। - অটোমেটিক কল: একটি অবজেক্ট তৈরি করার সময় স্বয়ংক্রিয়ভাবে constructor কল হয়।
- উদ্দেশ্য: Constructor ব্যবহার করা হয় অবজেক্টের প্রাথমিক মান সেট করার জন্য বা অবজেক্টের ইনিশিয়ালাইজেশন করার জন্য।
Constructor এর ধরন:
ডিফল্ট Constructor (Default Constructor):
- যদি কোন কনস্ট্রাক্টর না দেওয়া হয়, তাহলে Java স্বয়ংক্রিয়ভাবে একটি ডিফল্ট কনস্ট্রাক্টর তৈরি করে, যা কোন প্যারামিটার নেয় না এবং অবজেক্টের সব ফিল্ডের মান ডিফল্ট মানে সেট করে।
উদাহরণ:
class Person { String name; int age; // Default Constructor public Person() { name = "Unknown"; age = 0; } void display() { System.out.println("Name: " + name + ", Age: " + age); } } public class Main { public static void main(String[] args) { Person p = new Person(); // Default constructor will be called p.display(); } }প্যারামিটারাইজড Constructor (Parameterized Constructor):
- এই ধরনের কনস্ট্রাক্টর ক্লাসের অবজেক্ট তৈরি করার সময় প্যারামিটার গ্রহণ করে এবং ফিল্ডের মান ইনিশিয়ালাইজ করতে সহায়তা করে।
উদাহরণ:
class Person { String name; int age; // Parameterized Constructor public Person(String name, int age) { this.name = name; this.age = age; } void display() { System.out.println("Name: " + name + ", Age: " + age); } } public class Main { public static void main(String[] args) { Person p = new Person("Alice", 25); // Parameterized constructor is called p.display(); } }
Constructor এর কাজ:
- Constructor অবজেক্টের প্রাথমিক মান সেট করে। এটি তখনই কল হয়, যখন একটি অবজেক্ট তৈরি হয়।
thisকীওয়ার্ড ব্যবহার করে বর্তমান ক্লাসের ফিল্ডগুলিকে ইনিশিয়ালাইজ করা হয়।- Constructor overloading: একাধিক কনস্ট্রাক্টর থাকতে পারে, যেখানে প্যারামিটার ভিন্ন ভিন্ন হতে পারে। এটি constructor overloading নামে পরিচিত।
Constructor এর ব্যবহার:
- অবজেক্ট তৈরি করার সময় এর ইনিশিয়ালাইজেশন করা।
- Constructor chaining: একটি কনস্ট্রাক্টর থেকে অন্য কনস্ট্রাক্টরকে কল করা যায়।
class Person {
String name;
int age;
// First constructor
public Person(String name) {
this.name = name;
}
// Second constructor using constructor chaining
public Person(String name, int age) {
this(name); // Calling the first constructor
this.age = age;
}
void display() {
System.out.println("Name: " + name + ", Age: " + age);
}
}
public class Main {
public static void main(String[] args) {
Person p1 = new Person("Alice");
Person p2 = new Person("Bob", 30);
p1.display();
p2.display();
}
}
২. Destructor:
Java তে Destructor এর কোনো সুস্পষ্ট ধারণা নেই। যেহেতু Java তে Garbage Collection ব্যবস্থা রয়েছে, যেখানে JVM স্বয়ংক্রিয়ভাবে অব্যবহৃত অবজেক্টগুলিকে মেমরি থেকে মুছে দেয়, তাই Java তে ডেস্ট্রাক্টর প্রয়োজন হয় না।
Destructor এর কাজ:
- Destructor একটি বিশেষ মেথড যা অবজেক্ট ধ্বংস বা মুছে ফেলার সময় কল হয়। তবে Java তে destructor এর কোনো সরাসরি সমাধান নেই।
- Java তে মেমরি ব্যবস্থাপনা গ্যারেজ কালেকশনের মাধ্যমে করা হয়। এটি অব্যবহৃত অবজেক্টগুলোকে স্বয়ংক্রিয়ভাবে মুছে ফেলে।
Java তে Destructor এর প্রতিস্থাপন:
Java তে finalize() মেথড ব্যবহার করা যেতে পারে, তবে এটি সাধারণত এখন পরিহার করা হয় এবং garbage collection এর মাধ্যমে কাজ হয়।
finalize() Method Example:
class MyClass {
@Override
protected void finalize() throws Throwable {
System.out.println("Object is being garbage collected");
super.finalize();
}
}
public class Main {
public static void main(String[] args) {
MyClass obj = new MyClass();
obj = null; // Object becomes eligible for garbage collection
System.gc(); // Request garbage collection
}
}
finalize()মেথডটি অবজেক্ট যখন গ্যারেজ কালেকশন হবে, তখন কল করা হয়, তবে এটি নিশ্চিত নয় যে এটি সবসময় কল হবে।
Garbage Collection:
Java তে Garbage Collector (GC) একটি বিশেষ প্রক্রিয়া যা অপ্রয়োজনীয় অবজেক্টগুলো মুছে দেয় এবং মেমরি মুক্ত করে। এটি নিজে নিজে কাজ করে, এবং ডেস্ট্রাক্টরের মতো কোনো explicit method কল করার প্রয়োজন হয় না।
- Constructor হল একটি বিশেষ মেথড যা অবজেক্ট তৈরি হওয়ার সময় স্বয়ংক্রিয়ভাবে কল হয় এবং অবজেক্টের প্রাথমিক মান ইনিশিয়ালাইজ করতে ব্যবহৃত হয়।
- Destructor Java তে নেই, কারণ Garbage Collection প্রক্রিয়া অব্যবহৃত অবজেক্টগুলোকে স্বয়ংক্রিয়ভাবে মুছে দেয়। তবে
finalize()মেথড ব্যবহার করা যেতে পারে, যা অবজেক্টের ধ্বংস প্রক্রিয়া সম্পর্কে কিছু পর্যালোচনা করতে সাহায্য করে।
Read more