"हाय अमिगो! मला आशा आहे की तुम्हाला तुमच्या स्वतःच्या पद्धती वापरून कार्ये सोडवण्याचा आनंद मिळाला असेल आणि तुम्हाला हे समजले असेल की पद्धती तयार करणे किती सोयीस्कर आहे. आता आपण सर्वांत मनोरंजक विषयाबद्दल बोलूया."

"तुम्ही माझी आवड निर्माण केली आहे, डिएगो... एक नवीन विषय?"

"प्रत्येक विषय तुमच्यासाठी नवीन आहे, माझ्या तरुण रोबोट! आणि हा अपवाद नाही. जरी पुन्हा एकदा ते पद्धतींबद्दल आहे. तुम्ही कदाचित आधीच लक्षात घेतले असेल की अशा पद्धतींमधून आम्ही युक्तिवाद करू शकतो. एकदा आम्ही पद्धतीमध्ये प्रवेश करू शकतो System.out.println(). , आम्ही त्यांना पॅरामीटर्स म्हणून संबोधतो."

"पॅरामीटर्स म्हणजे आपण कंसात काय लिहितो?"

"होय, अगदी. आणि खरं तर, पॅरामीटर्स आम्हाला पद्धती तयार करून आणि वापरण्यापासून मिळणारे फायदे मोठ्या प्रमाणात वाढवतात."

"तुम्ही ते वापरण्याबद्दल काय म्हणत आहात ते मला समजले, आणि असे दिसून आले की मी ते आधीच केले आहे. आम्ही पॅरामीटर्ससह पद्धत कशी घोषित करू?"

"हे खरं तर अगदी सोपे आहे:

public static void name(parameters)
{
  method body
}

name" पद्धतीचे अनन्य नाव कुठे आहे आणि method bodyते मेथड बनवणाऱ्या कमांड्सचे प्रतिनिधित्व करते. आणि parametersस्वल्पविरामाने विभक्त केलेल्या मेथड पॅरामीटर्ससाठी प्लेसहोल्डर आहे."

"हम्म... मला वाटतं मला समजलं... किंवा कदाचित नाही..."

"मी तुम्हाला या टेम्प्लेटबद्दल आणखी काही तपशील देतो जेणेकरून तुम्हाला खात्री असेल की तुम्हाला समजले आहे की तुम्हाला समजले आहे:

public static void name(Type1 name1, Type2 name2, Type3 name3)
{
  method body
}

येथे काही उदाहरणे आहेत:

कोड स्पष्टीकरण
public static void print(String str)
{
}
printपॅरामीटरसह पद्धत घोषित केली आहे :
String str
public static void print(String str, int count)
{
}
पद्धत printदोन पॅरामीटर्ससह घोषित केली आहे:
String str
int count
public static void write(int x, int y)
{
}
पद्धत writeदोन पॅरामीटर्ससह घोषित केली आहे:
int x
int y

"अहो... आता हे स्पष्ट झाले आहे. आणि जर आपल्याला पद्धतीमध्ये पॅरामीटर्स नको असतील तर आपण कंस रिकामे ठेवू."

"अगदी. मुळात, पॅरामीटर्स हे एका पद्धतीतील विशेष चल असतात. त्यांच्या मदतीने, जेव्हा ती कॉल केली जाते तेव्हा तुम्ही विविध व्हॅल्यूज पास करू शकता. आणि जर तुम्हाला व्हॅल्यू पास करण्याची गरज नसेल, तर तुम्ही कंस रिकामे ठेवता.

"उदाहरणार्थ, एक पद्धत लिहूया जी मजकूराची दिलेली ओळ दिलेल्या संख्येने दाखवते. हे कसे करायचे याबद्दल काही विचार?"

"ठीक आहे... स्क्रीनवर स्ट्रिंग दाखवण्यासाठी कोड कसा लिहायचा हे मला चांगले माहीत आहे असे दिसते..."

