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

অবজেক্ট

জাভা বস্তুর পাশাপাশি বাস্তব-বিশ্বের বস্তুর দুটি বৈশিষ্ট্য রয়েছে: রাষ্ট্র এবং আচরণ।

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

এনক্যাপসুলেশন

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

এটি কিভাবে জাভাতে কাজ করে:

  1. ক্ষেত্রগুলি ব্যক্তিগত করা হয়
  2. একটি ক্লাসের প্রতিটি ক্ষেত্র দুটি বিশেষ পদ্ধতি পায়: একটি গেটার এবং একটি সেটার৷ গেটার পদ্ধতি ক্ষেত্রের মান ফেরত দেয়। সেটার পদ্ধতি আপনাকে একটি পরোক্ষ কিন্তু অনুমোদিত উপায়ে ক্ষেত্রের মান পরিবর্তন করতে দেয়।

জাভা কোডে এনক্যাপসুলেশনের উদাহরণ:


public class Student {
private int age;
private String name;

public int getAge() {
return age;
}

public void setAge(int age) {
this.age = age;
}

public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}

public class Test{
public static void main(String[] args) {
Student firstStudent = new Student();
firstStudent.setName("John");
// The name field is private, so you can no longer do this:  firstStudent.name = "John"; 
}
}

কেন আপনি encapsulation ব্যবহার করা উচিত?

প্রধান কারণ হল আপনার কোড পরিবর্তন করা সহজ করা। কল্পনা করুন আপনার কাছে একটি হকি স্কুলের জন্য একটি আবেদন রয়েছে এবং সেখানে দুটি ক্ষেত্র সহ একটি হকি স্টুডেন্ট ক্লাস রয়েছে যেটিতে ছাত্রের নাম এবং বয়স সংরক্ষণ করা হয় যখন সে স্কুলে ভর্তি হয়েছিল। এটার মতো কিছু:

public class HockeyStudent {
public String name;
public  int ageOfEnrollment;
}
ageOfEnrollment ক্ষেত্রটি সর্বজনীন, কোন গেটার বা সেটার্স নেই... এই ক্লাসটি অন্যান্য অনেক শ্রেণী দ্বারা ব্যবহৃত হয়, এবং কিছু বিকাশকারী সিদ্ধান্ত না নেওয়া পর্যন্ত সবকিছু ঠিক ছিল যে একটি একক int ক্ষেত্র যথেষ্ট নয়। একটি দলে কিছু হকি খেলোয়াড় তাদের সমবয়সীদের চেয়ে প্রায় এক বছরের বড়, তাই তাদের জন্মের মাসের উপর নির্ভর করে তাদের দুটি গ্রুপে বিভক্ত করা আরও সুবিধাজনক হবে। সুতরাং ageOfEnrollment ক্ষেত্রটি একটি int অ্যারে (int[][]) এ পরিবর্তন করা উচিত : প্রথম সংখ্যাটি পুরো বছরের জন্য এবং দ্বিতীয়টি মাসের জন্য। এখন আপনাকে স্টুডেন্ট ক্লাস ব্যবহার করে এমন সমস্ত কোড রিফ্যাক্টর করতে হবে ! কিন্তু আপনার বয়স যদি তালিকাভুক্ত হয়ক্ষেত্রটি ব্যক্তিগত এবং আপনার কাছে গেটার এবং সেটার্স আছে, তাহলে সবকিছু সহজ। যদি একজন শিক্ষার্থীর বয়স নির্ধারণের প্রয়োজনীয়তা পরিবর্তিত হয়, তাহলে শুধু setAgeOfEnrollment() সেটার পদ্ধতিতে যুক্তিটি আপডেট করুন এবং আপনার ক্লাসগুলি কোনো সমস্যা ছাড়াই শিক্ষার্থীর ব্যবহার চালিয়ে যেতে পারে ! এই উদাহরণটি কিছুটা কল্পিত, তবে আমি আশা করি এটি ব্যাখ্যা করে যে কেন এনক্যাপসুলেশন ব্যবহার করা একটি দুর্দান্ত ধারণা।

উত্তরাধিকার

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

এটি কিভাবে জাভাতে কাজ করে:

  1. প্যারেন্ট ক্লাস তৈরি করুন।
  2. এক্সটেন্ডস কীওয়ার্ড ব্যবহার করে চাইল্ড ক্লাস তৈরি করুন ।
  3. চাইল্ড ক্লাসের কনস্ট্রাক্টরে, পিতামাতার ক্ষেত্র সেট করতে super(parentField1, parentField2, ...) পদ্ধতি ব্যবহার করুন।

কনস্ট্রাক্টর হল একটি বিশেষ পদ্ধতি যা একটি নতুন তৈরি করা বস্তুকে শুরু করতে ব্যবহৃত হয়। একটি কনস্ট্রাক্টরের ক্লাসের নামের মতো একই নাম রয়েছে। দুই ধরনের কনস্ট্রাক্টর আছে: ডিফল্ট (নো-আর্গ কনস্ট্রাক্টর) এবং প্যারামিটারাইজড কনস্ট্রাক্টর। একটি ক্লাসে কমপক্ষে একটি কনস্ট্রাক্টর থাকতে হবে (অন্যান্য কনস্ট্রাক্টরকে সংজ্ঞায়িত করা না থাকলে এটিতে ডিফল্ট কনস্ট্রাক্টর থাকে) এবং এতে অনেকগুলি থাকতে পারে।

আপনি যখনই একটি নতুন অবজেক্ট তৈরি করেন, আপনি এটির কনস্ট্রাক্টরকে কল করেন। উপরের উদাহরণে, আপনি এই লাইনে এটি করেন:


Student firstStudent = new Student();

আপনি স্টুডেন্ট ক্লাসের ডিফল্ট কনস্ট্রাক্টরকে কল করতে নতুন কীওয়ার্ড ব্যবহার করেন: tudent()

কিছু নিয়ম:

  1. একটি ক্লাসে শুধুমাত্র একজন অভিভাবক থাকতে পারেন।
  2. একটি অভিভাবক শ্রেণীতে অনেক শিশু ক্লাস থাকতে পারে।
  3. একটি শিশু শ্রেণীর নিজস্ব শিশু ক্লাস থাকতে পারে।

জাভা কোডে উত্তরাধিকারের উদাহরণ

আসুন একটি ফোন ক্লাস তৈরি করি।

public class Phone {
    int price;
    double weight;

// Constructor
public Phone(int price, double weight) {
        this.price = price;
        this.weight = weight;
    }

    void orderPhone(){
        System.out.println("Ordering phone...");
    }
}
অবশ্যই, বিভিন্ন ধরণের ফোন রয়েছে, তাই আসুন দুটি চাইল্ড ক্লাস তৈরি করি: একটি অ্যান্ড্রয়েড ফোনের জন্য এবং দ্বিতীয়টি আইফোনের জন্য। তারপরে আমরা কিছু ক্ষেত্র এবং পদ্ধতি যোগ করব যা অভিভাবকের কাছে নেই। এবং আমরা super() ব্যবহার করব কনস্ট্রাক্টরকে কল করার জন্য প্যারেন্ট ক্লাসের ক্ষেত্রগুলি শুরু করতে।

জাভাতে উত্তরাধিকারের উদাহরণ


public class Android extends Phone {

// Some new fields     
String androidVersion;
int screenSize;

    String secretDeviceCode;

// Constructor 
    public Android(int price, double weight, String androidVersion, int screenSize, String secretDeviceCode) {
        super(price, weight); // Android inherits Phone’s fields

        //this - reference to the current object
        //super - reference to the parent object

        this.androidVersion = androidVersion;
        this.screenSize = screenSize;
        this.secretDeviceCode = secretDeviceCode;
    }

	// New Android-specific method, does not exist in the Phone class 
    void installNewAndroidVersion() {
        System.out.println("installNewAndroidVersion invoked...");

    }

}

public class IPhone extends Phone {
   
    boolean fingerPrint;

    public IPhone(int price, double weight, boolean fingerPrint) {
        super(price, weight);
        System.out.println("IPhone constructor was invoked...");
        this.fingerPrint = fingerPrint;
    }

    void deleteIPhoneFromDb() {
        System.out.println("deleteIPhoneFromDb invoked...");
    }

@Override // This is about polymorphism, see below
void orderPhone(){
        System.out.println("Ordering my new iPhone and deleting the old one...");
    }
}
সুতরাং, পুনরাবৃত্তি করুন: জাভাতে, ইনহেরিট্যান্স আপনাকে চাইল্ড ক্লাস সহ একটি ক্লাস প্রসারিত করতে দেয় যা প্যারেন্ট ক্লাসের ক্ষেত্র এবং পদ্ধতিগুলিকে উত্তরাধিকারী করে। কোড পুনঃব্যবহারযোগ্যতা অর্জনের এটি একটি চমৎকার উপায়।

পলিমরফিজম

পলিমরফিজম হল একটি বস্তুর রূপান্তর করার ক্ষমতা, বিভিন্ন রূপ ধারণ করে বা ভিন্ন উপায়ে অভিনয় করে। জাভাতে, পলিমরফিজম সাধারণত ঘটে যখন একটি শিশু শ্রেণীর বস্তুর উল্লেখ করার জন্য একটি অভিভাবক শ্রেণীর রেফারেন্স ব্যবহার করা হয়।

এর অর্থ কী এবং এটি জাভাতে কীভাবে কাজ করে:

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

পদ্ধতি ওভাররাইডিং

আপনি একটি শিশু শ্রেণীতে একটি অভিভাবক শ্রেণীর পদ্ধতি ওভাররাইড করতে পারেন, এটি বিভিন্ন উপায়ে কাজ করতে বাধ্য করে৷ প্লে() মেথড দিয়ে একটি মিউজিশিয়ান প্যারেন্ট ক্লাস তৈরি করি ।

জাভা কোডে পলিমারফিজমের উদাহরণ


   public class Musician {
    String name;
    int age;

    // Default constructor
    public Musician() {
    }

    // Parameterized constructor
    public Musician(String name, int age) {
        this.name = name;
        this.age = age;
    }

    void play() {
        System.out.println("I am playing my instrument...");
    }
}
বিভিন্ন সঙ্গীতজ্ঞ বিভিন্ন যন্ত্র ব্যবহার করেন। আসুন দুটি শিশু ক্লাস তৈরি করি: পিয়ানোবাদক এবং বেহালাবাদকপলিমরফিজমের জন্য ধন্যবাদ, প্রতিটি প্লে() পদ্ধতির নিজস্ব সংস্করণ চালাবে । ওভাররাইড করার সময়, আপনি @Override টীকা ব্যবহার করতে পারেন, কিন্তু এটি প্রয়োজনীয় নয়।

public class Pianist extends Musician {
    
    String favoritePianoType;

    public Pianist(String name, int age, String favoritePianoType) {
        super(name, age);
        this.favoritePianoType = favoritePianoType;
    }


    @Override
void play(){
        System.out.println("I am playing the piano...");
    }
}
বেহালা বাদক হতে পারে একক বা অর্কেস্ট্রার সদস্য। আমাদের play() পদ্ধতি ওভাররাইড করার সময় এটি বিবেচনা করা যাক ।

public class Violinist extends Musician { 
    boolean isSoloist; 

public Violinist(String name, int age, boolean isSoloist) {
            super(name, age);
            this.isSoloist = isSoloist;
        }


    @Override
void play(){
if (isSoloist) 
        System.out.println("I am playing the violin solo...");
else 
System.out.println("I am playing the violin in an orchestra...");

    }
}
আসুন একটি ডেমো ক্লাস তৈরি করি, যেখানে আমরা তিনটি অবজেক্ট তৈরি করব, পূর্বে তৈরি করা প্রতিটি ক্লাসের একটি করে উদাহরণ। আমরা কী ফলাফল পাই তা দেখব।

public class Demo {
  public static void main(String[] args) {
  Musician musician = new Musician();
  Violinist violinist = new Violinist("John", 32, true);
  Pianist pianist = new Pianist("Glen", 30, "Acoustic"); 

  System.out.println("Musician said:");
  musician.play();
  System.out.println("Violinist said:");
  violinist.play();
  System.out.println("Pianist said:");
  pianist.play();
    }
}
আমরা যা পাই তা এখানে:

Musician said:
I am playing my instrument...
Violinist said:
I am playing the violin solo…
Pianist said:
I am playing the piano...
প্রত্যেক বেহালাবাদক এবং পিয়ানোবাদক একজন সঙ্গীতজ্ঞ, কিন্তু প্রত্যেক সঙ্গীতশিল্পী একজন ভায়োলিস্ট বা পিয়ানোবাদক নন। এর মানে হল যে আপনি যদি একটি নতুন তৈরি করার প্রয়োজন না হয় তবে আপনি সঙ্গীতশিল্পীর খেলার পদ্ধতি ব্যবহার করতে পারেন। অথবা আপনি সুপার কীওয়ার্ড ব্যবহার করে সন্তানের কাছ থেকে পিতামাতার পদ্ধতিতে কল করতে পারেন । আসুন পিয়ানোবাদীর কোডে এটি করি:

public class Pianist extends Musician {

    String favoritePianoType;
    
    @Override
    void play(){
        super.play();
        System.out.println("I am playing the piano...");
    }
}
এখন ডেমো ক্লাসে আমাদের main() মেথডকে কল করা যাক । এখানে ফলাফল:

Musician said:
I am playing my instrument...
Violinist said:
I am playing the violin solo...
Pianist said:
I am playing my instrument...
I am playing the piano...

পদ্ধতি ওভারলোডিং

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

public class Pianist extends Musician {

    String name;
    int age;
    String favoritePianoType;

    @Override
    void play(){
        super.play();
        System.out.println("I am playing the piano...");
    }
    void play(boolean isElectricity){
        if (isElectricity) {
            System.out.println("The electricity is on.");
            System.out.println("I am playing the piano...");
        }
        else System.out.println("I can't play this without electricity.");
    }
}
যাইহোক, আপনি এই পদ্ধতিতে দ্বিতীয় প্লে (বুলিয়ান) পদ্ধতির ভিতরে প্রথম প্লে() পদ্ধতিটি ব্যবহার করতে পারেন:

void play(boolean isElectricity){
        if (isElectricity) {
            System.out.println("The electricity is on.");
            play();
        }
        else System.out.println("I can't play this without electricity.");
    }
আমাদের ওভারলোডিং প্রদর্শন করতে আমাদের ডেমো ক্লাসে কিছু লাইন যোগ করা যাক :

public class Demo {
    public static void main(String[] args) {

        Musician musician = new Musician();
        Violinist violinist = new Violinist("John", 23, true);
        Pianist pianist = new Pianist("Glen", 30, "Acoustic"); 

        System.out.println("Musician said:");
        musician.play();
        System.out.println("Violinist said:");
        violinist.play();
        System.out.println("Pianist said:");
        pianist.play();
        System.out.println("The pianist will now try the electric piano:");
        pianist.play(true);
        System.out.println("The electricity has been shut off. Now when trying the electric piano, the pianist says:");
        pianist.play(false);
    }
}
এখানে ফলাফল আছে:

Musician said:
I am playing my instrument...
Violinist said:
I am playing the violin solo...
Pianist said:
I am playing my instrument...
I am playing the piano...
The pianist will now try the electric piano:
The electricity is on.
I am playing my instrument...
I am playing the piano...
The electricity has been shut off. Now when trying the electric piano, the pianist says:
I can't play this without electricity.
জাভা জানে তার পরামিতি এবং বস্তুর প্রকারের উপর ভিত্তি করে কোন পদ্ধতি ব্যবহার করা উচিত। এটাই পলিমরফিজম।

বিমূর্ততা

যখন আমরা একটি শ্রেণী সংজ্ঞায়িত করি, তখন আমরা কিছুর একটি মডেল তৈরি করার চেষ্টা করছি। উদাহরণস্বরূপ, ধরুন আমরা বিভিন্ন রেসের গাড়ি নিয়ে MyRacer নামে একটি ভিডিও গেম লিখছি। একজন খেলোয়াড় তাদের মধ্যে একটি বেছে নিতে পারে এবং পরে এটি আপডেট করতে পারে বা অন্য একটি কিনতে পারে। তাই… একটি গাড়ী কি? একটি গাড়ি একটি বেশ জটিল জিনিস, কিন্তু যদি আমরা একটি রেসিং ভিডিও গেম তৈরি করার চেষ্টা করি (একটি ড্রাইভিং সিমুলেটরের বিপরীতে), তাহলে আমাদের এটিতে থাকা হাজার হাজার গিয়ার এবং গ্যাসকেটগুলি বর্ণনা করার দরকার নেই৷ আমাদের দরকার এর মডেল, সর্বোচ্চ গতি, চালচলনের বৈশিষ্ট্য, দাম, রঙ... এবং হয়তো এটাই যথেষ্ট। এটি আমাদের গেমের জন্য একটি গাড়ির মডেল। পরে MyRacer 2-এ, ধরুন আমরা এমন টায়ার যুক্ত করার সিদ্ধান্ত নিই যা রাস্তায় পরিচালনাকে প্রভাবিত করে। এখানে মডেলটি ভিন্ন, কারণ আমরা আরও বিশদ যোগ করেছি। দিন' s একটি বস্তুর শুধুমাত্র গুরুত্বপূর্ণ (বা প্রয়োজনীয়) বৈশিষ্ট্যগুলি সনাক্ত করার প্রক্রিয়া হিসাবে ডেটা বিমূর্ততাকে সংজ্ঞায়িত করে এবং কোনও অপ্রাসঙ্গিক বিবরণ উপেক্ষা করে। বিমূর্তকরণের বিভিন্ন স্তর রয়েছে। উদাহরণস্বরূপ, আপনি যদি একটি বাসের যাত্রী হন তবে আপনার বাসটি দেখতে কেমন এবং এটি কোথায় যাচ্ছে তা জানতে হবে, তবে এটি কীভাবে চালাতে হয় তা আপনার জানার দরকার নেই। আপনি যদি একজন বাস চালক হন, তাহলে আপনাকে নতুন বাস কীভাবে তৈরি করতে হবে তা জানার দরকার নেই — আপনাকে কেবল এটি কীভাবে চালাতে হবে তা জানতে হবে। কিন্তু আপনি যদি একজন বাস প্রস্তুতকারক হন, তাহলে আপনাকে বিমূর্ততার নিম্ন স্তরে যেতে হবে, কারণ বাসের নকশার বিশদ বিবরণ আপনার কাছে খুবই গুরুত্বপূর্ণ। আশা করি আমি যা বোঝাতে চাচ্ছি তুমি তা বুঝেছ. আপনার বাস দেখতে কেমন এবং এটি কোথায় যাচ্ছে তা আপনাকে জানতে হবে, তবে এটি কীভাবে চালাতে হবে তা আপনার জানার দরকার নেই। আপনি যদি একজন বাস চালক হন, তাহলে আপনাকে নতুন বাস কীভাবে তৈরি করতে হবে তা জানার দরকার নেই — আপনাকে কেবল এটি কীভাবে চালাতে হবে তা জানতে হবে। কিন্তু আপনি যদি একজন বাস প্রস্তুতকারক হন, তাহলে আপনাকে বিমূর্ততার নিম্ন স্তরে যেতে হবে, কারণ বাসের নকশার বিশদ বিবরণ আপনার কাছে খুবই গুরুত্বপূর্ণ। আশা করি আমি যা বোঝাতে চাচ্ছি তুমি তা বুঝেছ. আপনার বাস দেখতে কেমন এবং এটি কোথায় যাচ্ছে তা আপনাকে জানতে হবে, তবে এটি কীভাবে চালাতে হবে তা আপনার জানার দরকার নেই। আপনি যদি একজন বাস চালক হন, তাহলে আপনাকে নতুন বাস কীভাবে তৈরি করতে হবে তা জানার দরকার নেই — আপনাকে কেবল এটি কীভাবে চালাতে হবে তা জানতে হবে। কিন্তু আপনি যদি একজন বাস প্রস্তুতকারক হন, তাহলে আপনাকে বিমূর্ততার নিম্ন স্তরে যেতে হবে, কারণ বাসের নকশার বিশদ বিবরণ আপনার কাছে খুবই গুরুত্বপূর্ণ। আশা করি আমি যা বোঝাতে চাচ্ছি তুমি তা বুঝেছ.

এটি কিভাবে জাভাতে কাজ করে:

আসুন জাভাতে চারটি স্তরের বিমূর্ততা তৈরি করি, বা বরং OOP-তে - সর্বনিম্ন (সবচেয়ে নির্দিষ্ট) থেকে সর্বোচ্চ (সবচেয়ে বিমূর্ত)।
  1. বিমূর্ততার সর্বনিম্ন স্তর একটি নির্দিষ্ট বস্তু। এটি এমন একটি সত্তা যার বৈশিষ্ট্যগুলির একটি সেট যা একটি নির্দিষ্ট শ্রেণীর অন্তর্গত। এটির নির্দিষ্ট ক্ষেত্রের মান রয়েছে

  2. অবজেক্ট তৈরির জন্য একটি টেমপ্লেট হল একটি ক্লাস। এটি অনুরূপ বৈশিষ্ট্য এবং অভ্যন্তরীণ কাঠামো সহ বস্তুর একটি সেটের বর্ণনা।

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

  4. একটি ইন্টারফেস হল জাভা প্রোগ্রামিং ল্যাঙ্গুয়েজ কনস্ট্রাক্টের একটি গঠন যাতে শুধুমাত্র বিমূর্ত পাবলিক পদ্ধতি এবং স্ট্যাটিক ধ্রুবক ক্ষেত্র (ফাইনাল স্ট্যাটিক) থাকে। অন্য কথায়, অবজেক্ট তৈরি করতে বিমূর্ত ক্লাস বা ইন্টারফেস ব্যবহার করা যাবে না।

BTW, জাভা 8 বা পরবর্তীতে, ইন্টারফেসে শুধুমাত্র বিমূর্ত পদ্ধতি এবং ধ্রুবক নয়, ডিফল্ট এবং স্ট্যাটিক পদ্ধতিও থাকতে পারে। জাভাতে, একটি ইন্টারফেস একটি আচরণকে সংজ্ঞায়িত করে, যখন একটি বিমূর্ত শ্রেণী একটি শ্রেণিবিন্যাস তৈরি করতে ব্যবহৃত হয়। একটি ইন্টারফেস একাধিক ক্লাস দ্বারা প্রয়োগ করা যেতে পারে।

জাভা কোডে একটি ইন্টারফেসের উদাহরণ


interface Human {
	public void struggle();
	public void protect();
}

interface Vulcan {
	int angleOfPointyEars; 
	public void turnOffEmotions(boolean isOn);
	public void telepathy();
}
আপনি একাধিক ইন্টারফেস বাস্তবায়ন করতে পারেন

The Spock class implements Human and Vulcan {
public void struggle() {
System.out.println("I am struggling...");
}
	public void protect() {
System.out.println("You are under my protection!”);
}
public void turnOffEmotions(boolean isOn){
If (isOn) {
System.out.println("I am turning off my emotions.");
isOn= !isOn;
}
}
	public void telepathy() {
System.out.println("Connecting to your brain...");
}

}
প্রারম্ভিক ছাত্রদের জন্য, এটি জাভাতে অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিংয়ের সমস্ত প্রধান ধারণাগুলিকে কভার করে। 4টি প্রধান OOP নীতির পাশাপাশি, জাভাতেও অ্যাসোসিয়েশন, অ্যাগ্রিগেশন এবং কম্পোজিশন রয়েছে। আপনি তাদের "অতিরিক্ত OOP নীতি" বলতে পারেন। তারা তাদের নিজস্ব নিবন্ধ প্রাপ্য.