हाय! आम्ही Java मधील नेस्टेड क्लासेसचा विषय एक्सप्लोर करत आहोत. शेवटच्या व्यायामामध्ये, आम्ही नॉन-स्टॅटिक नेस्टेड क्लासेसबद्दल बोललो, ज्यांना इनर क्लासेस असेही म्हणतात. आज आपण वर्गांच्या दुसर्या गटाकडे जाऊ. आम्ही स्टॅटिक नेस्टेड क्लासेसचा विचार करू. ते इतर वर्गांपेक्षा वेगळे कसे आहेत? या प्रकारच्या वर्गाची घोषणा करताना, आम्ही स्थिर कीवर्ड वापरतो, जो तुम्हाला आधीच परिचित आहे:
public class Boeing737 {
private int manufactureYear;
private static int maxPassengersCount = 300;
public Boeing737(int manufactureYear) {
this.manufactureYear = manufactureYear;
}
public int getManufactureYear() {
return manufactureYear;
}
public static class Drawing {
public static int getMaxPassengersCount() {
return maxPassengersCount;
}
}
}
या उदाहरणात, आपल्याकडे Boeing737
बाह्य वर्ग आहे, जो या प्रकारच्या विमानाचे प्रतिनिधित्व करतो. यात एका पॅरामीटरसह कन्स्ट्रक्टर आहे: उत्पादनाचे वर्ष ( int manufactureYear
). एक स्थिर व्हेरिएबल देखील आहे: प्रवाशांची कमाल संख्या ( int maxPassengersCount
). त्याच मॉडेलच्या सर्व विमानांसाठी त्याचे मूल्य समान असेल, म्हणून आम्हाला फक्त एक उदाहरण आवश्यक आहे. याव्यतिरिक्त, त्यात स्थिर नेस्टेड वर्ग आहे: Drawing
(विमानाच्या अभियांत्रिकी ब्लूप्रिंट्सचे प्रतिनिधित्व करते). आम्ही या वर्गाचा वापर विमानाविषयी सर्व अधिकृत माहिती एन्कॅप्स्युलेट करण्यासाठी करतो. आमच्या उदाहरणात, साधेपणासाठी, आम्ही हा वर्ग उत्पादनाच्या वर्षापर्यंत मर्यादित केला आहे, परंतु त्यात इतर बरीच माहिती असू शकते. आम्ही शेवटच्या धड्यात म्हटल्याप्रमाणे, असे नेस्टेड क्लास तयार केल्याने एन्कॅप्सुलेशन सुधारते आणि अधिक वास्तववादी अमूर्ततेमध्ये योगदान होते. स्टॅटिक आणि नॉन-स्टॅटिक नेस्टेड क्लासेसमध्ये काय फरक आहे? 1. स्टॅटिक क्लासचा ऑब्जेक्ट Drawing
बाह्य वर्गाच्या विशिष्ट उदाहरणाचा संदर्भ संग्रहित करत नाही. शेवटच्या धड्यातील सायकलचे उदाहरण लक्षात ठेवा:
public class Bicycle {
private String model;
private int maxWeight;
public Bicycle(String model, int maxWeight) {
this.model = model;
this.maxWeight = maxWeight;
}
public void start() {
System.out.println("Let's go!");
}
public class Handlebar {
public void right() {
System.out.println("Steer right!");
}
public void left() {
System.out.println("Steer left!");
}
}
}
त्या धड्यात, आम्ही या वस्तुस्थितीबद्दल बोललो की Handlebar
आतील वर्गाची प्रत्येक घटना, आपल्यासाठी अदृश्यपणे, बाह्य वर्गाच्या उदाहरणाचा संदर्भ देते Bicycle
. बाह्य वर्गाच्या उदाहरणाशिवाय, अंतर्गत वर्गाची एखादी वस्तू अस्तित्वात असू शकत नाही. स्टॅटिक नेस्टेड वर्गांसाठी, असे नाही. स्टॅटिक नेस्टेड क्लासची ऑब्जेक्ट स्वतःच अस्तित्वात राहण्यास पूर्णपणे सक्षम आहे. या संदर्भात, स्थिर वर्ग नॉन-स्टॅटिकपेक्षा अधिक "स्वतंत्र" आहेत. आपल्याला फक्त एक गोष्ट माहित असणे आवश्यक आहे की अशी ऑब्जेक्ट तयार करताना, आपण बाह्य वर्गाचे नाव निर्दिष्ट करणे आवश्यक आहे:
public class Main {
public static void main(String[] args) {
Boeing737.Drawing drawing1 = new Boeing737.Drawing();
Boeing737.Drawing drawing2 = new Boeing737.Drawing();
}
}
Drawing
शेवटच्या धड्यात जेव्हा आम्ही वर्ग स्थिर का केलाSeat
वर्ग (सायकल सीटचे प्रतिनिधीत्व) नॉन-स्टॅटिक? मागच्या वेळेप्रमाणे, उदाहरण समजून घेण्यासाठी थोडेसे "तत्त्वज्ञान" जोडूया :) सायकलच्या आसनाच्या विपरीत, अभियांत्रिकी रेखाचित्र ही संकल्पना विमानाच्या संकल्पनेशी कठोरपणे जोडलेली नाही. सायकलशिवाय, एक स्वतंत्र सायकल सीट ऑब्जेक्ट बहुतेक वेळा निरर्थक असेल (जरी नेहमीच नाही, आम्ही शेवटच्या धड्यात याबद्दल बोललो). अभियांत्रिकी रेखाचित्र ही संकल्पना स्वतःच अर्थपूर्ण आहे. उदाहरणार्थ, विमानाच्या देखभालीचे नियोजन करणाऱ्या अभियंत्यांना ते उपयुक्त ठरू शकते. योजना तयार करण्यासाठी विमानाची आवश्यकता नाही आणि ते कुठेही असू शकते. फक्त अभियांत्रिकी रेखाचित्र आवश्यक आहे. याव्यतिरिक्त, समान मॉडेलच्या सर्व विमानांमध्ये समान अभियंता रेखाचित्र असेल, त्यामुळे सायकलच्या सीटशी अस्तित्वात असलेले कोणतेही घट्ट नाते नाही. म्हणून, एDrawing
ऑब्जेक्टला विशिष्ट विमान ऑब्जेक्टचा संदर्भ आवश्यक नाही. 2. बाह्य वर्गाच्या व्हेरिएबल्स आणि पद्धतींमध्ये भिन्न प्रवेश. स्टॅटिक नेस्टेड क्लास केवळ बाह्य क्लासच्या स्टॅटिक फील्डमध्ये प्रवेश करू शकतो. आमच्या उदाहरणात, Drawing
वर्गात एक पद्धत आहे जी बाह्य वर्गाच्या getMaxPassengersCount()
स्थिर व्हेरिएबलचे मूल्य परत करते . तथापि, ची किंमत परत करण्यासाठी आम्ही वर्गामध्ये पद्धत maxPassengersCount
तयार करू शकत नाही . शेवटी, व्हेरिएबल नॉन-स्टॅटिक आहे, याचा अर्थ ते विशिष्ट उदाहरणाशी संबंधित असणे आवश्यक आहे . आणि जसे आपण आधीच शोधून काढले आहे की, स्टॅटिक नेस्टेड क्लासेसच्या बाबतीत, बाह्य क्लासचा ऑब्जेक्ट सहजपणे अनुपस्थित असू शकतो. त्यामुळे, मर्यादा :) स्टॅटिक व्हेरिएबलला बाह्य वर्गात कोणता ऍक्सेस मॉडिफायर आहे हे महत्त्वाचे नाही. तो असला तरीgetManufactureYear()
Drawing
manufactureYear
manufactureYear
Boeing737
private
, स्थिर नेस्टेड क्लासला अजूनही प्रवेश असेल. वरील सर्व गोष्टी केवळ स्टॅटिक व्हेरिएबल्समध्येच नाही तर स्टॅटिक पद्धतींनाही लागू होतात. महत्त्वाचे! आतील वर्गाच्या घोषणेमध्ये, static
कीवर्डचा अर्थ असा नाही की आपण फक्त एक ऑब्जेक्ट तयार करू शकता. व्हेरिएबल्ससह वस्तूंना गोंधळात टाकू नका. जर आपण स्टॅटिक व्हेरिएबल्सबद्दल बोलत आहोत, तर, होय, स्टॅटिक क्लास व्हेरिएबलचे एकच उदाहरण आहे, उदाहरणार्थ, maxPassangersCount
. परंतु जेव्हा static
नेस्टेड क्लासवर लागू केले जाते, तेव्हा त्याचा अर्थ असा होतो की त्याच्या ऑब्जेक्ट्समध्ये बाह्य वर्गाच्या वस्तूंचे संदर्भ नसतात. आणि आपल्याला पाहिजे तितक्या वस्तू आपण स्वतः तयार करू शकतो:
public class Boeing737 {
private int manufactureYear;
private static int maxPassengersCount = 300;
public Boeing737(int manufactureYear) {
this.manufactureYear = manufactureYear;
}
public int getManufactureYear() {
return manufactureYear;
}
public static class Drawing {
private int id;
public Drawing(int id) {
this.id = id;
}
public static int getPassengersCount() {
return maxPassengersCount;
}
@Override
public String toString() {
return "Drawing{" +
"id=" + id +
'}';
}
public static void main(String[] args) {
for (int i = 1; i < 6; i++) {
Boeing737.Drawing drawing = new Boeing737.Drawing(i);
System.out.println(drawing);
}
}
}
}
आम्ही main()
पद्धत थेट नेस्टेड क्लासमध्ये घोषित केली (यासाठी कोणतेही विशेष कारण नाही — फक्त हे शक्य आहे हे सांगण्यासाठी), आणि 5 Drawing
ऑब्जेक्ट्स तयार केल्या. आमच्याकडे बाह्य वर्गाची एकही वस्तू नाही हे तथ्य असूनही. तुम्ही बघू शकता, यामुळे कोणतीही समस्या निर्माण झाली नाही :) कन्सोल आउटपुट:
Drawing{id=1}
Drawing{id=2}
Drawing{id=3}
Drawing{id=4}
Drawing{id=5}
आणि त्यातूनच आपला धडा संपतो! फक्त बाबतीत, मी तुम्हाला ओरॅकल दस्तऐवजीकरणातील त्यांच्याबद्दलच्या विभागाची लिंक देईन . अजूनही काही अस्पष्ट राहिल्यास, ते वाचा. आता माझ्यासाठी दोन कार्ये सोडवण्याची वेळ आली आहे! :)
GO TO FULL VERSION