हाय! फील्ड आणि पद्धतींसह तुमचे स्वतःचे वर्ग तयार करण्याबद्दल तुम्हाला आधीच माहिती आहे. आता आपण पद्धतींवर विचार करू.
अर्थात, आम्ही आमच्या धड्यांमध्ये हे आधीच एकापेक्षा जास्त वेळा केले आहे, परंतु आम्ही मुख्यतः सामान्यता समाविष्ट केली आहे. आज, आम्ही पद्धतींचे विच्छेदन करणार आहोत आणि त्या कशापासून बनवल्या आहेत, त्या तयार करण्याचे विविध मार्ग आणि हे सर्व कसे व्यवस्थापित करायचे याचा अभ्यास करणार आहोत. :) चल जाऊया!
पद्धत घोषणा
पद्धत परिभाषित करणार्या सर्व कोडला मेथड डिक्लेरेशन म्हणतात . पद्धतीच्या घोषणेचे सामान्य स्वरूप खालीलप्रमाणे वर्णन केले जाऊ शकते:
access modifier, return type, method name (parameter list) {
// method body
}
उदाहरणे म्हणून, वर्गाच्या विविध पद्धतींच्या घोषणांवर एक नजर टाका Dog
.
public class Dog {
String name;
public Dog(String name) {
this.name = name;
}
public static void main(String[] args) {
Dog max = new Dog("Max");
max.woof();
}
public void woof() {
System.out.println("A dog named " + name + " says \"Woof, woof!\"");
}
public void run(int distanceInFeet) {
System.out.println("A dog named " + name + " ran " + distanceInFeet + " feet!");
}
public String getName() {
return name;
}
}
1. ऍक्सेस मॉडिफायर
प्रवेश सुधारक नेहमी प्रथम सूचित केला जातो. वर्गाच्या सर्वDog
पद्धती सार्वजनिक सुधारकाने चिन्हांकित केल्या आहेत. याचा अर्थ आम्ही त्यांना इतर कोणत्याही वर्गातून कॉल करू शकतो:
public class Main {
public static void main(String[] args) {
Dog butch = new Dog("Butch");
butch.run(100);
}
}
तुम्ही बघू शकता, Dog
वर्गाच्या पद्धती वर्गात सहज प्रवेश करता येतात Main
. पब्लिक मॉडिफायरमुळे हे शक्य झाले आहे . Java मध्ये, इतर मॉडिफायर्स आहेत. ते सर्व पद्धती इतर वर्गांमध्ये वापरण्याची परवानगी देत नाहीत. आम्ही त्यांच्याबद्दल इतर धड्यांमध्ये बोलू. लक्षात ठेवण्याची मुख्य गोष्ट म्हणजे सुधारक कशासाठी जबाबदार आहे: इतर वर्गांमध्ये पद्धत प्रवेशयोग्य आहे का :)
2. स्थिर कीवर्ड
पद्धतींपैकी एकDog
, , staticmain()
या कीवर्डने चिन्हांकित केली आहे . हे पद्धत घोषणेचा देखील एक भाग आहे आणि आम्हाला त्याचा अर्थ आधीच माहित आहे. धड्याच्या सुरुवातीला दिलेल्या पद्धती घोषणा टेम्पलेटमध्ये आम्ही त्याचा उल्लेख केला नाही, कारण ते ऐच्छिक आहे. जर ते निर्दिष्ट केले असेल, तर ते प्रवेश सुधारकानंतर आले पाहिजे. लक्षात ठेवा की अलीकडील धड्यांमध्ये आपण स्थिर (वर्ग) व्हेरिएबल्सबद्दल बोललो होतो? पद्धतींवर लागू केल्यावर, या कीवर्डचा अंदाजे समान अर्थ असतो. जर पद्धत स्थिर असेल , तर ती वर्गाच्या विशिष्ट ऑब्जेक्टच्या संदर्भाशिवाय वापरली जाऊ शकते. आणि खरंच, तुम्हाला मध्ये स्थिर पद्धत चालवण्यासाठी ऑब्जेक्टची आवश्यकता नाहीDog
main()
Dog
वर्ग हे एकाशिवाय चांगले चालेल. जर ही पद्धत स्थिर नसती, तर ती चालवण्यासाठी आपल्याला प्रथम एखादी वस्तू तयार करावी लागेल.
3. परतावा मूल्य
जर आमच्या पद्धतीने काहीतरी परत केले असेल तर आम्ही रिटर्न व्हॅल्यूचा प्रकार निर्दिष्ट करतो. हे गेटरच्या उदाहरणावरून स्पष्ट होतेgetName()
:
public String getName() {
return name;
}
ते String
ऑब्जेक्ट परत करते. जर एखादी पद्धत काहीही परत करत नसेल, तर त्याऐवजी कीवर्ड void वापरला जातो, पद्धतीप्रमाणे woof()
:
public void woof() {
System.out.println("A dog named " + name + " says \"Woof, woof!\"");
}
समान नावाच्या पद्धती
अशी परिस्थिती असते जेव्हा आम्हाला पद्धत कॉल करण्यासाठी अनेक भिन्न मार्ग हवे असतात. आपली स्वतःची कृत्रिम बुद्धिमत्ता का तयार करत नाही? ऍमेझॉनकडे अलेक्सा आहे, ऍपलकडे सिरी आहे, मग आपल्याकडे का नसावे? :) आयर्न मॅन या चित्रपटात, टोनी स्टार्कने स्वतःची अविश्वसनीय कृत्रिम बुद्धिमत्ता, जार्विस तयार केली. चला त्या अद्भुत व्यक्तिरेखेला आदरांजली वाहू आणि त्याच्या सन्मानार्थ आपल्या AI चे नाव देऊ. :) आपल्याला पहिली गोष्ट म्हणजे जार्विसला खोलीत प्रवेश करणार्या लोकांना हॅलो म्हणायला शिकवणे आवश्यक आहे (अशी आश्चर्यकारक बुद्धी असभ्य ठरली तर ते विचित्र होईल).
public class Jarvis {
public void sayHi(String name) {
System.out.println("Good evening, " + name + ". How are you?");
}
public static void main(String[] args) {
Jarvis jarvis = new Jarvis();
jarvis.sayHi("Tony Stark");
}
}
कन्सोल आउटपुट: शुभ संध्याकाळ, टोनी स्टार्क. तू कसा आहेस? खुप छान! जार्विस आता पाहुण्यांचे स्वागत करण्यास सक्षम आहे. अर्थात, त्याहून अधिक वेळा त्याचा मास्टर टोनी स्टार्क असेल. पण तो एकटाच आला नाही तर काय! पण आमची sayHi()
पद्धत फक्त एक युक्तिवाद स्वीकारते. आणि म्हणून ते खोलीत प्रवेश करणार्या एका व्यक्तीला फक्त अभिवादन करू शकते आणि दुसर्याकडे दुर्लक्ष करेल. खूप विनम्र नाही, सहमत आहे? :/ या प्रकरणात, आम्ही एकाच नावाने फक्त 2 पद्धती लिहून समस्या सोडवू शकतो, परंतु भिन्न पॅरामीटर्स:
public class Jarvis {
public void sayHi(String firstGuest) {
System.out.println("Good evening, " + firstGuest + ". How are you?");
}
public void sayHi(String firstGuest, String secondGuest) {
System.out.println("Good evening, " + firstGuest + " and " + secondGuest + ". How are you?");
}
}
याला मेथड ओव्हरलोडिंग म्हणतात . मेथड ओव्हरलोडिंग आमच्या प्रोग्रामला अधिक लवचिक बनवू देते आणि काम करण्याच्या विविध पद्धतींना सामावून घेते. ते कसे कार्य करते याचे पुनरावलोकन करूया:
public class Jarvis {
public void sayHi(String firstGuest) {
System.out.println("Good evening, " + firstGuest + ". How are you?");
}
public void sayHi(String firstGuest, String secondGuest) {
System.out.println("Good evening, " + firstGuest + " and " + secondGuest + ". How are you?");
}
public static void main(String[] args) {
Jarvis jarvis = new Jarvis();
jarvis.sayHi("Tony Stark");
jarvis.sayHi("Tony Stark", "Captain America");
}
}
कन्सोल आउटपुट: शुभ संध्याकाळ, टोनी स्टार्क. तू कसा आहेस? शुभ संध्याकाळ, टोनी स्टार्क आणि कॅप्टन अमेरिका. तू कसा आहेस? उत्कृष्ट, दोन्ही आवृत्त्यांनी काम केले. :) पण आम्ही समस्या सोडवली नाही! तीन पाहुणे असतील तर? आम्ही अर्थातच, sayHi()
पद्धत पुन्हा ओव्हरलोड करू शकतो, जेणेकरून ती तीन अतिथी नावे स्वीकारेल. पण 4 किंवा 5 असू शकतात. अनंतापर्यंत सर्व मार्ग. जार्विसला कितीही नावे हाताळण्यास शिकवण्याचा यापेक्षा चांगला मार्ग नाही का, या sayHi()
पद्धतीला दशलक्ष वेळा ओव्हरलोड न करता()? :/ नक्कीच आहे! तसे नसते तर जावा ही जगातील सर्वात लोकप्रिय प्रोग्रामिंग भाषा असेल असे तुम्हाला वाटते का? ;)
public class Jarvis {
public void sayHi(String...names) {
for (String name: names) {
System.out.println("Good evening, " + name + ". How are you?");
}
}
public static void main(String[] args) {
Jarvis jarvis = new Jarvis();
jarvis.sayHi("Tony Stark");
System.out.println();
jarvis.sayHi("Tony Stark", "Captain America");
}
}
जेव्हा ( String... names ) हे पॅरामीटर म्हणून वापरले जाते, तेव्हा ते सूचित करते की स्ट्रिंग्सचा संग्रह पद्धतीकडे पाठवला जाईल. तेथे किती असतील हे आम्हाला आगाऊ निर्दिष्ट करण्याची गरज नाही, म्हणून आता आमची पद्धत अधिक लवचिक आहे:
public class Jarvis {
public void sayHi(String...names) {
for (String name: names) {
System.out.println("Good evening, " + name + ". How are you?");
}
}
public static void main(String[] args) {
Jarvis jarvis = new Jarvis();
jarvis.sayHi("Tony Stark", "Captain America", "Black Widow", "Hulk");
}
}
कन्सोल आउटपुट: शुभ संध्याकाळ, टोनी स्टार्क. तू कसा आहेस? शुभ संध्याकाळ, कॅप्टन अमेरिका. तू कसा आहेस? शुभ संध्याकाळ, काळी विधवा. तू कसा आहेस? शुभ संध्याकाळ, हल्क. तू कसा आहेस? पद्धतीच्या आत, आम्ही सर्व युक्तिवादांवर पुनरावृत्ती करतो आणि नावांसह स्वरूपित वाक्यांश प्रदर्शित करतो. येथे आम्ही एक सरलीकृत for-each
लूप वापरतो (जे तुम्ही आधी पाहिले आहे). हे येथे योग्य आहे, कारण ( स्ट्रिंग... नावे ) नोटेशनचा अर्थ असा होतो की कंपाइलर सर्व पास केलेले वितर्क अॅरेमध्ये ठेवतो. परिणामी, आपण व्हेरिएबल नावांसह कार्य करू शकतोजसे आपण लूपमध्ये पुनरावृत्ती करून अॅरेसह कार्य करू. शिवाय, ते कितीही पास केलेल्या स्ट्रिंगसह कार्य करेल! दोन, दहा, अगदी हजार-पद्धत कितीही अतिथींसह योग्यरित्या कार्य करेल. सर्व शक्यतांसाठी पद्धत ओव्हरलोड करण्यापेक्षा अधिक सोयीस्कर आहे, तुम्हाला वाटत नाही? :) पद्धत ओव्हरलोडिंगचे आणखी एक उदाहरण येथे आहे. जार्विसला एक पद्धत देऊ printInfoFromDatabase()
. हे डेटाबेसमधून एखाद्या व्यक्तीबद्दल माहिती प्रदर्शित करेल. जर डेटाबेस सूचित करत असेल की एखादी व्यक्ती सुपरहिरो किंवा सुपरव्हिलन आहे, तर आम्ही ती माहिती प्रदर्शित करू:
public class Jarvis {
public void printInfoFromDatabase (String bio) {
System.out.println(bio);
}
public void printInfoFromDatabase(String bio, boolean isEvil, String nickname) {
System.out.println(bio);
if (!isEvil) {
System.out.println("Also known as the superhero " + nickname);
} else {
System.out.println("Also known as the supervillain " + nickname);
}
}
public static void main(String[] args) {
Jarvis jarvis = new Jarvis();
jarvis.printInfoFromDatabase("Laura Palmer. Date of birth: July 22, 1972. Twin Peaks, Washington");
System.out.println();
jarvis.printInfoFromDatabase("Max Eisenhardt. Height: 15.6 ft. Weight: 189 lbs. ", true, "Magneto");
}
}
आउटपुट: लॉरा पामर. जन्मतारीख: 22 जुलै 1972. ट्विन पीक्स, वॉशिंग्टन मॅक्स आयसेनहार्ट. उंची: 15.6 फूट. वजन: 189 पौंड. सुपरव्हिलेन मॅग्नेटो म्हणूनही ओळखले जाते , त्यामुळे आमच्या पद्धतीचे वर्तन आम्ही त्यास देत असलेल्या डेटावर अवलंबून असते. येथे आणखी एक महत्त्वाचा मुद्दा आहे: युक्तिवादांचा क्रम महत्त्वाचा! समजा आमची पद्धत एक स्ट्रिंग आणि संख्या घेते:
public class Person {
public static void sayYourAge(String greeting, int age) {
System.out.println(greeting + " " + age);
}
public static void main(String[] args) {
sayYourAge("My age is ", 33);
sayYourAge(33, "My age is "); // Error!
}
}
जर Person
वर्गाची sayYourAge()
पद्धत इनपुट म्हणून एक स्ट्रिंग आणि एक संख्या घेते, तर हा क्रम आहे की हे युक्तिवाद पद्धतीकडे जाणे आवश्यक आहे! जर आम्ही त्यांना वेगळ्या क्रमाने पास केले, तर कंपायलर एक त्रुटी निर्माण करेल आणि व्यक्ती त्याचे वय सांगू शकणार नाही. तसे, कन्स्ट्रक्टर, जे आम्ही शेवटच्या धड्यात समाविष्ट केले आहेत, त्या देखील पद्धती आहेत! तुम्ही त्यांना ओव्हरलोड देखील करू शकता (म्हणजे पॅरामीटर्सच्या वेगवेगळ्या संचांसह अनेक कन्स्ट्रक्टर तयार करा) आणि पास केलेल्या वितर्कांचा क्रम त्यांच्यासाठी देखील मूलभूतपणे महत्त्वपूर्ण आहे. ते वास्तविक पद्धती आहेत! :)
समान पॅरामीटर्ससह पद्धती कशा वापरायच्या
तुम्हाला माहिती आहे,null
जावा मधील एक कीवर्ड आहे. हे समजून घेणे फार महत्वाचे आहे की null
ते ऑब्जेक्ट किंवा डेटा प्रकार नाही . कल्पना करा की आमच्याकडे एक Person
वर्ग आणि introduce()
पद्धत आहे, जी व्यक्तीचे नाव आणि वय घोषित करते. शिवाय, वय मजकूर किंवा संख्या म्हणून पास केले जाऊ शकते.
public class Person {
public void introduce(String name, String age) {
System.out.println("My name is " + name + ". My age is " + age);
}
public void introduce(String name, Integer age) {
System.out.println("My name is " + name + ". My age is " + age);
}
public static void main(String[] args) {
Person alex = new Person();
alex.introduce ("Alex", "twenty-one");
Person mary = new Person();
mary.introduce("Mary", 32);
}
}
आम्ही ओव्हरलोडिंगशी आधीच परिचित आहोत, म्हणून आम्हाला माहित आहे की दोन्ही पद्धती जसे पाहिजे तसे वागतील: माझे नाव अॅलेक्स आहे. माझे वय एकवीस आहे माझे नाव मेरी आहे. माझे वय 32 आहेnull
पण जर आपण स्ट्रिंग किंवा नंबर ऐवजी दुसरा पॅरामीटर म्हणून पास झालो तर काय होईल ?
public static void main(String[] args) {
Person victor = new Person();
victor.introduce("Victor", null);// Ambiguous method call!
}
आम्हाला एक संकलन त्रुटी मिळेल! हे कशामुळे होते आणि "अस्पष्टता" म्हणजे नक्की काय? खरं तर, हे सर्व खूप सोपे आहे. समस्या अशी आहे की आमच्याकडे पद्धतीच्या दोन आवृत्त्या आहेत: एक String
दुसऱ्या युक्तिवादासह आणि Integer
दुसरा युक्तिवाद म्हणून. पण a String
आणि an Integer
दोन्ही असू शकतात null
! कारण ते संदर्भ प्रकार आहेत, null
त्या दोघांसाठी डीफॉल्ट मूल्य आहे. म्हणूनच या परिस्थितीत कंपाइलरने कोणत्या पद्धतीची आवृत्ती कॉल करावी हे समजू शकत नाही. या समस्येचे निराकरण अगदी सोपे आहे. Null
विशिष्ट संदर्भ प्रकारात स्पष्टपणे रूपांतरित केले जाऊ शकते. अशा प्रकारे, जेव्हा तुम्ही एखादी पद्धत कॉल करता, तेव्हा तुम्ही दुसऱ्या युक्तिवादासाठी तुम्हाला हवा असलेला डेटा प्रकार कंसात दर्शवू शकता! कंपाइलर तुमचा "इशारा" समजेल आणि योग्य पद्धत कॉल करेल:
public class Person {
public void introduce(String name, String age) {
System.out.println("Method with two strings!");
System.out.println("My name is " + name + ". My age is " + age);
}
public void introduce(String name, Integer age) {
System.out.println("Method with a string and a number!");
System.out.println("My name is " + name + ". My age is " + age);
}
public static void main(String[] args) {
Person victor = new Person();
victor.introduce("Victor", (String) null);
}
}
आउटपुट: दोन तारांसह पद्धत! माझे नाव व्हिक्टर आहे. माझे वय शून्य आहेint
लक्षात घ्या की जर इंटीजर संदर्भ प्रकाराच्या उदाहरणाऐवजी संख्या पॅरामीटर एक आदिम असते , तर अशी त्रुटी आली नसती.
public class Person {
public void introduce(String name, String age) {
System.out.println("Method with two strings!");
System.out.println("My name is " + name + ". My age is " + age);
}
public void introduce(String name, int age) {
System.out.println("Method with a string and a number!!");
System.out.println("My name is " + name + ". My age is " + age);
}
public static void main(String[] args) {
Person victor = new Person();
victor.introduce("Victor", null);
}
}
तुम्ही का अंदाज लावू शकता? आपण का अंदाज केला असेल तर, चांगले केले! :) कारण आदिम असू शकत नाही null
. आता कंपायलरकडे फक्त एकच पर्याय आहे, म्हणजे introduce()
मेथडला दोन स्ट्रिंगसह कॉल करणे. ही पद्धतीची आवृत्ती आहे जी प्रत्येक वेळी पद्धत कॉल केल्यावर चालेल.
अधिक वाचन: |
---|
GO TO FULL VERSION