CodeGym /Java Blog /यादृच्छिक /ऑब्जेक्ट निर्मिती दरम्यान क्रियांचा क्रम
John Squirrels
पातळी 41
San Francisco

ऑब्जेक्ट निर्मिती दरम्यान क्रियांचा क्रम

यादृच्छिक या ग्रुपमध्ये प्रकाशित केले
हाय! आजचा धडा खूप... अहं... बहुआयामी असेल :) या अर्थाने आपण विषयांची विस्तृत श्रेणी कव्हर करू, परंतु ते सर्व ऑब्जेक्ट निर्मिती प्रक्रियेशी संबंधित असतील . ऑब्जेक्ट निर्मिती दरम्यान क्रियांचा क्रम - 1आम्ही सुरुवातीपासून शेवटपर्यंत त्याचे विश्लेषण करू: कन्स्ट्रक्टर कसे म्हणतात, कसे आणि कोणत्या क्रमाने फील्ड (स्थिर फील्डसह) सुरू केले जातात, इ. आम्ही लेखात चर्चा केलेल्या काही मुद्द्यांवर आधी स्पर्श केला आहे, त्यामुळे तुम्ही ते पाहू शकता. बेस क्लास कन्स्ट्रक्टरवरील सामग्री प्रथम, एखादी वस्तू कशी तयार होते ते आठवूया. विकसकाच्या दृष्टिकोनातून ही प्रक्रिया कशी दिसते हे तुम्हाला चांगले आठवते: तो एक वर्ग तयार करतो, लिहितो newआणि सर्व काही तयार आहे :) जेव्हा आपण लिहितो तेव्हा संगणक आणि जावा मशीनमध्ये काय होते याबद्दल आपण येथे बोलू, उदाहरणार्थ:

Cat cat = new 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); 
   } 
}
Java मशीनसाठी, प्रक्रिया यासारखी दिसेल:
  1. पहिली गोष्ट जी घडते ती म्हणजे क्लासचे स्टॅटिक व्हेरिएबल्स Vehicleइनिशियलाइज केले जातात . होय, मी Vehicleवर्ग म्हणालो, नाही Truck. कंस्ट्रक्टरला कॉल करण्यापूर्वी स्टॅटिक व्हेरिएबल्स सुरू केले जातात आणि हे पॅरेंट क्लासमध्ये सुरू होते. चला हे सत्यापित करण्याचा प्रयत्न करूया. आम्ही vehicleCounterफील्ड 10 च्या बरोबरीने वर्गात सेट करतो आणि ते आणि कन्स्ट्रक्टर 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प्रदर्शित केव्हा सुरू केले गेले नाहीत याची खात्री करण्यासाठी आम्ही मुद्दामच कन्स्ट्रक्टरच्या अगदी सुरुवातीला println स्टेटमेंट ठेवतो .

    आणि येथे परिणाम आहे:

    
    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 ही प्रक्रिया चांगल्या प्रकारे समजून घेणे इतके महत्त्वाचे का आहे? "अंडर द हूड" नक्की काय घडत आहे हे जर तुम्हाला माहीत नसेल तर एखादी सामान्य वस्तू तयार करण्याचे परिणाम किती अनपेक्षित असू शकतात याची कल्पना करा :) आता कोर्सवर परत जाण्याची आणि काही कार्ये पूर्ण करण्याची वेळ आली आहे! शुभेच्छा आणि लवकरच भेटू! :)
टिप्पण्या
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION