JavaRush /Blog Jawa /Random-JV /Tanda tangan metode

Tanda tangan metode

Diterbitake ing grup
Hello! Sampeyan wis nguwasani nggawe kelas dhewe, kanthi lapangan lan metode. Dina iki kita bakal ngomong kanthi rinci babagan metode kasebut. Kita, mesthi, wis nindakake iki luwih saka sapisan ing ceramah kita, nanging kita ngomong utamané bab poin umum. Dina iki kita bakal secara harfiah nganalisa metode "ing bagean" - kita bakal nemokake apa sing kalebu, opsi apa kanggo nggawe lan carane kabeh iki bisa diatur :) Ayo!Cara teken - 1

Tanda tangan metode

Kabeh kode sing nggambarake metode diarani deklarasi metode . Tandha metode kalebu jeneng metode lan jinis parameter ing urutan tartamtu. Tampilan umum iklan bisa diterangake kaya ing ngisor iki:
модификатор доступа, тип возвращаемого значения, Name метода(список параметров) {
    // тело метода
}
Ayo njupuk conto deklarasi sawetara metode kelas 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. Akses modifier

Modifier akses tansah didaftar dhisik. Kabeh metode kelas Dogditetepake dening modifier public. Yaiku, kita bisa nelpon saka kelas liyane:
public class Main {

   public static void main(String[] args) {

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

}
Cara kelas Dog, kaya sing sampeyan ngerteni, gampang diakses ing kelas Main. Iki bisa ditindakake amarga modifier public. Ana modifiers liyane ing Jawa, lan ora kabeh bakal ngidini sampeyan nggunakake cara ing kelas liyane. Kita bakal ngomong babagan iki ing kuliah liyane. Sing utama yaiku ngelingi apa sing dadi tanggung jawab modifier: kasedhiyan / ora bisa diakses metode ing kelas liyane :)

2. Tembung kunci statis

Salah sawijining cara Dog, yaiku, main()dituduhake kanthi tembung kunci static. Yen ana, banjur kudu ditemtokake sawise modifier akses. Elinga ing kuliah sadurunge kita ngomong babagan variabel kelas statis? Yen ditrapake ing metode, tembung iki nduweni teges sing padha. Yen cara kasebut minangka static, iki tegese bisa digunakake tanpa referensi kanggo obyek kelas tartamtu. Lan pancen, kanggo mbukak metode statis main()ing kelas, Dogsampeyan ora perlu nggawe conto Dog; mlaku tanpa. Yen cara iki ora statis, mula kanggo nggunakake, kita kudu nggawe obyek dhisik.

3. Nilai bali.

Yen cara kita kudu ngasilake soko, banjur kita nuduhake jinis nilai bali. Iki bisa dideleng ing conto getter getName():
public String getName() {
   return name;
}
Iki ngasilake obyek saka jinis String. Yen cara ora ngasilake apa-apa, tembung kunci kasebut ditemtokake tinimbang jinis void, kaya ing metode woof():
public void woof() {
   System.out.println("Собака по имени " + name + " говорит \"Гав-гав!\"");
}

Metode kanthi jeneng sing padha

Ana kahanan nalika program kita mbutuhake sawetara opsi kanggo cara kerjane. Napa kita ora nggawe intelijen buatan dhewe? Amazon duwe Alexa, Yandex duwe Alice, dadi kenapa kita luwih elek? :) Ing film babagan Iron Man, Tony Stark nggawe intelijen buatan dhewe sing luar biasa - JARVIS Ayo menehi penghargaan marang karakter sing apik lan jenenge AI kanggo ngurmati :) sepisanan kita kudu mulang Jarvis - menehi salam marang wong sing mlebu kamar (bakal aneh yen kapinteran sing gedhe banget kasebut dadi ora sopan).
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 konsol:

Добрый вечер, Тони Старк, How ваши дела?
apik tenan! Jarvis ngerti carane menehi salam marang wong sing mlebu. Paling asring, mesthi, bakal dadi pemilik - Tony Stark. Nanging dheweke bisa uga ora teka dhewe! Lan cara kita sayHi()njupuk mung siji argumen minangka input. Lan, miturut, kang bakal bisa kanggo salam mung siji saka wong-wong sing teka, lan bakal nglirwakake liyane. Ora sopan banget, setuju?: / Ing kasus iki, kanggo ngatasi masalah, kita mung bisa nulis 2 metode ing kelas kanthi jeneng sing padha, nanging kanthi paramèter sing beda:
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?");
   }

}
Iki diarani metode overloading . Overloading ngidini program kita dadi luwih fleksibel lan nampung macem-macem opsi kerja. Ayo dipriksa cara kerjane:
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 konsol:

Добрый вечер, Тони Старк, How ваши дела? 
Добрый вечер, Тони Старк, Капитан Америка, How ваши дела?
Great, loro opsi makarya :) Nanging, kita ora ngatasi masalah! Apa yen ana tamu telu? Mesthi, kita bisa overload cara maneh sayHi()kanggo nampa jeneng saka telung tamu. Nanging bisa uga ana 4 utawa 5. Lan sabanjure ad infinitum. Apa ana cara liya kanggo ngajari Jarvis nggarap sawetara jeneng, tanpa kakehan cara yuta sayHi()? :/ Mesthi wis! Yen ora, apa Jawa bakal dadi basa pamrograman sing paling populer ing donya? ;)
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");
   }
}
Cathetan ( String...names) liwati minangka parameter ngidini kita nuduhake yen sawetara strings diterusake menyang metode kasebut. Kita ora nemtokake sadurunge jumlah sing kudu ana, mula operasi metode saiki dadi luwih fleksibel:
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 konsol:

Добрый вечер, Тони Старк, How ваши дела? 
Добрый вечер, Капитан Америка, How ваши дела? 
Добрый вечер, Черная Вдова, How ваши дела? 
Добрый вечер, Халк, How ваши дела?
Ing cara kasebut, kita ngubengi kabeh argumen lan ngasilake frasa sing wis digawe kanthi jeneng menyang konsol. Ing kene kita nggunakake loop sing disederhanakake for-each(sampeyan wis nemoni). Iku apik amarga nulis String...namestegese kabeh parameter sing dilewati dilebokake ing array dening compiler. Mulane, namessampeyan bisa nggarap variabel kaya array, kalebu looping liwat. Kajaba iku, bakal bisa digunakake kanggo nomer garis sing ditransfer! Loro, sepuluh, malah sewu - cara bakal bisa dipercaya karo nomer tamu. Luwih trep tinimbang nindakake kakehan kanggo kabeh opsi sing bisa ditindakake, apa sampeyan ora setuju? :) Ayo menehi conto liyane babagan metode overloading. Ayo nambahake metode menyang Jarvis printInfoFromDatabase(). Iku bakal print informasi bab wong saka database kanggo console. Yen basis data nuduhake yen wong iku superhero utawa supervillain, informasi iki uga bakal ditampilake ing layar:
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, "Магнето");
   }
}
Kesimpulan:

Лора Палмер. Дата рождения - 22 июля 1972, город Твин Пикс, штат Washington
Макс Эйзенхарт. Рост 188см, вес 86 кг 
Также известен How суперзлодей Магнето
Iki cara cara kerjane gumantung saka data sing dilebokake. Titik penting liyane:Urutan argumentasi sing penting! Dadi cara kita njupuk senar lan nomer minangka 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!
   }
}
Yen cara sayYourAge()kelas Mannjupuk senar lan nomer minangka input, banjur iki urutan kang kudu liwati ing program! Yen kita pass ing urutan beda, compiler bakal uncalan kesalahan lan wong ora bisa ngomong umur. Miturut cara, konstruktor sing kita bahas ing kuliah pungkasan uga cara! Padha uga bisa overloaded (nggawe sawetara konstruktor karo set beda bantahan) lan kanggo wong-wong mau urutan maringaken bantahan uga dhasar penting. Cara nyata! :)

Cara nelpon metode kanthi paramèter sing padha

Kaya sing wis dingerteni, ing basa Jawa ana tembung null. Nalika nggarap, penting banget kanggo mangerteni yen null dudu obyek utawa jinis data. Mbayangno kita duwe kelas Man lan cara introduce()sing nyatakake jeneng lan umur wong. Ing kasus iki, umur bisa diandharake ing wangun teks, utawa bisa ditulis minangka nomer.
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);
   }
}
Kita wis ngerti babagan overloading, mula kita ngerti manawa cara kasebut bakal bisa digunakake kaya sing dikarepake:

Меня зовут Саша, мой возраст - двадцать один 
Меня зовут Мария, мой возраст - 32 
Nanging apa mengkono yen kita pass null minangka parameter kapindho, ora senar utawa nomer?
public static void main(String[] args) {

   Man victor = new Man();
   victor.introduce("Виктор", null);//Ambiguous method call!
}
Kita bakal entuk kesalahan kompilasi! Kesalahan "Panggilan metode ambigu" diterjemahake minangka "telpon metode ambigu". Napa bisa muncul lan apa "ambiguitas"? Iku bener prasaja. Intine, kita duwe rong pilihan kanggo metode kasebut: karo Stringlan Integerminangka argumen kapindho. Nanging loro-lorone String, lan Integerbisa null! Kanggo loro jinis (amarga jinis referensi), null minangka nilai standar. Mulane kompiler ing kahanan iki ora bisa nemtokake versi cara sing kudu diarani. Ngatasi masalah iki cukup prasaja. Intine yaiku null bisa diowahi kanthi jelas menyang jinis referensi tartamtu. Mulane, nalika nelpon cara, sampeyan bisa nunjukake ing kurung jinis data sing dibutuhake kanggo argumen kapindho! Compiler bakal ngerti "pitunjuk" sampeyan lan nelpon cara sing dibutuhake:
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);
   }
}
Kesimpulan:

Метод с двумя строками! 
Меня зовут Виктор, мой возраст - null
Nanging yen parameter numerik minangka primitif intlan dudu obyek saka jinis referensi Integer, kesalahan kasebut ora bakal kedadeyan.
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);
   }
}
Wis sampeyan guess apa? Yen sampeyan guessed, uga rampung :) Amarga primitif ora bisa padha karo null. Saiki kompiler mung duwe siji pilihan kanggo nelpon cara introduce()- kanthi rong baris. Versi metode iki sing bakal diproses saben metode kasebut diarani.
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION