JavaRush /Блоги Java /Random-TG /Имзои усул

Имзои усул

Дар гурӯҳ нашр шудааст
Салом! Шумо аллакай бо соҳаҳо ва усулҳои синфҳои шахсии худро азхуд кардаед. Имрӯз мо дар бораи усулҳо муфассал сӯҳбат хоҳем кард. Мо, албатта, дар лекцияхои худ на як бору ду бор инро карда будем, вале мо асосан дар бораи нуктахои умумй сухан ронда будем. Имрӯз мо усулҳои "қисмҳо"-ро аслан таҳлил хоҳем кард - мо мефаҳмем, ки онҳо аз чӣ иборатанд, кадом вариантҳои эҷоди онҳо вуҷуд доранд ва ин ҳамаро чӣ гуна идора кардан мумкин аст :) Биёед!Имзои усул - 1

Имзои усул

Ҳама codeҳое, ки методро тавсиф мекунанд, эъломияи метод номида мешаванд . Имзои усул номи усул ва намудҳои параметрҳоро бо тартиби мушаххас дар бар мегирад. Намуди умумии таблиғро метавон чунин тавсиф кард:
модификатор доступа, тип возвращаемого значения, Name метода(список параметров) {
    // тело метода
}
Биёед мисоли эъломияҳои якчанд усулҳои синфро гирем 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. Тағйирдиҳандаи дастрасӣ

Тағирдиҳандаи дастрасӣ ҳамеша дар аввал рӯйхат карда мешавад. Ҳама усулҳои синф Dogаз ҷониби тағирдиҳанда таъин карда мешаванд public. Яъне, мо метавонем онҳоро аз ҳама синфи дигар даъват кунем:
public class Main {

   public static void main(String[] args) {

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

}
Усулҳои синф Dog, тавре ки мебинед, дар синф ба осонӣ дастрасанд Main. Ин ба шарофати тағирдиҳанда имконпазир аст public. Дар Java дигар тағирдиҳандаҳо мавҷуданд ва на ҳама ба шумо имкон медиҳанд, ки усулро дар дохor синфи дигар истифода баред. Мо дар дигар лекцияхо дар бораи онхо сухан меронем. Муҳим он аст, ки дар хотир дошта бошед, ки тағирдиҳанда барои чӣ масъул аст: мавҷудият / дастнорас будани усул дар синфҳои дигар :)

2. Калимаи калидии статикӣ

Яке аз усулҳо Dog, яъне main()бо калимаи калидӣ нишон дода мешавад static. Агар он вуҷуд дошта бошад, пас он бояд пас аз тағирдиҳандаи дастрасӣ нишон дода шавад. Дар хотир доред, ки дар лексияҳои қаблӣ мо дар бораи тағирёбандаҳои синфҳои статикӣ сӯҳбат карда будем? Вақте ки ба усулҳо истифода мешавад, ин калима тақрибан як маъно дорад. Агар усул ҳамчун , нишон дода шуда бошад static, ин маънои онро дорад, ки он метавонад бидуни истинод ба an objectи синфи мушаххас истифода шавад. Ва дар ҳақиқат, барои иҷро кардани усули статикӣ main()дар синф, Dogба шумо лозим нест, ки намуна эҷод кунед Dog; он бе он кор мекунад. Агар ин усул статикӣ намебуд, пас барои истифода бурдани он мо бояд аввал an object эҷод кунем.

3. Баргардонидани арзиши.

Агар усули мо бояд чизе баргардонад, пас мо навъи арзиши бозгаштро нишон медиҳем. Инро дар мисоли гетер дидан мумкин аст getName():
public String getName() {
   return name;
}
Он an objectи навъи бар мегардонад String. Агар усул чизе барнагардонад, калимаи калидӣ ба ҷои type void, тавре ки дар метод аст, нишон дода мешавад woof():
public void woof() {
   System.out.println("Собака по имени " + name + " говорит \"Гав-гав!\"");
}

Усулҳо бо ҳамон ном

Ҳолатҳое вуҷуд доранд, ки барномаи мо барои кор кардани усул якчанд вариантҳоро талаб мекунад. Чаро мо зеҳни сунъии худро эҷод намекунем? Амазонка Alexa дорад, Яндекс Алис дорад, пас чаро мо бадтарем? :) Дар филм дар бораи Одами оҳан, Тони Старк зеҳни барҷастаи сунъии худро офаридааст - ҶАРВИС Биёед ба қаҳрамони олиҷаноб эҳтиром гузорем ва AI-и худро ба шарафи ӯ ном гузорем :) Аввалин чизе, ки мо бояд Ҷарвисро таълим диҳем - ба одамоне, ки ба ҳуҷра ворид мешаванд, салом гӯем (агар чунин ақли бузург беадаб мебуд, аҷиб мебуд).
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");
   }
}
Натиҷаи консол:

Добрый вечер, Тони Старк, How ваши дела?
Аҷоиб! Ҷарвис медонад, ки ба касе, ки ворид мешавад, чӣ тавр салом гӯяд. Бештари вақт, албатта, он соҳиби ӯ хоҳад буд - Тони Старк. Аммо ӯ метавонад танҳо наояд! Ва усули мо sayHi()танҳо як далелро ҳамчун вуруд мегирад. Ва мутаносибан, ӯ метавонад танҳо ба яке аз онҳое, ки меоянд, салом гӯяд ва дигареро нодида мегирад. На он қадар хушмуомила, розӣ мешавед?:/ Дар ин ҳолат, барои ҳалли мушкилот, мо метавонем танҳо 2 усулро дар синф бо як ном, вале бо параметрҳои гуногун нависем:
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 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");
   }
}
Натиҷаи консол:

Добрый вечер, Тони Старк, How ваши дела? 
Добрый вечер, Тони Старк, Капитан Америка, How ваши дела?
Аҷоиб, ҳарду вариант кор карданд :) Аммо, мо мушкилотро ҳал накардем! Чӣ мешавад, агар се меҳмон бошанд? Албатта, мо метавонем усули бори дигар sayHi()барои қабули номи се меҳмон. Аммо онҳо метавонанд 4 ё 5 адад бошанд ва ғайра. Оё роҳи дигаре ҳаст, ки ба Ҷарвис кор карданро бо ягон шумораи номҳо бидуни миллионҳо изофабори методҳо таълим диҳад sayHi()? :/ Албатта доранд! Дар акси ҳол, оё Java маъмултарин забони барномасозӣ дар ҷаҳон хоҳад буд? ;)
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");
   }
}
Сабти ( String...names) ҳамчун параметр додашуда имкон медиҳад, ки нишон диҳем, ки шумораи муайяни сатрҳо ба метод гузаронида мешаванд. Мо пешакӣ муайян намекунем, ки шумораи онҳо бояд чанд бошад, аз ин рӯ кори усули мо ҳоло хеле чандиртар мешавад:
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");
   }
}
Натиҷаи консол:

Добрый вечер, Тони Старк, How ваши дела? 
Добрый вечер, Капитан Америка, How ваши дела? 
Добрый вечер, Черная Вдова, How ваши дела? 
Добрый вечер, Халк, How ваши дела?
Дар дохor усул, мо ҳама далелҳоро давр мезанем ва ибораҳои тайёрро бо номҳо ба консол мебарорем. Дар ин ҷо мо ҳалқаи соддакардашударо истифода мебарем for-each(шумо аллакай бо он дучор шудаед). Ин олиҷаноб аст, зеро навиштан String...namesвоқеан маънои онро дорад, ки ҳамаи параметрҳои гузаронидашуда аз ҷониби компилятор ба массив гузошта мешаванд. Аз ин рӯ, namesшумо метавонед бо тағирёбанда мисли массив кор кунед, аз ҷумла тавассути он давр задан. Ғайр аз он, он барои ҳар як шумораи хатҳои интиқолшуда кор хоҳад кард! Ду, даҳ, ҳатто ҳазор - усул бо ягон шумораи меҳмонон боэътимод кор мекунад. Аз иҷрои изофабориҳо барои ҳама имконоти имконпазир хеле қулайтар аст, оё шумо розӣ нестед? :) Биёед боз як мисоли изофабории усулро медиҳем. Биёед як усулро ба Ҷарвис илова кунем 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("Также известен 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, "Магнето");
   }
}
Хулоса:

Лора Палмер. Дата рождения - 22 июля 1972, город Твин Пикс, штат Washington
Макс Эйзенхарт. Рост 188см, вес 86 кг 
Также известен How суперзлодей Магнето
Усули мо вобаста ба маълумоте, ки мо ба он ворид мекунем, ҳамин тавр кор мекунад. Боз як нуктаи муҳим:Тартиби баҳсҳо муҳим аст! Фарз мекунем, ки усули мо сатр ва рақамро ҳамчун вуруд мегирад:
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!
   }
}
Агар усули sayYourAge()синф Manсатр ва рақамро ҳамчун вуруд қабул кунад, пас ин тартибест, ки онҳо бояд дар барнома гузаранд! Агар мо онҳоро бо тартиби дигар гузаронем, тартибдиҳанда хато мекунад ва шахс синну солашро гуфта наметавонад. Зимнан, конструкторхое, ки мо дар лекцияи гузашта сухан рондем, низ методхо! Онҳо инчунин метавонанд аз ҳад зиёд бор карда шаванд (якчанд конструкторҳоро бо маҷмӯи аргументҳои гуногун эҷод кунед) ва барои онҳо тартиби интиқоли аргументҳо низ хеле муҳим аст. Усулҳои воқеӣ! :)

Усулҳоро бо параметрҳои шабеҳ чӣ гуна даъват кардан мумкин аст

Тавре ки шумо медонед, дар Java чунин калимае вуҷуд дорад, ки null аст. Ҳангоми кор бо он, фаҳмидани он хеле муҳим аст, ки null на an object аст ва на навъи маълумот. Тасаввур кунед, ки мо одами синфӣ ва усуле дорем introduce(), ки ном ва синну соли шахсро эълон мекунад. Дар ин маврид синну солро метавон дар шакли матн баён кард, ё онро бо адад ифода кардан мумкин аст.
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);
   }
}
Мо аллакай бо бори изофа шинос ҳастем, аз ин рӯ медонем, ки усул ҳар ду дафъа ҳам тавре кор хоҳад кард:

Меня зовут Саша, мой возраст - двадцать один 
Меня зовут Мария, мой возраст - 32 
Аммо чӣ мешавад, агар мо null-ро ҳамчун параметри дуюм гузорем, на сатр ё рақам?
public static void main(String[] args) {

   Man victor = new Man();
   victor.introduce("Виктор", null);//Ambiguous method call!
}
Мо хатои ҷамъоварӣ мегирем! Хатои "Занги усули номуайян" ҳамчун "даъвати усули номуайян" тарҷума шудааст. Чаро он метавонад ба вуҷуд ояд ва "дурӯғ" чист? Ин дар асл оддӣ аст. Гап дар он аст, ки мо ду варианти усул дорем: бо Stringва Integerҳамчун далели дуюм. Аммо ҳарду String, ва Integerметавонанд бефоида бошанд! Барои ҳарду намуд (азбаски онҳо намудҳои истинод мебошанд), null арзиши пешфарз аст. Аз ин рӯ, компилятор дар ин ҳолат наметавонад муайян кунад, ки кадом versionи методро даъват кунад. Ҳалли ин мушкилот хеле оддӣ аст. Гап дар он аст, ки null метавонад ба таври возеҳ ба як навъи истинод табдил дода шавад. Аз ин рӯ, ҳангоми даъват кардани усул, шумо метавонед дар қавс намуди маълумотеро, ки барои далели дуюм лозим аст, нишон диҳед! Компилятор "маслиҳат"-и шуморо мефаҳмад ва усули заруриро даъват мекунад:
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);
   }
}
Хулоса:

Метод с двумя строками! 
Меня зовут Виктор, мой возраст - null
Аммо агар параметри ададӣ ибтидоӣ бошад int, на an objectи навъи истинод Integer, чунин хатогӣ рух намедиҳад.
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);
   }
}
Оё шумо фаҳмидед, ки чаро? Агар шумо онро тахмин карда бошед, офарин :) Зеро примитивҳо наметавонанд ба нул баробар бошанд. Акнун компилятор танҳо як варианти даъват кардани метод дорад introduce()- бо ду сатр. Маҳз ҳамин versionи усул аст, ки ҳар дафъае, ки метод даъват карда мешавад, коркард карда мешавад.
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION