Usul goly

Toparda çap edildi
Salam! Meýdanlar we usullar bilen öz synplaryňyzy döretmegi eýýäm özleşdirdiňiz. Bu gün usullar barada jikme-jik gürleşeris. Elbetde, leksiýalarymyzda muny birnäçe gezek etdik, ýöne esasan umumy pikirler hakda gürleşdik. Bu gün usullary “bölekleýin” analiz ederis - olaryň nämeden ybaratdygyny, olary döretmegiň haýsy wariantlarynyň bardygyny we bularyň hemmesini nädip dolandyryp boljakdygyny öwreneris :) Geliň!Usul goly - 1

Usul goly

Usuly suratlandyrýan ähli kodlara usul deklarasiýasy diýilýär . Usul goly, belli bir tertipde usulyň adyny we parametr görnüşlerini öz içine alýar. Mahabatyň umumy görnüşini şeýle suratlandyryp bolar:
модификатор доступа, тип возвращаемого значения, Name метода(список параметров) {
    // тело метода
}
Geliň, synpyň birnäçe usulynyň beýanyndan mysal alalyň 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. Giriş üýtgediji

Giriş modifikatory hemişe birinji ýerde görkezilýär. Classhli synp usullary Dogüýtgediji tarapyndan kesgitlenýär public. .Agny, beýleki synplardan olara jaň edip bileris:
public class Main {

   public static void main(String[] args) {

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

}
DogGörşüňiz ýaly synp usullary synpda aňsat bolýar Main. Bu üýtgedijiniň kömegi bilen mümkindir public. Java-da başga üýtgedijiler bar we bularyň hemmesi başga bir synpyň içinde usul ulanmaga mümkinçilik bermez. Olar hakda beýleki leksiýalarda gürleşeris. Esasy zat, üýtgedijiniň näme üçin jogapkärdigini ýatdan çykarmaly däl: usulyň beýleki synplarda elýeterliligi / elýeterliligi :)

2. Statiki açar söz

Usullaryň biri Dog, ýagny main()açar söz bilen görkezilýär static. Eger bar bolsa, giriş üýtgedijisinden soň kesgitlenmeli. Öňki leksiýalarda statiki synp üýtgeýjileri hakda gürleşipdikmi? Usullar ulanylanda bu söz takmynan birmeňzeş many berýär. Eger bir usul görkezilen bolsa static, bu belli bir synp obýektine salgylanmazdan ulanylyp bilinjekdigini aňladýar. Hakykatdanam, main()synpda statiki usuly işletmek üçin Dogmysal döretmegiň zerurlygy ýok Dog, ol onsuz işleýär. Bu usul statik bolmadyk bolsa, ony ulanmak üçin ilki bilen bir obýekt döretmeli bolarys.

3. Gaýtarmagyň bahasy

Usulymyz bir zady yzyna gaýtarmaly bolsa, onda yzyna gaýtaryş bahasynyň görnüşini görkezeris. Muny almagyň mysalynda görmek bolýar getName():
public String getName() {
   return name;
}
Görnüşi görkezýär String. Usul hiç zady yzyna gaýtarmasa, açar söz void, usuldaky ýaly görnüşiň ýerine görkezilýär woof():
public void woof() {
   System.out.println("Собака по имени " + name + " говорит \"Гав-гав!\"");
}

Birmeňzeş at bilen usullar

Programmamyzyň usulyň işlemegi üçin birnäçe wariant talap edýän ýagdaýlar bar. Näme üçin öz emeli intellektimizi döretmeýäris? “Amazon” -da “Alexa”, “Yandex” -iň Elisasy bar, näme üçin biz has erbet? :) Demir adam baradaky filmde Toni Stark özüniň ajaýyp emeli intellektini döretdi - JARVIS Geliň, ajaýyp keşbe hormat goýalyň we AI-ni onuň hormatyna goýalyň :) The visarwisi öwretmeli ilkinji zadymyz - otaga girýänlere salam beriň (şeýle beýik akyl edepsiz bolsa geň bolardy).
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");
   }
}
Konsol çykyşy:

Добрый вечер, Тони Старк, How ваши дела?
Gowy! Visarwis giren birine nädip salam bermelidigini bilýär. Elbetde, köplenç onuň eýesi - Toni Stark bolar. Heöne ol ýeke gelip bilmez! Usulymyz sayHi()giriş hökmünde diňe bir argument alýar. Şoňa görä-de, gelenleriň diňe birine salam berip biler, beýlekisini äsgermezlik eder. Gaty sypaýy däl, ylalaşýarsyňyzmy ?: / Bu ýagdaýda meseläni çözmek üçin synpda diňe bir at bilen, ýöne dürli parametrler bilen 2 usul ýazyp bileris:
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?");
   }

}
Bu usuldan artykmaç ýüklemek diýilýär . Artykmaç ýüklemek programmamyza has çeýe we dürli iş wariantlaryny ýerleşdirmäge mümkinçilik berýär. Onuň nähili işleýändigini barlap göreliň:
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");
   }
}
Konsol çykyşy:

Добрый вечер, Тони Старк, How ваши дела? 
Добрый вечер, Тони Старк, Капитан Америка, How ваши дела?
Gowy, iki wariantam işledi :) Şeýle-de bolsa, meseläni çözmedik! Üç myhman bar bolsa näme etmeli? Elbetde, sayHi()üç myhmanyň adyny kabul etmek üçin usuly täzeden ýükläp bileris. Themöne olardan 4 ýa-da 5 bolup biler we mahabat infinitumda. Visarwisi million usuldan artykmaç ýüklemezden, islendik at bilen işlemegi öwretmegiň başga bir usuly barmy sayHi()? : / Elbetde bar! Otherwiseogsam, Java dünýäde iň meşhur programmirleme dili bolarmy? ;)
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");
   }
}
Parametr hökmünde geçirilen ýazgy String...namesbize belli bir setiriň usula geçendigini görkezmäge mümkinçilik berýär. Näçe bolmalydygyny öňünden kesgitlemeýäris, şonuň üçin usulymyzyň işleýşi indi has çeýe bolýar:
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");
   }
}
Konsol çykyşy:

Добрый вечер, Тони Старк, How ваши дела? 
Добрый вечер, Капитан Америка, How ваши дела? 
Добрый вечер, Черная Вдова, How ваши дела? 
Добрый вечер, Халк, How ваши дела?
Usulyň içinde, ähli argumentleri gözden geçirýäris we konsola atlar bilen taýýar sözlemleri çykarýarys. Bu ýerde ýönekeýleşdirilen aýlaw ulanýarys for-each(eýýäm duş geldiňiz). Ajaýyp, sebäbi ýazmak, String...namesaslynda, geçen ähli parametrleriň düzüji tarapyndan massiwde goýulýandygyny aňladýar. Şonuň üçin namesüýtgeýji bilen massiwdäki ýaly, şol sanda aýlaw bilen hem işläp bilersiňiz. Mundan başga-da, islendik göçürilen setirler üçin işlär! Iki, on, hatda müň - bu usul islendik myhman bilen ygtybarly işlär. Possiblehli mümkin bolan wariantlar üçin artykmaç ýüklemekden has amatly, şeýlemi? :) Geliň, usuly artykmaç ýüklemegiň başga bir mysalyny getireliň. Visarwise bir usul goşalyň printInfoFromDatabase(). Adam hakda maglumat bazasyndan konsola çenli çap ediler. Maglumatlar bazasy adamyň super gahrymanyň ýa-da gözegçidigini görkezýän bolsa, bu maglumatlar ekranda hem görkeziler:
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, "Магнето");
   }
}
Netije:

Лора Палмер. Дата рождения - 22 июля 1972, город Твин Пикс, штат Washington
Макс Эйзенхарт. Рост 188см, вес 86 кг 
Также известен How суперзлодей Магнето
Ine, usulymyz, geçýän maglumatlarymyza baglylykda işleýär. Anotherene bir möhüm nokat:Argumentleriň tertibi möhümdir! Usulymyz giriş hökmünde bir setir we san alýar diýeliň:
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!
   }
}
Eger sayYourAge()synp usuly Mangiriş hökmünde bir setir we san alsa, bu programmada berilmeli tertip! Olary başga tertipde geçirsek, düzüji ýalňyşlyk goýberer we adam ýaşyny aýdyp bilmez. Theeri gelende aýtsak, soňky leksiýada açan konstruktorlarymyz hem usullardyr! Şeýle hem olara aşa ýüklenip bilner (dürli argumentli birnäçe konstruktor dörediň) we olar üçin argumentleriň tertibi hem möhümdir. Hakyky usullar! :)

Meňzeş parametrleri bolan usullary nädip çagyrmaly

Bilşiňiz ýaly, Java-da null ýaly söz bar. Munuň bilen iş salyşanyňyzda, null-yň ne obýekt, ne-de maglumat görnüşi bolandygyna düşünmek möhümdir. Adam synpyny we introduce()adamyň adyny we ýaşyny beýan edýän usul bar diýip göz öňüne getiriň. Bu ýagdaýda ýaş tekst görnüşinde ýa-da san hökmünde aňladylyp bilner.
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);
   }
}
Artykmaç ýüklemek bilen eýýäm tanyş, şonuň üçin usulyň iki gezek garaşylşy ýaly işlejekdigini bilýäris:

Меня зовут Саша, мой возраст - двадцать один 
Меня зовут Мария, мой возраст - 32 
Nöne setir ýa-da san däl-de, ikinji parametr hökmünde null geçsek näme bolar?
public static void main(String[] args) {

   Man victor = new Man();
   victor.introduce("Виктор", null);//Ambiguous method call!
}
Toplama ýalňyşlygy alarys! “Düşnüksiz usul jaňy” ýalňyşlygy “düşnüksiz usul jaňy” hökmünde terjime edilýär. Näme üçin ýüze çykyp biler we “düşnüksizlik” näme? Aslynda ýönekeý. Esasy zat, usulyň iki görnüşi bar: ikinji argument bilen String. IntegerBothöne ikisem String, Integermanysyz bolup biler! Iki görnüşi üçin (salgylanma görnüşleri bolany üçin) null başlangyç bahadyr. Şonuň üçin bu ýagdaýda düzüji usulyň haýsy wersiýasyna jaň etmelidigini bilip bilmeýär. Bu meseläni çözmek gaty ýönekeý. Esasy zat, null belli bir salgylanma görnüşine aç-açan öwrülip biler. Şol sebäpden, bir usul çagyrylanda, ikinji argument üçin zerur maglumatlaryň görnüşini gabygyň içinde görkezip bilersiňiz! Düzediji siziň “maslahatyňyza” düşüner we zerur usula jaň eder:
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);
   }
}
Netije:

Метод с двумя строками! 
Меня зовут Виктор, мой возраст - null
Emma san parametri başlangyç bolup int, salgylanma görnüşi däl bolsa Integer, beýle ýalňyşlyk ýüze çykmazdy.
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);
   }
}
Munuň sebäbini çakladyňyzmy? Eger çak eden bolsaňyz, gowy ýerine ýetirildi :) Sebäbi primitiwler null bilen deň bolup bilmez. Indi düzüjiniň usuly çagyrmak üçin diňe bir warianty bar introduce()- iki setir bilen. Usulyň şu wersiýasy her gezek usul çagyrylanda gaýtadan işlener.
Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION