CodeGym/Java Blog/এলোমেলো/বস্তু তৈরির সময় কর্মের ক্রম
John Squirrels
লেভেল 41
San Francisco

বস্তু তৈরির সময় কর্মের ক্রম

এলোমেলো দলে প্রকাশিত
সদস্যগণ
ওহে! আজকের পাঠটি হবে বেশ... উহ... বহুমুখী :) এই অর্থে যে আমরা বিস্তৃত বিষয়গুলি কভার করব, তবে সেগুলি সমস্ত বস্তু তৈরির প্রক্রিয়ার সাথে সম্পর্কিত হবে । বস্তু সৃষ্টির সময় ক্রিয়ার ক্রম- ১আমরা এটি শুরু থেকে শেষ পর্যন্ত বিশ্লেষণ করব: কীভাবে কনস্ট্রাক্টর বলা হয়, কীভাবে এবং কী ক্রমে ক্ষেত্রগুলি (স্ট্যাটিক ক্ষেত্র সহ) শুরু করা হয়, ইত্যাদি। আমরা পূর্বে নিবন্ধে আলোচিত কিছু পয়েন্টে স্পর্শ করেছি, যাতে আপনি এক নজরে দেখতে পারেন। বেস ক্লাস কনস্ট্রাক্টর উপর উপাদান . প্রথমে, আসুন মনে করি কিভাবে একটি বস্তু তৈরি হয়। আপনি ভালভাবে মনে রাখবেন যে বিকাশকারীর দৃষ্টিকোণ থেকে এই প্রক্রিয়াটি কেমন দেখায়: তিনি একটি ক্লাস তৈরি করেন, লেখেন newএবং সবকিছু প্রস্তুত :) এখানে আমরা যখন লিখি তখন কম্পিউটার এবং জাভা মেশিনের অভ্যন্তরে কী ঘটে তা নিয়ে আলোচনা করব, উদাহরণস্বরূপ:
Cat cat = new Cat();
আমরা আগেও এই বিষয়ে কথা বলেছি, কিন্তু আমরা আপনাকে মনে করিয়ে দেব:
  • প্রথমত, বস্তু সংরক্ষণের জন্য মেমরি বরাদ্দ করা হয়।
  • এরপরে, জাভা মেশিন বস্তুর একটি রেফারেন্স তৈরি করে (আমাদের ক্ষেত্রে রেফারেন্সটি হল Cat cat)।
  • অবশেষে, ভেরিয়েবলগুলি শুরু করা হয় এবং কনস্ট্রাক্টরকে বলা হয় (আমরা এই প্রক্রিয়াটি আরও বিস্তারিতভাবে দেখতে যাচ্ছি)।
উপরন্তু, অবজেক্টের জীবনচক্রের পাঠ থেকে , আপনি সম্ভবত মনে রাখবেন যে একটি বস্তু ততক্ষণ স্থায়ী হয় যতক্ষণ না তার অন্তত একটি উল্লেখ থাকে। যদি কিছু অবশিষ্ট না থাকে, তাহলে বস্তুটি আবর্জনা সংগ্রহকারীর শিকার হয়ে যায়। বস্তু সৃষ্টির সময় কর্মের ক্রম - 2এই প্রথম দুটি পয়েন্ট কোন বিশেষ প্রশ্ন উত্থাপন করা উচিত নয়. মেমরি বরাদ্দ একটি সহজ প্রক্রিয়া, এবং শুধুমাত্র দুটি সম্ভাব্য ফলাফল আছে: হয় মেমরি আছে বা নেই :) এবং একটি লিঙ্ক তৈরি করা অস্বাভাবিক নয়। কিন্তু তৃতীয় পয়েন্টটি কঠোর ক্রমে সম্পাদিত অপারেশনগুলির একটি সম্পূর্ণ সেটকে প্রতিনিধিত্ব করে। আমি পরীক্ষার জন্য ক্র্যামিংয়ের অনুরাগী নই, তবে আপনাকে এই প্রক্রিয়াটি ভালভাবে বুঝতে হবে এবং আপনাকে অপারেশনের এই ক্রমটি মনে রাখতে হবে. আমরা যখন পূর্ববর্তী পাঠে বস্তু তৈরির প্রক্রিয়া সম্পর্কে কথা বলেছিলাম, তখন আপনি উত্তরাধিকার সম্পর্কে এখনও কিছুই জানেন না, তাই কিছু বিষয় ব্যাখ্যা করা সমস্যাযুক্ত ছিল। এখন আপনি অনেক কিছু জানেন এবং আমরা অবশেষে এই প্রশ্নটি সম্পূর্ণ বিবেচনা করতে পারি :) তাই তৃতীয় পয়েন্টটি বলে " অবশেষে, ভেরিয়েবলগুলি শুরু করা হয় এবং কনস্ট্রাক্টরকে বলা হয়। " কিন্তু এই সব কী ক্রমে ঘটে? আরও ভালোভাবে বোঝার জন্য, আসুন দুটি অতি সাধারণ ক্লাস তৈরি করি - একটি পিতামাতা এবং একটি শিশু:
public class Vehicle {

   public static int vehicleCounter = 0;

   private String description = "Vehicle";
   public Vehicle() {
   }

   public String getDescription() {
       return description;
   }
}

public class Truck extends Vehicle {

   private static int truckCounter = 0;

   private int yearOfManufacture;
   private String model;
   private int maxSpeed;

   public Truck(int yearOfManufacture, String model, int maxSpeed) {
       this.yearOfManufacture = yearOfManufacture;
       this.model = model;
       this.maxSpeed = maxSpeed;

       Vehicle.vehicleCounter++;
       truckCounter++;
   }
}
শ্রেণী Truckহল একটি ট্রাকের বাস্তবায়ন যার ক্ষেত্রগুলি তার বছর, মডেল এবং সর্বোচ্চ গতির প্রতিনিধিত্ব করে। এখন আমরা এমন একটি বস্তু তৈরি করতে চাই:
public class Main {

   public static void main(String[] args) throws IOException {

       Truck truck = new Truck(2017, "Scania S 500 4x2", 220);
   }
}
জাভা মেশিনে, প্রক্রিয়াটি এইরকম দেখাবে:
  1. প্রথম যে জিনিসটি ঘটে তা হল ক্লাসের স্ট্যাটিক ভেরিয়েবলগুলি Vehicleশুরু করা হয় । হ্যাঁ, ক্লাসে বললাম Vehicle, না Truck। কনস্ট্রাক্টরদের কল করার আগে স্ট্যাটিক ভেরিয়েবল শুরু করা হয় এবং এটি প্যারেন্ট ক্লাসে শুরু হয়। আসুন এটি যাচাই করার চেষ্টা করি। আমরা 10 এর সমান vehicleCounterক্লাসে ফিল্ড সেট করি এবং এটি এবং কনস্ট্রাক্টর Vehicleউভয়েই প্রদর্শন করার চেষ্টা করি ।VehicleTruck

    public class Vehicle {
    
       public static int vehicleCounter = 10;
       private String description = "Vehicle";
    
       public Vehicle() {
           System.out.println(vehicleCounter);
       }
    
       public String getDescription() {
           return description;
       }
    }
    
    public class Truck extends Vehicle {
    
       private static int truckCount = 0;
    
       private int yearOfManufacture;
       private String model;
       private int maxSpeed;
    
       public Truck(int yearOfManufacture, String model, int maxSpeed) {
           System.out.println(vehicleCounter);
           this.yearOfManufacture = yearOfManufacture;
           this.model = model;
           this.maxSpeed = maxSpeed;
    
           Vehicle.vehicleCounter++;
           truckCount++;
       }
    }

    আমরা ইচ্ছাকৃতভাবে প্রিন্টএলএন স্টেটমেন্টটি কনস্ট্রাক্টরের একেবারে শুরুতে রাখি Truckযাতে ট্রাকের ক্ষেত্রগুলি vehicleCounterপ্রদর্শিত হওয়ার সময় এখনও আরম্ভ করা হয়নি।

    এবং এখানে ফলাফল:

    10
    10
  2. প্যারেন্ট ক্লাসের স্ট্যাটিক ভেরিয়েবলগুলি শুরু করার পরে, চাইল্ড ক্লাসের স্ট্যাটিক ভেরিয়েবলগুলি শুরু করা হয়। আমাদের ক্ষেত্রে, এটি truckCounterক্লাসের ক্ষেত্র Truck

    আসুন অন্য একটি পরীক্ষা করি যেখানে আমরা অন্যান্য ক্ষেত্রগুলি শুরু করার আগে কনস্ট্রাক্টরের truckCounterভিতরের মান প্রদর্শন করার চেষ্টা করব :Truck

    public class Truck extends Vehicle {
    
       private static int truckCounter = 10;
    
       private int yearOfManufacture;
       private String model;
       private int maxSpeed;
    
       public Truck(int yearOfManufacture, String model, int maxSpeed) {
           System.out.println(truckCounter);
           this.yearOfManufacture = yearOfManufacture;
           this.model = model;
           this.maxSpeed = maxSpeed;
    
           Vehicle.vehicleCounter++;
           truckCounter++;
       }
    }

    আপনি দেখতে পাচ্ছেন, কনস্ট্রাক্টর শুরু হলে মান 10 ইতিমধ্যেই আমাদের স্ট্যাটিক ভেরিয়েবলে বরাদ্দ করা হয়েছে ।Truck

  3. এটা এখনও নির্মাণকারীদের জন্য সময় না! পরিবর্তনশীল সূচনা অব্যাহত. প্যারেন্ট ক্লাসের নন-স্ট্যাটিক ভেরিয়েবলগুলি তৃতীয় শুরু করা হয়। আপনি দেখতে পাচ্ছেন, উত্তরাধিকার একটি বস্তু তৈরির প্রক্রিয়াটিকে উল্লেখযোগ্যভাবে জটিল করে তোলে, তবে আপনি এটি সম্পর্কে কিছুই করতে পারবেন না: আপনাকে কেবল প্রোগ্রামিংয়ে কিছু জিনিস মনে রাখতে হবে :)

    একটি পরীক্ষা হিসাবে, আমরা ক্লাসের descriptionভেরিয়েবলে কিছু প্রাথমিক মান নির্ধারণ করতে পারি Vehicleএবং তারপরে এটি কনস্ট্রাক্টরে পরিবর্তন করতে পারি।

    public class Vehicle {
    
       public static int vehicleCounter = 10;
    
       private String description = "Initial value of the description field";
    
       public Vehicle() {
           System.out.println(description);
           description = "Vehicle";
           System.out.println(description);
       }
    
       public String getDescription() {
           return description;
       }
    }

    আসুন আমাদের main()পদ্ধতিটি চালাই যা একটি ট্রাক তৈরি করে:

    public class Main {
    
       public static void main(String[] args) throws IOException {
    
           Truck truck = new Truck(2017, "Scania S 500 4x2", 220);
       }
    }

    আমরা নিম্নলিখিত ফলাফল পেতে:

    Initial value of the description field
    Vehicle

    এটি প্রমাণ করে যে যখন Vehicleকনস্ট্রাক্টর শুরু হয় তখন descriptionক্ষেত্রটি ইতিমধ্যে একটি মান বরাদ্দ করা হয়েছে।

  4. অবশেষে, এটি নির্মাণকারীদের জন্য সময়! আরও স্পষ্টভাবে, এটি বেস ক্লাস কনস্ট্রাক্টরের জন্য সময়। এটি বস্তু তৈরির প্রক্রিয়ার চতুর্থ ধাপে আহ্বান করা হয়।

    এটি যাচাই করাও মোটামুটি সহজ। কনসোলে দুটি লাইন আউটপুট করার চেষ্টা করা যাক: একটি Vehicleবেস ক্লাস কনস্ট্রাক্টরের ভিতরে, দ্বিতীয়টি Truckকনস্ট্রাক্টরের ভিতরে। আমাদের নিশ্চিত হওয়া দরকার যে ভিতরের লাইনটি Vehicleপ্রথমে প্রদর্শিত হয়:

    public Vehicle() {
    
       System.out.println("Hello from the Vehicle constructor!");
    }
    
    public Truck(int yearOfManufacture, String model, int maxSpeed) {
    
       System.out.println("Hello from the Truck constructor!");
       this.yearOfManufacture = yearOfManufacture;
       this.model = model;
       this.maxSpeed = maxSpeed;
    
       Vehicle.vehicleCounter++;
       truckCounter++;
    }

    আমরা আমাদের পদ্ধতি চালাব main()এবং ফলাফলটি দেখব:

    Hello from the Vehicle constructor!
    Hello from the Truck constructor!

    চমৎকার। তার মানে আমরা ভুল করছি না :) চলুন এগিয়ে যাই।

  5. এখন সময় এসেছে শিশু শ্রেণীর, অর্থাৎ আমাদের ক্লাসের অ-স্থির ক্ষেত্রগুলি শুরু করারTruck । ক্লাসের মধ্যে অবিলম্বে ক্ষেত্রগুলি পঞ্চম ধাপ পর্যন্ত আরম্ভ করা হয় না! আশ্চর্যজনক, কিন্তু সত্য :) আবার, আমরা একটি সাধারণ পরীক্ষা করব — ঠিক যেমন প্যারেন্ট ক্লাসের সাথে: আমরা ভেরিয়েবলের কিছু প্রাথমিক মান দেব maxSpeedএবং কনস্ট্রাক্টরে Truckআমরা পরীক্ষা করব যে কনস্ট্রাক্টর শুরু করার আগে মানটি বরাদ্দ করা হয়েছিল:

    public class Truck extends Vehicle {
    
       private static int truckCounter = 10;
    
       private int yearOfManufacture;
       private String model;
       private int maxSpeed = 150;
    
       public Truck(int yearOfManufacture, String model, int maxSpeed) {
    
           System.out.println("Initial value of maxSpeed = " + this.maxSpeed);
           this.yearOfManufacture = yearOfManufacture;
           this.model = model;
           this.maxSpeed = maxSpeed;
    
           Vehicle.vehicleCounter++;
           truckCounter++;
       }
    }

    কনসোল আউটপুট:

    Initial value of maxSpeed = 150

    আপনি দেখতে পাচ্ছেন,  যখন Truck কনস্ট্রাক্টর শুরু হয়, maxSpeed ইতিমধ্যেই 150 এর সমান!

  6. শিশু শ্রেণীর নির্মাতাকে Truckবলা হয়।

    এবং শুধুমাত্র এই মুহুর্তে, সবশেষে, আমরা যে শ্রেণীকে তাত্ক্ষণিক করছি তার নির্মাতাকে বলা হবে!

    শুধুমাত্র ষষ্ঠ ধাপে ক্ষেত্রগুলিকে সেই মানগুলি বরাদ্দ করা হবে যা আমরা আমাদের ট্রাকে আর্গুমেন্ট হিসাবে পাস করি।

    আপনি দেখতে পাচ্ছেন, একটি ট্রাক "নির্মাণ" করা, অর্থাৎ বস্তু তৈরির প্রক্রিয়া সহজ নয়। কিন্তু মনে হচ্ছে আমরা এটিকে ক্ষুদ্রতম অংশে ভেঙে ফেলেছি :)

বস্তু সৃষ্টির সময় কর্মের ক্রম - 3 কেন এই প্রক্রিয়াটি ভালভাবে বোঝা এত গুরুত্বপূর্ণ? কল্পনা করুন যে একটি সাধারণ বস্তু তৈরির ফলাফল কতটা অপ্রত্যাশিত হতে পারে যদি আপনি "হুডের নীচে" ঠিক কী ঘটছে তা না জানতেন :) এখন কোর্সে ফিরে আসার এবং কিছু কাজ সম্পূর্ণ করার সময়! শুভকামনা এবং শীঘ্রই দেখা হবে! :)
মন্তব্য
  • জনপ্রিয়
  • নতুন
  • পুরানো
মন্তব্য লেখার জন্য তোমাকে অবশ্যই সাইন ইন করতে হবে
এই পাতায় এখনও কোনো মন্তব্য নেই