JavaRush /Java Blog /Random-TL /Lagda ng pamamaraan

Lagda ng pamamaraan

Nai-publish sa grupo
Kamusta! Kabisado mo na ang paglikha ng sarili mong mga klase, na may mga field at pamamaraan. Ngayon ay pag-uusapan natin nang detalyado ang tungkol sa mga pamamaraan. Siyempre, nagawa namin ito nang higit sa isang beses sa aming mga lektura, ngunit pangunahing pinag-uusapan namin ang tungkol sa mga pangkalahatang punto. Ngayon ay literal nating susuriin ang mga pamamaraan "sa mga bahagi" - malalaman natin kung ano ang binubuo ng mga ito, kung anong mga opsyon para sa paglikha ng mga ito ang umiiral at kung paano mapapamahalaan ang lahat ng ito :) Tara na!Lagda ng pamamaraan - 1

Lagda ng pamamaraan

Ang lahat ng code na naglalarawan ng isang pamamaraan ay tinatawag na isang paraan ng deklarasyon . Kasama sa isang lagda ng pamamaraan ang pangalan ng pamamaraan at mga uri ng parameter sa isang partikular na pagkakasunud-sunod. Ang pangkalahatang hitsura ng ad ay maaaring ilarawan tulad ng sumusunod:
модификатор доступа, тип возвращаемого значения, Name метода(список параметров) {
    // тело метода
}
Kumuha tayo ng isang halimbawa ng mga deklarasyon ng ilang mga pamamaraan ng klase 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("Собака по имени " + name + " говорит \"Гав-гав!\"");
   }

   public void run(int meters) {
       System.out.println("Собака по имени " + name + " пробежала " + meters + " метров!");
   }

   public String getName() {
       return name;
   }
}

1. Access modifier

Palaging unang nakalista ang access modifier. Ang lahat ng mga pamamaraan ng klase Dogay itinalaga ng modifier public. Iyon ay, maaari nating tawagan sila mula sa anumang iba pang klase:
public class Main {

   public static void main(String[] args) {

       Dog butch = new Dog("Бутч");
       butch.run(100);
   }

}
Ang mga pamamaraan ng klase Dog, tulad ng nakikita mo, ay madaling ma-access sa klase Main. Ito ay posible salamat sa modifier public. Mayroong iba pang mga modifier sa Java, at hindi lahat ng mga ito ay magbibigay-daan sa iyo na gumamit ng isang paraan sa loob ng isa pang klase. Pag-uusapan natin sila sa iba pang mga lektura. Ang pangunahing bagay ay tandaan kung ano ang responsable para sa modifier: ang pagkakaroon/kawalan ng access ng pamamaraan sa ibang mga klase :)

2. Ang static na keyword

Isa sa mga pamamaraan Dog, ibig sabihin, main()ay ipinahiwatig ng keyword static. Kung mayroon ito, dapat itong tukuyin pagkatapos ng access modifier. Tandaan sa mga nakaraang lektura na pinag-usapan natin ang mga static na variable ng klase? Kapag inilapat sa mga pamamaraan, ang salitang ito ay may humigit-kumulang na parehong kahulugan. Kung ang isang pamamaraan ay tinukoy bilang static, nangangahulugan ito na maaari itong magamit nang walang reference sa isang partikular na object ng klase. At sa katunayan, upang magpatakbo ng isang static na pamamaraan main()sa isang klase, Doghindi mo kailangang lumikha ng isang halimbawa Dog; ito ay tumatakbo nang wala ito. Kung ang pamamaraang ito ay hindi static, kung gayon upang magamit ito, kailangan muna nating lumikha ng isang bagay.

3. Ibalik ang halaga.

Kung ang aming pamamaraan ay dapat magbalik ng isang bagay, pagkatapos ay ipahiwatig namin ang uri ng halaga ng pagbabalik. Ito ay makikita sa halimbawa ng isang getter getName():
public String getName() {
   return name;
}
Nagbabalik ito ng isang bagay ng uri String. Kung ang pamamaraan ay hindi nagbabalik ng anuman, ang keyword ay tinukoy sa halip na ang uri void, tulad ng sa pamamaraan woof():
public void woof() {
   System.out.println("Собака по имени " + name + " говорит \"Гав-гав!\"");
}

Mga pamamaraan na may parehong pangalan

May mga sitwasyon kung kailan ang aming programa ay nangangailangan ng ilang mga opsyon para sa kung paano gumagana ang isang pamamaraan. Bakit hindi tayo gumawa ng sarili nating artificial intelligence? Ang Amazon ay may Alexa, ang Yandex ay may Alice, kaya bakit tayo mas masahol pa? :) Sa pelikula tungkol sa Iron Man, si Tony Stark ay lumikha ng kanyang sariling natatanging artificial intelligence - JARVIS Magbigay pugay tayo sa kahanga-hangang karakter at pangalanan ang ating AI sa kanyang karangalan :) Ang unang bagay na dapat nating ituro kay Jarvis - batiin ang mga taong pumapasok sa silid (kakaiba kung ang gayong mahusay na talino ay naging walang galang).
public class Jarvis {

   public void sayHi(String name) {
       System.out.println("Good evening, " + name + ", How are you doing?");
   }

   public static void main(String[] args) {
       Jarvis jarvis = new Jarvis();
       jarvis.sayHi("Tony Stark");
   }
}
Output ng console:

Добрый вечер, Тони Старк, How ваши дела?
Malaki! Marunong bumati si Jarvis sa papasok. Kadalasan, siyempre, ito ang magiging may-ari niya - si Tony Stark. Ngunit hindi siya maaaring dumating nang mag-isa! At ang aming pamamaraan sayHi()ay tumatagal lamang ng isang argumento bilang input. At, nang naaayon, isa lamang sa mga darating ang magagawa niyang batiin, at hindi papansinin ang isa pa. Hindi masyadong magalang, sumasang-ayon?:/ Sa kasong ito, upang malutas ang problema, maaari lamang tayong sumulat ng 2 pamamaraan sa klase na may parehong pangalan, ngunit may iba't ibang mga parameter:
public class Jarvis {

   public void sayHi(String firstGuest) {
       System.out.println("Good evening, " + firstGuest + ", How are you doing?");
   }

   public void sayHi(String firstGuest, String secondGuest) {
       System.out.println("Good evening, " + firstGuest + ", " + secondGuest + ", How are you doing?");
   }

}
Ito ay tinatawag na method overloading . Ang overloading ay nagbibigay-daan sa aming programa na maging mas flexible at tumanggap ng iba't ibang opsyon sa trabaho. Suriin natin kung paano ito gumagana:
public class Jarvis {

   public void sayHi(String firstGuest) {
       System.out.println("Good evening, " + firstGuest + ", How are you doing?");
   }

   public void sayHi(String firstGuest, String secondGuest) {
       System.out.println("Good evening, " + firstGuest + ", " + secondGuest + ", How are you doing?");
   }

   public static void main(String[] args) {
       Jarvis jarvis = new Jarvis();
       jarvis.sayHi("Tony Stark");
       jarvis.sayHi("Tony Stark", "Captain America");
   }
}
Output ng console:

Добрый вечер, Тони Старк, How ваши дела? 
Добрый вечер, Тони Старк, Капитан Америка, How ваши дела?
Mahusay, gumana ang parehong mga pagpipilian :) Gayunpaman, hindi namin nalutas ang problema! Paano kung may tatlong bisita? Siyempre, maaari naming i-overload muli ang paraan sayHi()upang tanggapin ang mga pangalan ng tatlong bisita. Ngunit maaaring mayroong 4 o 5 sa kanila. At iba pa ang ad infinitum. Mayroon bang ibang paraan upang turuan si Jarvis na magtrabaho sa anumang bilang ng mga pangalan, nang walang isang milyong overload na pamamaraan sayHi()? :/ Syempre meron! Kung hindi, ang Java ba ang pinakasikat na programming language sa mundo? ;)
public class Jarvis {

   public void sayHi(String...names) {

       for (String name: names) {
           System.out.println("Good evening, " + name + ", How are you doing?");
       }
   }

   public static void main(String[] args) {
       Jarvis jarvis = new Jarvis();
       jarvis.sayHi("Tony Stark");
       System.out.println();
       jarvis.sayHi("Tony Stark", "Captain America");
   }
}
Ang record ( String...names) na ipinasa bilang isang parameter ay nagbibigay-daan sa amin na ipahiwatig na ang isang tiyak na bilang ng mga string ay ipinasa sa pamamaraan. Hindi namin tinukoy nang maaga kung ilan ang dapat, kaya ang pagpapatakbo ng aming pamamaraan ngayon ay nagiging mas nababaluktot:
public class Jarvis {

   public void sayHi(String...names) {

       for (String name: names) {
           System.out.println("Good evening, " + name + ", How are you doing?");
       }
   }

   public static void main(String[] args) {
       Jarvis jarvis = new Jarvis();
       jarvis.sayHi("Tony Stark", "Captain America", "Black Widow", "Hulk");
   }
}
Output ng console:

Добрый вечер, Тони Старк, How ваши дела? 
Добрый вечер, Капитан Америка, How ваши дела? 
Добрый вечер, Черная Вдова, How ваши дела? 
Добрый вечер, Халк, How ваши дела?
Sa loob ng pamamaraan, iniikot namin ang lahat ng mga argumento at naglalabas ng mga yari na parirala na may mga pangalan sa console. Dito gumagamit kami ng isang pinasimple na loop for-each(natagpuan mo na ito). Ito ay mahusay dahil ang pagsulat ay String...namestalagang nangangahulugan na ang lahat ng naipasa na mga parameter ay inilalagay sa isang array ng compiler. Samakatuwid, namesmaaari kang magtrabaho sa isang variable tulad ng sa isang array, kabilang ang pag-loop sa pamamagitan nito. Bukod dito, gagana ito para sa anumang bilang ng mga inilipat na linya! Dalawa, sampu, kahit isang libo - ang pamamaraan ay gagana nang mapagkakatiwalaan sa anumang bilang ng mga bisita. Higit na mas maginhawa kaysa sa paggawa ng mga overload para sa lahat ng posibleng opsyon, hindi ka ba sumasang-ayon? :) Magbigay tayo ng isa pang halimbawa ng paraan ng overloading. Magdagdag tayo ng paraan sa Jarvis printInfoFromDatabase(). Ito ay magpi-print ng impormasyon tungkol sa tao mula sa database hanggang sa console. Kung ang database ay nagsasaad na ang isang tao ay isang superhero o supervillain, ang impormasyong ito ay ipapakita din sa screen:
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("Также известен How супергерой " + nickname);
       } else {
           System.out.println("Также известен How суперзлодей " + nickname);
       }
   }

   public static void main(String[] args) {
       Jarvis jarvis = new Jarvis();
       jarvis.printInfoFromDatabase("Лора Палмер. Дата рождения - 22 июля 1972, город Твин Пикс, штат Washington");
       System.out.println();
       jarvis.printInfoFromDatabase("Макс Эйзенхарт. Рост 188см, вес 86 кг.", true, "Магнето");
   }
}
Konklusyon:

Лора Палмер. Дата рождения - 22 июля 1972, город Твин Пикс, штат Washington
Макс Эйзенхарт. Рост 188см, вес 86 кг 
Также известен How суперзлодей Магнето
Ito ay kung paano gumagana ang aming pamamaraan depende sa data na ipinapasa namin dito. Isa pang mahalagang punto:Ang pagkakasunud-sunod ng mga argumento ay mahalaga! Sabihin nating ang aming pamamaraan ay tumatagal ng isang string at isang numero bilang input:
public class Man {

   public static void sayYourAge(String greeting, int age) {
       System.out.println(greeting + " " + age);
   }

   public static void main(String[] args) {

       sayYourAge("My age - ", 33);
       sayYourAge(33, "My age - "); //error!
   }
}
Kung ang isang paraan ng sayYourAge()klase Manay tumatagal ng isang string at isang numero bilang input, ito ang pagkakasunud-sunod kung saan kailangan nilang maipasa sa programa! Kung ipapasa namin ang mga ito sa ibang pagkakasunud-sunod, ang compiler ay magtapon ng isang error at hindi masasabi ng tao ang kanyang edad. Sa pamamagitan ng paraan, ang mga konstruktor na aming natalakay sa huling panayam ay mga pamamaraan din! Maaari din silang ma-overload (lumikha ng ilang mga konstruktor na may iba't ibang hanay ng mga argumento) at para sa kanila ang pagkakasunud-sunod ng pagpasa ng mga argumento ay mahalaga din sa panimula. Mga totoong pamamaraan! :)

Paano tumawag sa mga pamamaraan na may katulad na mga parameter

Tulad ng alam mo, sa Java mayroong isang salita bilang null. Kapag nagtatrabaho dito, napakahalagang maunawaan na ang null ay hindi isang bagay o isang uri ng data. Isipin na mayroon tayong class Man at isang paraan introduce()na nagdedeklara ng pangalan at edad ng isang tao. Sa kasong ito, ang edad ay maaaring ihatid sa anyo ng teksto, o maaari itong ipahayag bilang isang numero.
public class Man {

   public void introduce(String name, String age) {
       System.out.println("Меня зовут " + name + ", мой возраст - " + age);
   }

   public void introduce(String name, Integer age) {
       System.out.println("Меня зовут " + name + ", мой возраст - " + age);
   }

   public static void main(String[] args) {

       Man sasha = new Man();
       sasha.introduce("Sasha", "двадцать один");

       Man masha = new Man();
       masha.introduce("Мария", 32);
   }
}
Pamilyar na kami sa overloading, kaya alam namin na gagana ang pamamaraan tulad ng inaasahan sa parehong oras:

Меня зовут Саша, мой возраст - двадцать один 
Меня зовут Мария, мой возраст - 32 
Ngunit ano ang mangyayari kung ipapasa natin ang null bilang pangalawang parameter, hindi isang string o numero?
public static void main(String[] args) {

   Man victor = new Man();
   victor.introduce("Виктор", null);//Ambiguous method call!
}
Makakakuha kami ng error sa compilation! Ang error na "Ambiguous method call" ay isinalin bilang "ambiguous method call". Bakit ito maaaring lumitaw at ano ang "kalabuan"? Ito ay talagang simple. Ang bagay ay, mayroon kaming dalawang variant ng pamamaraan: kasama Stringat Integerbilang pangalawang argumento. Ngunit pareho String, at Integermaaaring null! Para sa parehong mga uri (dahil ang mga ito ay mga uri ng sanggunian), ang null ay ang default na halaga. Iyon ang dahilan kung bakit ang compiler sa sitwasyong ito ay hindi maaaring malaman kung aling bersyon ng pamamaraan ang dapat itong tawagan. Ang paglutas ng problemang ito ay medyo simple. Ang punto ay ang null ay maaaring tahasang ma-convert sa isang partikular na uri ng sanggunian. Samakatuwid, kapag tumatawag sa isang paraan, maaari mong ipahiwatig sa panaklong ang uri ng data na kailangan mo para sa pangalawang argumento! Mauunawaan ng compiler ang iyong "pahiwatig" at tatawagan ang kinakailangang paraan:
public class Man {

   public void introduce(String name, String age) {
       System.out.println("Метод с двумя строками!");
       System.out.println("Меня зовут " + name + ", мой возраст - " + age);
   }

   public void introduce(String name, Integer age) {
       System.out.println("Метод со строкой и числом!");
       System.out.println("Меня зовут " + name + ", мой возраст - " + age);
   }

   public static void main(String[] args) {

       Man victor = new Man();
       victor.introduce("Виктор", (String) null);
   }
}
Konklusyon:

Метод с двумя строками! 
Меня зовут Виктор, мой возраст - null
Ngunit kung ang numeric na parameter ay primitive intat hindi isang object ng isang uri ng reference Integer, hindi mangyayari ang ganitong error.
public class Man {

   public void introduce(String name, String age) {
       System.out.println("Метод с двумя строками!");
       System.out.println("Меня зовут " + name + ", мой возраст - " + age);
   }

   public void introduce(String name, int age) {
       System.out.println("Метод со строкой и числом!!");
       System.out.println("Меня зовут " + name + ", мой возраст - " + age);
   }

   public static void main(String[] args) {

       Man victor = new Man();
       victor.introduce("Виктор", null);
   }
}
Nahulaan mo na ba kung bakit? Kung nahulaan mo ito, magaling :) Dahil ang mga primitive ay hindi maaaring katumbas ng null. Ngayon ang compiler ay mayroon lamang isang opsyon para sa pagtawag sa pamamaraan introduce()- na may dalawang linya. Ito ang bersyong ito ng pamamaraan na ipoproseso sa tuwing tatawagin ang pamamaraan.
Mga komento
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION