Object-Oriented Programming (OOP) হল একটি প্রোগ্রামিং প্যারাডাইম যা ডেটা এবং মেথডকে একত্রে একটি একক ইউনিট হিসেবে "অবজেক্ট" তৈরি করতে ব্যবহৃত হয়। Java একটি সম্পূর্ণ OOP ভিত্তিক ভাষা, যেখানে ক্লাস, অবজেক্ট, ইনহেরিট্যান্স, পলিমরফিজম, অ্যাবস্ট্রাকশন এবং এনক্যাপসুলেশন ব্যবহার করা হয়। OOP কনসেপ্টের মাধ্যমে কোডকে আরও বেশি মডুলার, রিইউজেবল এবং সিস্টেমকে আরও ভালভাবে ম্যানেজ করা যায়।
Java OOPs Concepts Examples:
1. Class and Object
Class হলো একটি ব্লুপ্রিন্ট বা টেমপ্লেট, যেখানে অবজেক্ট তৈরি করার জন্য সমস্ত প্রোপার্টি (অ্যাট্রিবিউট) এবং মেথড ডিফাইন করা হয়। Object হলো ক্লাসের একটি ইন্সট্যান্স (অথবা কপি)।
// Class Definition
class Car {
// Attributes
String make;
String model;
int year;
// Method to display car info
void displayInfo() {
System.out.println("Make: " + make);
System.out.println("Model: " + model);
System.out.println("Year: " + year);
}
}
public class Main {
public static void main(String[] args) {
// Creating objects of the class
Car car1 = new Car();
car1.make = "Toyota";
car1.model = "Corolla";
car1.year = 2020;
Car car2 = new Car();
car2.make = "Honda";
car2.model = "Civic";
car2.year = 2022;
// Calling method
car1.displayInfo();
car2.displayInfo();
}
}
Output:
Make: Toyota
Model: Corolla
Year: 2020
Make: Honda
Model: Civic
Year: 2022
2. Inheritance (উত্তরাধিকার)
Inheritance একটি OOP কনসেপ্ট যা একটি ক্লাসের বৈশিষ্ট্য এবং আচরণ (অ্যাট্রিবিউট এবং মেথড) অন্য ক্লাসে উত্তরাধিকারী হিসেবে প্রাপ্তি। এর মাধ্যমে কোড পুনঃব্যবহারযোগ্য হয়।
// Parent Class
class Animal {
void sound() {
System.out.println("Animals make sounds");
}
}
// Child Class inheriting Animal
class Dog extends Animal {
// Overriding the method
void sound() {
System.out.println("Dog barks");
}
}
public class Main {
public static void main(String[] args) {
// Creating an object of Dog class
Dog dog = new Dog();
dog.sound(); // Will call the overridden method
}
}
Output:
Dog barks
Explanation: Dog ক্লাস Animal ক্লাস থেকে বৈশিষ্ট্য (method sound()) গ্রহণ করেছে এবং সেটা পুনরায় সংজ্ঞায়িত (override) করেছে।
3. Polymorphism (পলিমরফিজম)
Polymorphism হল OOP-এর একটি শক্তিশালী বৈশিষ্ট্য যেখানে একটি মেথড বা অপারেশন বিভিন্ন উপায়ে আচরণ করতে পারে।
// Parent Class
class Animal {
void sound() {
System.out.println("Animals make sounds");
}
}
// Child Class 1
class Dog extends Animal {
void sound() {
System.out.println("Dog barks");
}
}
// Child Class 2
class Cat extends Animal {
void sound() {
System.out.println("Cat meows");
}
}
public class Main {
public static void main(String[] args) {
Animal animal1 = new Dog(); // Upcasting
Animal animal2 = new Cat(); // Upcasting
// Polymorphism - Method Overriding
animal1.sound(); // Will call Dog's sound method
animal2.sound(); // Will call Cat's sound method
}
}
Output:
Dog barks
Cat meows
Explanation: এখানে Method Overriding এর মাধ্যমে, একই নামের sound() মেথড বিভিন্ন ক্লাসে ভিন্ন ভিন্ন আচরণ প্রদর্শন করছে।
4. Abstraction (অ্যাবস্ট্রাকশন)
Abstraction হল একটি কনসেপ্ট যেখানে আপনি শুধুমাত্র একটি অবজেক্টের গুরুত্বপূর্ণ বৈশিষ্ট্য প্রকাশ করেন এবং অন্যান্য অপ্রয়োজনীয় তথ্য লুকিয়ে রাখেন।
// Abstract Class
abstract class Animal {
// Abstract method (does not have a body)
abstract void sound();
// Regular method
void sleep() {
System.out.println("This animal is sleeping");
}
}
// Concrete class (inherits Animal)
class Dog extends Animal {
// Implementing the abstract method
void sound() {
System.out.println("Dog barks");
}
}
public class Main {
public static void main(String[] args) {
Animal myDog = new Dog();
myDog.sound(); // Calls Dog's sound method
myDog.sleep(); // Calls the regular method from Animal
}
}
Output:
Dog barks
This animal is sleeping
Explanation: এখানে Animal ক্লাসটি অ্যাবস্ট্রাক্ট (abstract) এবং এটি sound() মেথডের একটি সাধারণ ইন্টারফেস প্রদান করেছে, যা Dog ক্লাসে পূর্ণরূপে বাস্তবায়িত (implemented) হয়েছে।
5. Encapsulation (এনক্যাপসুলেশন)
Encapsulation হল OOP-এর একটি মূল ধারণা যেখানে অবজেক্টের ভিতরের স্টেট (অ্যাট্রিবিউট) এবং আচরণ (মেথড) একত্রে থাকে, এবং স্টেট অ্যাক্সেস করার জন্য শুধুমাত্র নির্দিষ্ট মেথড দেওয়া হয়। এটি ডেটার সুরক্ষা নিশ্চিত করে।
class Account {
// Private attribute (encapsulated)
private double balance;
// Public method to access the private attribute
public double getBalance() {
return balance;
}
// Public method to modify the private attribute
public void deposit(double amount) {
if (amount > 0) {
balance += amount;
}
}
// Public method to modify the private attribute
public void withdraw(double amount) {
if (amount <= balance) {
balance -= amount;
} else {
System.out.println("Insufficient funds");
}
}
}
public class Main {
public static void main(String[] args) {
Account account = new Account();
account.deposit(500); // Deposit money
System.out.println("Balance: " + account.getBalance());
account.withdraw(200); // Withdraw money
System.out.println("Balance after withdrawal: " + account.getBalance());
account.withdraw(400); // Insufficient funds
}
}
Output:
Balance: 500.0
Balance after withdrawal: 300.0
Insufficient funds
Explanation: balance অ্যাট্রিবিউটটি private দিয়ে এনক্যাপসুলেট করা হয়েছে এবং এই অ্যাট্রিবিউটটি পরিবর্তন করতে deposit() এবং withdraw() মেথড ব্যবহার করা হচ্ছে। এটি ডেটার সুরক্ষা নিশ্চিত করে, এবং অবজেক্টের ভিতরের ডেটা শুধুমাত্র নির্দিষ্ট মেথড দ্বারা অ্যাক্সেসযোগ্য হয়।
Object-Oriented Programming (OOP) এর মূল ধারণাগুলি - Encapsulation, Abstraction, Inheritance, Polymorphism - Java তে খুবই শক্তিশালী এবং কার্যকরী। এই ধারণাগুলি ব্যবহার করে আপনি প্রোগ্রামিং কোডকে আরো modular, maintainable, এবং scalable তৈরি করতে পারেন।
- Encapsulation ডেটার সুরক্ষা এবং কোডের উপস্থাপনা সহজ করে।
- Abstraction প্রোগ্রামের জটিলতা কমাতে সাহায্য করে।
- Inheritance কোড পুনঃব্যবহারযোগ্য এবং সম্প্রসারণযোগ্য করে তোলে।
- Polymorphism একাধিক পদ্ধতির মধ্যে একটি সাধারণ ইন্টারফেস প্রদান করে।
Java তে OOP ব্যবহার করলে কোড আরো পরিষ্কার, সুরক্ষিত এবং ব্যবস্থাপনাযোগ্য হয়ে ওঠে।
Java Class এবং Object হল Object-Oriented Programming (OOP) এর দুটি মৌলিক উপাদান। Class হল একটি ব্লুপ্রিন্ট বা টেমপ্লেট যা Object তৈরি করতে ব্যবহৃত হয়। একে সাধারণত ডেটা এবং কার্যাবলী (methods) একত্রিত করার জন্য ব্যবহার করা হয়।
- Class: এটি একটি ডাটা টাইপ যা পদ্ধতি এবং ক্ষেত্রের (fields) সংজ্ঞা দেয়। এটি অবজেক্ট তৈরি করার জন্য ব্যবহৃত একটি টেমপ্লেট।
- Object: এটি একটি ইনস্ট্যান্স যা ক্লাসের ডেটা (fields) এবং মেথডের কার্যকলাপের (methods) বৈশিষ্ট্য ধারণ করে।
Java Class এবং Object Example:
এই উদাহরণে একটি Class তৈরি করা হবে এবং তার পর একটি Object এর মাধ্যমে সেই Class এর মেথড এবং ফিল্ড অ্যাক্সেস করা হবে।
Step 1: Class তৈরি করা
// Person.java - A simple class with fields and methods
public class Person {
// Fields (Attributes)
String name;
int age;
// Constructor to initialize the object
public Person(String name, int age) {
this.name = name;
this.age = age;
}
// Method to display person's information
public void introduce() {
System.out.println("Hello, my name is " + name + " and I am " + age + " years old.");
}
// Method to get the age of the person
public int getAge() {
return age;
}
// Method to set a new age
public void setAge(int newAge) {
age = newAge;
}
}
Step 2: Object তৈরি এবং Class এর মেথড ব্যবহার করা
public class Main {
public static void main(String[] args) {
// Creating an object of the Person class
Person person1 = new Person("John", 25);
// Accessing object's method and field
person1.introduce(); // Calling the introduce method
// Modifying the person's age using setAge method
person1.setAge(30);
// Displaying the updated information
System.out.println("Updated age: " + person1.getAge()); // Calling the getAge method
// Creating another object of the Person class
Person person2 = new Person("Alice", 28);
person2.introduce(); // Calling the introduce method for the second object
}
}
কোড ব্যাখ্যা:
- Class তৈরি করা (Person class):
Personনামক একটি ক্লাস তৈরি করা হয়েছে, যেখানে দুটি ফিল্ড (fields) আছে:String name: ব্যক্তির নামint age: ব্যক্তির বয়স
- একটি কনস্ট্রাক্টর
Person(String name, int age)তৈরি করা হয়েছে যা object initialization এর সময় name এবং age ফিল্ডকে ইনিশিয়ালাইজ করে। - Method:
introduce(): এটি ব্যক্তির নাম এবং বয়স প্রিন্ট করে।getAge(): এটি ব্যক্তির বয়স রিটার্ন করে।setAge(int newAge): এটি ব্যক্তির বয়স আপডেট করে।
- Object তৈরি এবং ব্যবহার (Main class):
- Object Creation:
Person person1 = new Person("John", 25);এখানেperson1নামক একটি object তৈরি হয়েছে, এবং এটিPersonক্লাসের ইনস্ট্যান্স। - Method Access:
person1.introduce();এই লাইনটিperson1অবজেক্টেরintroduce()মেথডকে কল করে, যা ব্যক্তির নাম এবং বয়স প্রিন্ট করবে। - Updating Fields:
person1.setAge(30);এই লাইনটিperson1অবজেক্টের বয়স আপডেট করবে। - Object Access for Another Instance: একইভাবে,
person2নামে আরেকটি object তৈরি করা হয়েছে এবংintroduce()মেথডটি ব্যবহার করা হয়েছে।
- Object Creation:
আউটপুট:
Hello, my name is John and I am 25 years old.
Updated age: 30
Hello, my name is Alice and I am 28 years old.
কীভাবে কাজ করে:
person1এবংperson2দুটি আলাদা object যা Person ক্লাসের ইনস্ট্যান্স।- Object-oriented প্রোগ্রামিং পদ্ধতিতে, ক্লাসটি একটি টেমপ্লেট সরবরাহ করে এবং অবজেক্টটি সেই ক্লাসের ভিত্তিতে বাস্তব ডেটা ধারণ করে।
- Method calls:
person1.introduce()এবংperson2.introduce()উভয় ক্ষেত্রেই আলাদা আলাদা অবজেক্টের জন্য মেথড কল করা হয়েছে।
Java তে Class এবং Object হল Object-Oriented Programming (OOP) এর দুটি প্রধান উপাদান। একটি class ডেটা এবং কার্যাবলীকে একত্রিত করে এবং objects সেই class এর বাস্তব ইন্সট্যান্স। এই প্রোগ্রামটি Java তে একটি ক্লাস তৈরি করা এবং তার অবজেক্টের মাধ্যমে ক্লাসের মেথড ও ডেটা অ্যাক্সেস করার প্রাথমিক ধারণা প্রদান করে।
Constructor একটি বিশেষ ধরনের মেথড যা একটি ক্লাসের নতুন অবজেক্ট তৈরি করার সময় স্বয়ংক্রিয়ভাবে কল হয়। এটি সাধারণত অবজেক্টের প্রাথমিক অবস্থা সেট করার জন্য ব্যবহৃত হয়। Java তে দুটি ধরনের কনস্ট্রাক্টর থাকে:
- Default Constructor: যখন কোন কনস্ট্রাক্টর ব্যবহারকারীর দ্বারা নির্দিষ্ট করা হয় না, তখন Java স্বয়ংক্রিয়ভাবে একটি ডিফল্ট কনস্ট্রাক্টর তৈরি করে। এটি কোন প্যারামিটার নেয় না এবং এটি সাধারণত ফিল্ড বা ভেরিয়েবলের ডিফল্ট মান সেট করে।
- Parameterized Constructor: এটি এমন একটি কনস্ট্রাক্টর যা প্যারামিটার নেয় এবং অবজেক্ট তৈরি করার সময় প্যারামিটারগুলির মান সেট করার সুযোগ প্রদান করে।
Default Constructor এবং Parameterized Constructor এর উদাহরণ:
1. Default Constructor Example
class Car {
String model;
int year;
// Default Constructor
public Car() {
model = "Unknown";
year = 2020;
}
public void display() {
System.out.println("Model: " + model);
System.out.println("Year: " + year);
}
}
public class DefaultConstructorExample {
public static void main(String[] args) {
// Creating an object using the default constructor
Car myCar = new Car();
myCar.display();
}
}
Explanation:
- Default Constructor:
public Car()এই কনস্ট্রাক্টরটি প্যারামিটার ছাড়া কনস্ট্রাক্টর এবং এটি ফিল্ডmodelএবংyearএর ডিফল্ট মান সেট করে। model = "Unknown"এবংyear = 2020দিয়ে ডিফল্ট মান দেওয়া হয়েছে।
Output:
Model: Unknown
Year: 2020
2. Parameterized Constructor Example
class Car {
String model;
int year;
// Parameterized Constructor
public Car(String model, int year) {
this.model = model;
this.year = year;
}
public void display() {
System.out.println("Model: " + model);
System.out.println("Year: " + year);
}
}
public class ParameterizedConstructorExample {
public static void main(String[] args) {
// Creating an object using the parameterized constructor
Car myCar = new Car("Toyota Corolla", 2022);
myCar.display();
// Another object with different values
Car anotherCar = new Car("Honda Civic", 2021);
anotherCar.display();
}
}
Explanation:
- Parameterized Constructor:
public Car(String model, int year)এই কনস্ট্রাক্টরটি দুটি প্যারামিটার নেয় (মডেল এবং বছর) এবং অবজেক্ট তৈরির সময় এই মানগুলি সেট করে। this.modelএবংthis.year: এই কনস্ট্রাক্টরের মধ্যেthisকিওয়ার্ড ব্যবহার করে বর্তমান অবজেক্টের ফিল্ডের মান সেট করা হয়েছে।
Output:
Model: Toyota Corolla
Year: 2022
Model: Honda Civic
Year: 2021
Constructor Overloading Example
Java তে আপনি Constructor Overloading করতে পারেন, যেখানে একাধিক কনস্ট্রাক্টর একই ক্লাসে থাকে কিন্তু তাদের প্যারামিটার সংখ্যা বা টাইপ ভিন্ন হয়।
class Car {
String model;
int year;
// Default Constructor
public Car() {
model = "Unknown";
year = 2020;
}
// Parameterized Constructor
public Car(String model, int year) {
this.model = model;
this.year = year;
}
public void display() {
System.out.println("Model: " + model);
System.out.println("Year: " + year);
}
}
public class ConstructorOverloadingExample {
public static void main(String[] args) {
// Calling the default constructor
Car myCar1 = new Car();
myCar1.display();
// Calling the parameterized constructor
Car myCar2 = new Car("BMW X5", 2023);
myCar2.display();
}
}
Explanation:
- এখানে দুটি কনস্ট্রাক্টর রয়েছে: একটি default constructor এবং একটি parameterized constructor। আপনি যখন কনস্ট্রাক্টরের মধ্যে একাধিক কনস্ট্রাক্টর তৈরি করেন, তখন Java স্বয়ংক্রিয়ভাবে সঠিক কনস্ট্রাক্টর নির্বাচন করে।
Output:
Model: Unknown
Year: 2020
Model: BMW X5
Year: 2023
Key Points:
- Default Constructor: কোন প্যারামিটার ছাড়াই একটি কনস্ট্রাক্টর যা অবজেক্টের ফিল্ডগুলির জন্য ডিফল্ট মান প্রদান করে।
- Parameterized Constructor: এটি এক বা একাধিক প্যারামিটার নিয়ে অবজেক্ট তৈরি করার সময় ফিল্ডগুলির মান সেট করে।
- Constructor Overloading: একাধিক কনস্ট্রাক্টর একই ক্লাসে থাকে, তবে তাদের প্যারামিটার সংখ্যা বা টাইপ আলাদা থাকে।
Java তে কনস্ট্রাক্টর দুটি প্রধানভাবে ব্যবহৃত হয়: Default Constructor এবং Parameterized Constructor। প্রথমটি অবজেক্ট তৈরি করার সময় ডিফল্ট মান প্রদান করে, এবং দ্বিতীয়টি আপনার প্রদত্ত মান অনুযায়ী অবজেক্ট তৈরি করে। Constructor Overloading এর মাধ্যমে একাধিক কনস্ট্রাক্টর ব্যবহার করা সম্ভব, যাতে আপনি বিভিন্ন ধরনের অবজেক্ট ইনিশিয়ালাইজ করতে পারেন।
Inheritance (উত্তরাধিকার) হল একটি অবজেক্ট-অরিয়েন্টেড প্রোগ্রামিং (OOP) ধারণা, যেখানে একটি ক্লাস অন্য একটি ক্লাসের বৈশিষ্ট্য (প্রপার্টি এবং মেথড) অর্জন করে। Java তে ইনহেরিটেন্স দুটি ধরনের হতে পারে: Single Inheritance এবং Multilevel Inheritance। নিচে এই দুই ধরনের ইনহেরিটেন্সের উদাহরণ দেওয়া হলো।
1. Single Inheritance Example
Single Inheritance হল এমন একটি ইনহেরিটেন্স যেখানে একটি ক্লাস অন্য একটি ক্লাস থেকে বৈশিষ্ট্য (প্রপার্টি এবং মেথড) অর্জন করে।
উদাহরণ: Single Inheritance
// Superclass (Parent Class)
class Animal {
// সাধারণ বৈশিষ্ট্য (Property)
String name;
// সাধারণ মেথড (Method)
void eat() {
System.out.println("This animal eats food.");
}
}
// Subclass (Child Class)
class Dog extends Animal {
// বাচ্চা ক্লাসে নতুন বৈশিষ্ট্য এবং মেথড
void bark() {
System.out.println("The dog barks.");
}
}
public class SingleInheritanceExample {
public static void main(String[] args) {
// বাচ্চা ক্লাসের অবজেক্ট তৈরি করা
Dog dog = new Dog();
// Superclass (Parent) এর মেথড ব্যবহার
dog.eat();
// Subclass (Child) এর মেথড ব্যবহার
dog.bark();
}
}
আউটপুট:
This animal eats food.
The dog barks.
ব্যাখ্যা:
Animalহল সুপার ক্লাস (প্যারেন্ট ক্লাস), যার মধ্যেeat()মেথড রয়েছে।Dogহল সাব ক্লাস (চাইল্ড ক্লাস), যাAnimalথেকেeat()মেথড এবংnameপ্রপার্টি ইনহেরিট করেছে এবং নিজের একটি নতুন মেথডbark()যুক্ত করেছে।Dogক্লাস একটি ইনস্ট্যান্স তৈরি করেছে এবং প্যারেন্ট ক্লাসের বৈশিষ্ট্য এবং মেথড ব্যবহার করেছে।
2. Multilevel Inheritance Example
Multilevel Inheritance হল এমন একটি ইনহেরিটেন্স যেখানে একটি ক্লাস অন্য ক্লাস থেকে ইনহেরিট করে, এবং সেই ইনহেরিট করা ক্লাস আবার অন্য ক্লাস থেকে ইনহেরিট করে। অর্থাৎ, এটি একাধিক স্তরের ইনহেরিটেন্স।
উদাহরণ: Multilevel Inheritance
// Superclass (Grandparent Class)
class Animal {
void eat() {
System.out.println("This animal eats food.");
}
}
// Intermediate class (Parent Class)
class Dog extends Animal {
void bark() {
System.out.println("The dog barks.");
}
}
// Subclass (Child Class)
class Puppy extends Dog {
void sleep() {
System.out.println("The puppy sleeps.");
}
}
public class MultilevelInheritanceExample {
public static void main(String[] args) {
// Puppy ক্লাসের অবজেক্ট তৈরি করা
Puppy puppy = new Puppy();
// Grandparent, Parent, এবং Child ক্লাসের মেথড ব্যবহার
puppy.eat(); // Animal ক্লাস থেকে ইনহেরিট করা মেথড
puppy.bark(); // Dog ক্লাস থেকে ইনহেরিট করা মেথড
puppy.sleep(); // Puppy ক্লাসের মেথড
}
}
আউটপুট:
This animal eats food.
The dog barks.
The puppy sleeps.
ব্যাখ্যা:
Animalহল সুপার ক্লাস (গ্র্যান্ডপ্যারেন্ট ক্লাস), যার মধ্যেeat()মেথড রয়েছে।Dogহল ইন্টারমিডিয়েট ক্লাস (প্যারেন্ট ক্লাস), যাAnimalথেকেeat()মেথড ইনহেরিট করেছে এবং নিজের একটি নতুন মেথডbark()যোগ করেছে।Puppyহল সাব ক্লাস (চাইল্ড ক্লাস), যাDogথেকেbark()মেথড ইনহেরিট করেছে এবং নিজের নতুন মেথডsleep()যোগ করেছে।Puppyক্লাসের অবজেক্টটিeat(),bark(), এবংsleep()মেথডগুলো ব্যবহার করতে পারছে।
বিভিন্ন ধরনের ইনহেরিটেন্স:
- Single Inheritance:
- একটি ক্লাস অন্য একটি ক্লাস থেকে ইনহেরিট করে।
- উদাহরণ:
class Dog extends Animal {}
- Multilevel Inheritance:
- একাধিক ক্লাসের মধ্যে ইনহেরিটেন্স ঘটে, যেখানে একটি ক্লাস অন্য একটি ক্লাস থেকে ইনহেরিট করে এবং সেই ইনহেরিট করা ক্লাস আবার অন্য একটি ক্লাস থেকে ইনহেরিট করে।
- উদাহরণ:
class Puppy extends Dog {}
- Single Inheritance: একটি ক্লাস সরাসরি একটি অন্য ক্লাস থেকে বৈশিষ্ট্য অর্জন করে।
- Multilevel Inheritance: একাধিক ক্লাসের মধ্যে ইনহেরিটেন্সের ধারাবাহিকতা থাকে, যেখানে একটি ক্লাস অন্য একটি ক্লাস থেকে ইনহেরিট করে, এবং সেই ক্লাস আবার অন্য একটি ক্লাস থেকে ইনহেরিট করে।
এই দুই ধরনের ইনহেরিটেন্স Java-তে কোড পুনঃব্যবহার এবং ওভারলোডিংয়ের ক্ষেত্রে বেশ গুরুত্বপূর্ণ এবং সহজে কোড পরিচালনা করতে সাহায্য করে।
Method Overloading এবং Method Overriding হল দুইটি গুরুত্বপূর্ণ কনসেপ্ট যা Polymorphism এর অধীনে কাজ করে।
- Method Overloading: এটি একই ক্লাসে একাধিক মেথডের ঘোষণা করা হয় যার সিগনেচার (method signature) আলাদা হয়, যেমন মেথডের নাম একই থাকে কিন্তু প্যারামিটার (parameter) ভিন্ন হয়।
- Method Overriding: এটি কেবল inheritance প্রক্রিয়ায় ঘটে। এটি superclass এর মেথডকে subclass তে পুনঃসংজ্ঞায়িত (redefine) করতে ব্যবহৃত হয়। এখানে মেথডের নাম, রিটার্ন টাইপ এবং প্যারামিটার অবশ্যই সমান থাকতে হবে।
1. Method Overloading (মেথড ওভারলোডিং)
Method Overloading হল একই মেথড নামের জন্য ভিন্ন ভিন্ন প্যারামিটার ব্যবহার করা। এটি রানটাইমের আগে কম্পাইল টাইমে ঘটে।
উদাহরণ: Method Overloading
class Calculator {
// মেথড ওভারলোডিং - দুটি পূর্ণসংখ্যার যোগফল
public int add(int a, int b) {
return a + b;
}
// মেথড ওভারলোডিং - তিনটি পূর্ণসংখ্যার যোগফল
public int add(int a, int b, int c) {
return a + b + c;
}
// মেথড ওভারলোডিং - দুটি দশমিক মানের যোগফল
public double add(double a, double b) {
return a + b;
}
}
public class MethodOverloadingExample {
public static void main(String[] args) {
Calculator calc = new Calculator();
// মেথড ওভারলোডিং কল
System.out.println("Sum of 2 numbers: " + calc.add(10, 20)); // প্যারামিটার (int, int)
System.out.println("Sum of 3 numbers: " + calc.add(10, 20, 30)); // প্যারামিটার (int, int, int)
System.out.println("Sum of 2 decimal numbers: " + calc.add(10.5, 20.5)); // প্যারামিটার (double, double)
}
}
আউটপুট:
Sum of 2 numbers: 30
Sum of 3 numbers: 60
Sum of 2 decimal numbers: 31.0
ব্যাখ্যা:
- এখানে
addনামক একাধিক মেথড রয়েছে, কিন্তু তাদের প্যারামিটার ভিন্ন। - প্যারামিটার অনুসারে সঠিক মেথডটি কল হবে।
2. Method Overriding (মেথড ওভাররাইডিং)
Method Overriding হল inheritance এর মধ্যে যেখানে subclass (পর্ণপ্রাপ্ত ক্লাস) তার superclass এর মেথডের আচরণ পরিবর্তন করে (redefine)।
উদাহরণ: Method Overriding
class Animal {
// Superclass মেথড
public void sound() {
System.out.println("Animal makes a sound");
}
}
class Dog extends Animal {
// Method Overriding: Subclass মেথড
@Override
public void sound() {
System.out.println("Dog barks");
}
}
public class MethodOverridingExample {
public static void main(String[] args) {
Animal animal = new Animal();
animal.sound(); // Animal এর মেথড কল হবে
Dog dog = new Dog();
dog.sound(); // Dog এর মেথড কল হবে
}
}
আউটপুট:
Animal makes a sound
Dog barks
ব্যাখ্যা:
Animalক্লাসে একটিsound()মেথড রয়েছে, যাDogক্লাসে override করা হয়েছে।@Overrideঅ্যানোটেশনটি ব্যবহার করা হয়েছে যা নিশ্চিত করে যে মেথডটি সঠিকভাবে override করা হচ্ছে।animal.sound();এAnimalক্লাসেরsound()মেথড কল হচ্ছে, এবংdog.sound();এDogক্লাসেরsound()মেথড কল হচ্ছে।
3. Method Overloading এবং Overriding এর পার্থক্য
| বিষয় | Method Overloading | Method Overriding |
|---|---|---|
| অবস্থান | একই ক্লাসে (Same Class) | superclass এবং subclass এর মধ্যে (Superclass and Subclass) |
| মেথড সিগনেচার | প্যারামিটার ভিন্ন হতে হবে (parameters must be different) | প্যারামিটার এবং রিটার্ন টাইপ একই থাকতে হবে (must have same parameters and return type) |
| কখন ঘটে | কম্পাইল টাইমে (Compile-time polymorphism) | রানটাইম টাইমে (Runtime polymorphism) |
| কিভাবে কাজ করে | একই নামের একাধিক মেথড, কিন্তু প্যারামিটার ভিন্ন (Same method name but different parameters) | superclass এর মেথডকে subclass এ override (Redefine the superclass method in subclass) |
- Method Overloading কম্পাইল টাইম polymorphism হিসাবে কাজ করে, যেখানে মেথডের নাম একই থাকে কিন্তু প্যারামিটার ভিন্ন হয়।
- Method Overriding রানটাইম polymorphism হিসাবে কাজ করে, যেখানে subclass superclass এর মেথডের আচরণ পরিবর্তন করে।
এই কনসেপ্টগুলি Java প্রোগ্রামিং এর গুরুত্বপূর্ণ অংশ এবং এগুলি ব্যবহার করে আরও শক্তিশালী এবং নমনীয় কোড লিখতে সাহায্য পাওয়া যায়।
Encapsulation (এনক্যাপসুলেশন) হল একটি অবজেক্ট অরিয়েন্টেড প্রোগ্রামিং (OOP) কনসেপ্ট যেখানে ক্লাসের ভেরিয়েবলগুলিকে private ঘোষণা করা হয় এবং তাদের মান নির্ধারণ বা পুনরুদ্ধার করার জন্য getter এবং setter মেথড তৈরি করা হয়। এটি data hiding এর একটি অংশ, যেখানে ক্লাসের অভ্যন্তরীণ ডেটা বাইরে থেকে সরাসরি অ্যাক্সেস করা সম্ভব হয় না। এই পদ্ধতি ডেটাকে সুরক্ষিত এবং নিয়ন্ত্রিত উপায়ে অ্যাক্সেস করতে সাহায্য করে।
Encapsulation এর সুবিধা:
- Data Hiding: ডেটাকে অ্যাক্সেস করার জন্য প্রপার মেথড ব্যবহার করা হয়, তাই বাইরের কোড থেকে সরাসরি ডেটা পরিবর্তন করা যায় না।
- Control Over Data: getter এবং setter মেথড ব্যবহার করে ডেটার মান নিয়ন্ত্রণ করা যায়, যেমন একটি ভেরিয়েবলের মান সেট করার আগে ভ্যালিডেশন চেক করা।
- Easier Maintenance: কোড পরিবর্তন করার সময় বাহ্যিক কোডের উপর প্রভাব পড়বে না।
উদাহরণ: Encapsulation এবং Getter/Setter মেথড
// Class that demonstrates Encapsulation
public class Person {
// Private fields (Data Hiding)
private String name;
private int age;
// Getter method for name
public String getName() {
return name;
}
// Setter method for name
public void setName(String name) {
this.name = name;
}
// Getter method for age
public int getAge() {
return age;
}
// Setter method for age
public void setAge(int age) {
if (age > 0) { // Validation check
this.age = age;
} else {
System.out.println("Age cannot be negative or zero.");
}
}
// Method to display Person's details
public void displayPersonInfo() {
System.out.println("Name: " + name);
System.out.println("Age: " + age);
}
}
public class EncapsulationExample {
public static void main(String[] args) {
// Create a Person object
Person person = new Person();
// Using setter methods to set values
person.setName("John Doe");
person.setAge(30);
// Using getter methods to access values
System.out.println("Name: " + person.getName());
System.out.println("Age: " + person.getAge());
// Displaying the Person info using a method
person.displayPersonInfo();
// Invalid age (negative value) - Demonstrates validation in setter
person.setAge(-5); // This will not change the age as it's invalid
}
}
কোডের ব্যাখ্যা:
- Private Fields:
nameএবংageফিল্ডগুলো private হিসেবে ডিক্লেয়ার করা হয়েছে, যা বাইরের কোড থেকে সরাসরি অ্যাক্সেস করা যাবে না। এটি data hiding নিশ্চিত করে। - Getter Methods:
getName()এবংgetAge()মেথডগুলো ব্যবহার করে আমরাnameএবংageফিল্ডের মান পেতে পারি। এই মেথডগুলি public হওয়ায় বাইরের কোড থেকে ডেটা অ্যাক্সেস করা সম্ভব হয়, তবে direct access করা যায় না। - Setter Methods:
setName()এবংsetAge()মেথডগুলো ব্যবহার করেnameএবংageফিল্ডের মান সেট করা যায়।setAge()মেথডে একটি validation চেক রয়েছে, যা নিশ্চিত করে যে বয়স নেতিবাচক বা শূন্য হতে পারে না। - Data Validation:
setAge()মেথডের মধ্যে validation চেক করা হয়েছে, যাতে কোনো অবৈধ মান (যেমন নেতিবাচক বয়স) সেট করা না হয়।
আউটপুট:
Name: John Doe
Age: 30
Name: John Doe
Age: 30
Name: John Doe
Age: 30
Age cannot be negative or zero.
- Encapsulation হল একটি খুবই গুরুত্বপূর্ণ OOP ধারণা, যা ডেটা গোপনীয়তা (data hiding) এবং নিয়ন্ত্রণ (control) নিশ্চিত করতে সাহায্য করে।
- Getter/Setter মেথড ব্যবহার করে আপনি ক্লাসের private ভেরিয়েবলগুলোর মান অ্যাক্সেস এবং সেট করতে পারেন। এই মেথডগুলির মাধ্যমে ডেটার উপর সম্পূর্ণ নিয়ন্ত্রণ পাওয়া যায়, যেমন ডেটা ভ্যালিডেশন।
- এই পদ্ধতি আপনার প্রোগ্রামকে নিরাপদ এবং রক্ষণাবেক্ষণের জন্য সহজ করে তোলে।
Read more