"तुम्ही प्रदर्शित होणारी स्ट्रिंग कशी निर्दिष्ट कराल? आणि तुम्ही प्रदर्शित केलेल्या ओळींची संख्या कशी निर्दिष्ट कराल? तुम्ही अंदाज लावू शकता?"

"गोष्टी स्पष्ट होऊ लागल्या आहेत... बहुधा मेथड पॅरामीटर्सच्या मदतीने?"

"नक्की. मजकूराच्या ओळीसाठी एक स्ट्रिंग पॅरामीटर आणि प्रदर्शित केलेल्या ओळींच्या संख्येसाठी एक अंकीय पॅरामीटर. हे करणारा कोड यासारखा दिसेल:

कोड स्पष्टीकरण
class Solution
{
   public static void printLines(String text, int count)
   {
     for (int i = 0; i < count; i++)
       System.out.println(text);
   }

   public static void main(String[] args)
   {
     printLines("Hi", 10);
     printLines("Bye", 20);
   }
}

आम्ही printLinesखालील पॅरामीटर्ससह पद्धत घोषित केली:
String text, int count

पद्धत स्ट्रिंग text countवेळा दर्शवते



आम्ही printLinesविविध पॅरामीटर्ससह पद्धत कॉल करतो

"प्रत्येक वेळी जेव्हा एखादी पद्धत कॉल केली जाते, तेव्हा त्याचे पॅरामीटर्स पास केलेली मूल्ये नियुक्त केली जातात आणि त्यानंतरच आपण पद्धतीच्या अंतर्गत कमांड कार्यान्वित करण्यास सुरवात करतो.

युक्तिवाद

"मला तुम्ही पॅरामीटर्स असलेल्या कॉलिंग पद्धतींवर विशेष लक्ष द्यावे अशी माझी इच्छा आहे. मेथडला पास केलेल्या व्हॅल्यूजला सामान्यतः वितर्क म्हटले जाते जेव्हा ते मेथडमध्ये पास केले जातात.

चला आमच्या उदाहरणाकडे आणखी एक नजर टाकूया:

कोड स्पष्टीकरण
class Solution
{
   public static void printLines(String text, int count)
   {
     for (int i = 0; i < count; i++)
       System.out.println(text);
   }

   public static void main(String[] args)
   {
     printLines("Hi", 10);
     printLines("Bye", 20);
   }
}

आम्ही printLinesखालील पॅरामीटर्ससह पद्धत घोषित केली:
String text, int count

पद्धत स्ट्रिंग text countवेळा दर्शवते


आम्ही printLinesखालील वितर्कांसह पद्धत कॉल करतो:
text = "Hi"; count = 10;
text = "Bye"; count = 20;

"जेव्हा printLinesपद्धत पहिल्यांदा कॉल केली गेली, तेव्हा तिच्या पॅरामीटर्सना खालील मूल्ये नियुक्त केली गेली:

String text = "Hi", int count = 10.

"जेव्हा printLinesपद्धत दुसऱ्यांदा कॉल केली गेली, तेव्हा त्याचे पॅरामीटर्स भिन्न मूल्ये नियुक्त केले गेले:

String text = "Bye", int count = 20.

"पॅरामीटर्स ही व्हेरिएबल्सपेक्षा जास्त आणि कमी नसतात ज्यांना पद्धत कॉल केल्यावर विशिष्ट मूल्ये नियुक्त केली जातात. मूल्ये "Hi", "Bye", 10, आणि 20स्वतःला वितर्क म्हणतात."

"मी फरक लक्षात ठेवण्याचा प्रयत्न करेन आणि या संकल्पनांना गोंधळात टाकणार नाही."

पद्धत कॉल करताना परस्परविरोधी चल नावे

"जेव्हा तुम्ही एखादी पद्धत कॉल करता, तेव्हा तुम्ही वितर्क म्हणून व्हेरिएबल्स वापरू शकता.

"बरं, याचा अर्थ होतो!"

"हे अर्थपूर्ण आहे, परंतु ते संभाव्यत: काही अडचणी निर्माण करू शकते. चला पुन्हा एकदा आमच्या उदाहरणाकडे जाऊया, परंतु यावेळी आम्ही युक्तिवाद वेगळ्या व्हेरिएबल्समध्ये हलवू:

कोड स्पष्टीकरण
class Solution
{
   public static void printLines(String text, int count)
   {
     for (int i = 0; i < count; i++)
       System.out.print(text);
   }

   public static void main(String[] args)
   {
     String str = "Hi";
     String n = 10;
     printLines(str, n);
   }
}

आम्ही printLinesखालील पॅरामीटर्ससह पद्धत घोषित केली:
String text, int count

पद्धत स्ट्रिंग text countवेळा दर्शवते



आम्ही printLinesखालील वितर्कांसह पद्धत कॉल करतो:
text = str;
count = n;

"हम्म... मला काही अडचण दिसत नाही. आमच्याकडे व्हेरिएबल आहे . मेथड कॉल केल्यावर strत्याची व्हॅल्यू पॅरामीटरला दिली जाते . आमच्याकडे व्हेरिएबल आहे. मेथड कॉल केल्यावर त्याची व्हॅल्यू पॅरामीटरला दिली जाते ." "आतापर्यंत, सर्वकाही स्पष्ट आहे."textncount

"चांगले, चांगले. आता या पद्धतीत आपल्या व्हेरिएबल्सचे नाव बदलूया main:

कोड स्पष्टीकरण
class Solution
{
   public static void printLines(String text, int count)
   {
     for (int i = 0; i < count; i++)
       System.out.print(text);
   }

   public static void main(String[] args)
   {
     String text = "Hi";
     String count = 10;
     printLines(text, count);
   }
}

आम्ही printLinesखालील पॅरामीटर्ससह पद्धत घोषित केली:
String text, int count

पद्धत स्ट्रिंग text countवेळा दर्शवते



आम्ही printLinesखालील वितर्कांसह पद्धत कॉल करतो:
text = text;
count = count;

"दोन गोष्टींकडे लक्ष द्या

प्रथम: आपल्याकडे वेगवेगळ्या पद्धतींमध्ये समान नावाचे व्हेरिएबल्स आहेत. हे भिन्न व्हेरिएबल्स आहेत (आम्ही मुद्दाम भिन्न रंग वापरून त्यांचे चित्रण करतो). सर्व काही मागील उदाहरणाप्रमाणेच कार्य करते, जेथे पद्धतीमधील व्हेरिएबल्सचे mainनाव दिले गेले होते strआणि n.

दुसरा: जेव्हा पद्धत कॉल केली जाते तेव्हा काहीही जादुई घडत नाही. पॅरामीटर्सना फक्त युक्तिवाद मूल्ये नियुक्त केली जातात. ते संख्या, स्ट्रिंग, व्हेरिएबल्स किंवा एक्सप्रेशन्स असोत.

"आम्ही मुख्य पद्धतीमध्ये व्हेरिएबल्सचे नाव बदलल्यानंतर, काहीही बदलले नाही. ते पूर्वी वेगवेगळ्या पद्धतींमध्ये भिन्न व्हेरिएबल्स होते आणि म्हणून ते राहतील. दोन व्हेरिएबल्समध्ये कोणताही जादूचा संबंध नाही text."

"आता मला कळले."

पद्धतींचे संदर्भ उत्तीर्ण करणे

"मला आशा आहे की पद्धतींमध्ये युक्तिवाद करण्याबद्दल मी तुम्हाला सांगितलेली प्रत्येक गोष्ट तुम्ही आधीच आत्मसात केली असेल. मी असे म्हणतो, कारण आम्ही आता या विषयात थोडे खोल जाणार आहोत. काळजीपूर्वक ऐका."

"तुम्हाला आधीच माहित आहे की Java मधील काही व्हेरिएबल्स स्वतःची मूल्ये साठवून ठेवत नाहीत, तर त्याऐवजी संदर्भ , म्हणजे मूल्ये असलेल्या मेमरी ब्लॉकचा पत्ता. स्ट्रिंग व्हेरिएबल्स आणि अॅरे व्हेरिएबल्स अशा प्रकारे कार्य करतात.

"जेव्हा डेव्हलपर अॅरे व्हेरिएबलला दुसरे अॅरे व्हेरिएबल नियुक्त करतो, तेव्हा काय होते?"

"ते मग त्याच पत्त्यावर निर्देश करतात का?"

"बरोबर. दोन व्हेरिएबल्स मेमरीमधील समान जागेचा संदर्भ घेऊ लागतात:

"आणि या व्हेरिएबल्सपैकी एक पद्धत पॅरामीटर असल्यास काय होईल?

कोड स्पष्टीकरण
class Solution
{
   public static void sum(int[] data)
   {
     int total = 0;
     for (int i = 0; i < data.length; i++)
       total = total + data[i];
     System.out.println(total);
   }
   
   public static void main(String[] args)
   {
     int[] months = {31, 28, 31, 30, 31, 30, 31, 31, 30};
     sum(months);
   }
}


ही sumपद्धत पास केलेल्या अॅरेमधील संख्यांची बेरीज मोजते आणि ती स्क्रीनवर दाखवते

"अगदी तीच गोष्ट घडते: dataपॅरामीटरमध्ये व्हेरिएबल सारख्याच मेमरी क्षेत्राचा संदर्भ असेल months. जेव्हा पद्धत कॉल केली जाते, तेव्हा एक साधी असाइनमेंट येते: .data = months

"आणि दोन्ही व्हेरिएबल्स एक पूर्णांक संचयित करणार्‍या मेमरीच्या समान क्षेत्राचा संदर्भ देत असल्याने, पद्धत sumकेवळ अॅरेमधील मूल्ये वाचू शकत नाही तर ती बदलू शकते!"

"मला समजले आहे, पण मला आणखी उदाहरणे हवी आहेत!"

"बरं, उदाहरणार्थ, आम्ही आमची स्वतःची पद्धत लिहू शकतो जी समान मूल्यासह द्वि-आयामी अॅरे भरते. हे असे दिसते:

कोड स्पष्टीकरण
class Solution
{
   public static void fill(int[][] data, int value)
   {
     for (int i = 0; i < data.length; i++)
     {
       for (int j = 0; j < data[i].length; j++)
         data[i][j] = value;
     }
  }

   public static void main(String[] args)
   {
     int[][] months = {{31, 28}, {31, 30, 31}, {30, 31, 31}};
     fill (months, 8);
   }
}


ही fill पद्धत पास केलेल्या द्विमितीय अॅरेमधील प्रत्येक सेलवर पुनरावृत्ती करते आणि valueत्यांना नियुक्त करते.






आम्ही द्विमितीय अॅरे तयार करतो.
आम्ही संपूर्ण अॅरे क्रमांकाने भरतो 8.

समान नावाच्या पद्धती

"आता पुन्हा एकदा पद्धतीच्या नावांकडे वळू."

"नावांबद्दल आणखी काय म्हणता येईल याची मी कल्पना करू शकत नाही!"

"ठीक आहे, जावा भाषेच्या मानकांसाठी एकाच वर्गातील सर्व पद्धतींना अद्वितीय नावे असणे आवश्यक आहे.

"म्हणून, एकाच वर्गात दोन समान नामांकित पद्धती घोषित करणे अशक्य आहे?"

"आता — नीट लक्ष द्या! वर्गातील पद्धतींना खरोखरच एकसारखी नावे असू शकतात! परंतु या प्रकरणात, त्यांची भिन्न मापदंड असणे आवश्यक आहे. दुसऱ्या शब्दांत, समानतेसाठी पद्धतींची तुलना केली जाते, केवळ नावे विचारात घेतली जात नाहीत तर पॅरामीटर्सचे प्रकार ! लक्षात घ्या की मी विशेषतः प्रकार सांगितले आहेत. पॅरामीटर्सची नावे विचारात घेतली जात नाहीत . उदाहरणे:

कोड स्पष्टीकरण
void fill(int[] data, int value) {
}
void fill(int[][] data, int value) {
}
void fill(int[][][] data, int value)  {
}
या तीन पद्धती वेगवेगळ्या पद्धती आहेत. ते एकाच वर्गात घोषित केले जाऊ शकतात.
void print(String str) {
}
void print(String str, String str2) {
}
void print(int val) {
}
void print(double val) {
}
void print() {
}
या पाच पद्धतींपैकी प्रत्येक वेगळी मानली जाते . ते एकाच वर्गात घोषित केले जाऊ शकतात.
void sum(int x, int y) {
}
void sum(int data, int value) {
}
"या दोन पद्धती समान मानल्या जातात , म्हणजे त्या एकाच वर्गात घोषित केल्या जाऊ शकत नाहीत."

"मी पूर्णपणे गोंधळलो आहे! आपल्याला या सर्वांची गरज का आहे? काही पद्धती समान का मानल्या जातात , तर काही वेगळ्या आहेत? आणि पद्धतीची विशिष्टता ठरवताना पॅरामीटरची नावे का विचारात घेतली जात नाहीत? येथे विशिष्टता का आवश्यक आहे? सर्व?"

"गोष्ट अशी आहे की जेव्हा कंपायलर प्रोग्राम संकलित करतो, तेव्हा त्याला माहित असणे आवश्यक आहे की आपण कोणत्याही ठिकाणी कॉल करू इच्छिता.

"उदाहरणार्थ, तुम्ही लिहिल्यास , कंपायलर हुशार आहे आणि तुम्ही येथे पॅरामीटरसह पद्धत कॉल करू इच्छिता असा निष्कर्ष सहज काढेल . पण तुम्ही लिहिल्यास , कंपाइलरला पॅरामीटरसह मेथडला कॉल दिसेल . त्याची कल्पना नाही. पद्धत घोषित करताना प्रोग्रामरने पॅरामीटरला काय नाव दिले."System.out.println("Hi")println()StringSystem.out.println(1.0)println()double

अहाहा, असे वाटू लागले आहे!

"जेव्हा एखादी पद्धत कॉल केली जाते, तेव्हा कंपाइलर हे सुनिश्चित करतो की वितर्कांचे प्रकार पॅरामीटर्सच्या प्रकारांशी जुळतात. ते वितर्कांच्या नावाकडे लक्ष देत नाही. Java मध्ये, पॅरामीटरची नावे कंपायलरला कोणती पद्धत ठरवायला मदत करत नाहीत कॉल. ​​प्रोग्रामरना त्यांची गरज असते, कंपाइलरची नाही.

"आणि मला वाटते की पद्धतीचे वेगळेपण ठरवताना ते विचारात घेतले जात नाहीत का?"

"होय, ते पूर्णपणे बरोबर आहे. पद्धतीचे नाव आणि त्याच्या पॅरामीटर्सच्या प्रकारांना पद्धत स्वाक्षरी म्हणतात . उदाहरणार्थ, sum (int, int)"

"म्हणून प्रत्येक वर्गात अद्वितीय नावांच्या पद्धतींऐवजी अद्वितीय स्वाक्षरी असलेल्या पद्धती असणे आवश्यक आहे."

"शाबास, अमिगो! तुम्ही हा धडा उत्तम प्रकारे मांडला आहे. काही अस्पष्ट राहिल्यास, घाबरू नका. हा विषय काही कामांनंतर स्पष्ट होईल."