JavaRush /Blog Java /Random-MS /Tandatangan kaedah

Tandatangan kaedah

Diterbitkan dalam kumpulan
hello! Anda telah pun menguasai mencipta kelas anda sendiri, dengan medan dan kaedah. Hari ini kita akan bercakap secara terperinci mengenai kaedah. Kami, sudah tentu, telah melakukan ini lebih daripada sekali dalam kuliah kami, tetapi kami bercakap terutamanya mengenai perkara umum. Hari ini kita benar-benar akan menganalisis kaedah "dalam bahagian" - kita akan mengetahui apa yang terdiri daripada mereka, pilihan untuk menciptanya wujud dan bagaimana semua ini boleh diuruskan :) Jom!Tandatangan kaedah - 1

Tandatangan kaedah

Semua kod yang menerangkan kaedah dipanggil pengisytiharan kaedah . Tandatangan kaedah termasuk nama kaedah dan jenis parameter dalam susunan tertentu. Penampilan umum iklan boleh diterangkan seperti berikut:
модификатор доступа, тип возвращаемого значения, Name метода(список параметров) {
    // тело метода
}
Mari kita ambil contoh pengisytiharan beberapa kaedah 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. Pengubah suai akses

Pengubah suai akses sentiasa disenaraikan dahulu. Semua kaedah kelas Dogditetapkan oleh pengubah suai public. Iaitu, kita boleh memanggil mereka dari mana-mana kelas lain:
public class Main {

   public static void main(String[] args) {

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

}
Kaedah kelas Dog, seperti yang anda lihat, mudah diakses dalam kelas Main. Ini boleh dilakukan terima kasih kepada pengubah suai public. Terdapat pengubah suai lain di Java, dan tidak semuanya akan membenarkan anda menggunakan kaedah di dalam kelas lain. Kami akan bercakap tentang mereka dalam kuliah lain. Perkara utama adalah untuk mengingati apa yang pengubah bertanggungjawab untuk: ketersediaan/ketidakbolehcapaian kaedah dalam kelas lain :)

2. Kata kunci statik

Salah satu kaedah Dog, iaitu, main()ditunjukkan oleh kata kunci static. Jika ia wujud, maka ia mesti dinyatakan selepas pengubah akses. Ingat dalam kuliah sebelum ini kita bercakap tentang pembolehubah kelas statik? Apabila digunakan pada kaedah, perkataan ini mempunyai makna yang lebih kurang sama. Jika kaedah ditentukan sebagai static, ini bermakna ia boleh digunakan tanpa merujuk kepada objek kelas tertentu. Dan sememangnya, untuk menjalankan kaedah statik main()dalam kelas, Doganda tidak perlu mencipta instance Dog; ia berjalan tanpanya. Jika kaedah ini tidak statik, maka untuk menggunakannya kita perlu membuat objek terlebih dahulu.

3. Nilai pulangan.

Jika kaedah kami mesti mengembalikan sesuatu, maka kami kemudian menunjukkan jenis nilai pulangan. Ini boleh dilihat dalam contoh pengambil getName():
public String getName() {
   return name;
}
Ia mengembalikan objek jenis String. Jika kaedah tidak mengembalikan apa-apa, kata kunci ditentukan dan bukannya type void, seperti dalam kaedah woof():
public void woof() {
   System.out.println("Собака по имени " + name + " говорит \"Гав-гав!\"");
}

Kaedah dengan nama yang sama

Terdapat situasi apabila program kami memerlukan beberapa pilihan untuk cara kaedah berfungsi. Mengapa kita tidak mencipta kecerdasan buatan kita sendiri? Amazon ada Alexa, Yandex ada Alice, jadi kenapa kita lebih teruk? :) Dalam filem tentang Iron Man, Tony Stark mencipta kecerdasan buatannya yang luar biasa - JARVIS Mari kita beri penghormatan kepada watak yang hebat dan namakan AI kita sebagai penghormatan kepadanya :) perkara pertama kita mesti mengajar Jarvis - memberi salam kepada orang yang masuk ke dalam bilik (alangkah peliknya jika akal sehebat itu ternyata tidak 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 ваши дела?
Hebat! Jarvis tahu bagaimana menyapa seseorang yang masuk. Selalunya, sudah tentu, ia akan menjadi pemiliknya - Tony Stark. Tetapi dia mungkin tidak datang bersendirian! Dan kaedah kami sayHi()hanya mengambil satu hujah sebagai input. Dan, sewajarnya, dia akan dapat menyambut hanya salah seorang daripada mereka yang datang, dan akan mengabaikan yang lain. Tidak begitu sopan, setuju?:/ Dalam kes ini, untuk menyelesaikan masalah, kita hanya boleh menulis 2 kaedah dalam kelas dengan nama yang sama, tetapi dengan parameter yang berbeza:
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?");
   }

}
Ini dipanggil kaedah overloading . Lebihan beban membolehkan program kami menjadi lebih fleksibel dan menampung pilihan kerja yang berbeza. Mari semak cara ia berfungsi:
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 ваши дела?
Hebat, kedua-dua pilihan berjaya :) Walau bagaimanapun, kami tidak menyelesaikan masalah! Bagaimana jika ada tiga tetamu? Sudah tentu, kita boleh membebankan kaedah sekali lagi sayHi()untuk menerima nama tiga tetamu. Tetapi boleh ada 4 atau 5 daripadanya. Dan seterusnya ad infinitum. Adakah terdapat cara lain untuk mengajar Jarvis bekerja dengan beberapa nama, tanpa satu juta kaedah berlebihan sayHi()? :/ Sudah tentu ada! Jika tidak, adakah Java akan menjadi bahasa pengaturcaraan paling popular di dunia? ;)
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");
   }
}
Rekod ( String...names) diluluskan sebagai parameter membolehkan kami menunjukkan bahawa bilangan rentetan tertentu dihantar ke kaedah. Kami tidak menyatakan terlebih dahulu jumlah yang sepatutnya, jadi pengendalian kaedah kami kini menjadi lebih 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 ваши дела?
Di dalam kaedah ini, kami mengulangi semua hujah dan mengeluarkan frasa siap pakai dengan nama ke konsol. Di sini kami menggunakan gelung yang dipermudahkan for-each(anda telah pun menemuinya). Ia bagus kerana menulis String...namessebenarnya bermakna semua parameter yang diluluskan dimasukkan ke dalam tatasusunan oleh pengkompil. Oleh itu, namesanda boleh bekerja dengan pembolehubah seperti dengan tatasusunan, termasuk gelung melaluinya. Selain itu, ia akan berfungsi untuk sebarang bilangan talian yang dipindahkan! Dua, sepuluh, malah seribu - kaedah ini akan berfungsi dengan pasti dengan mana-mana bilangan tetamu. Jauh lebih mudah daripada melakukan lebihan beban untuk semua pilihan yang mungkin, adakah anda bersetuju? :) Mari berikan satu lagi contoh kaedah terlebih muatan. Mari tambahkan kaedah kepada Jarvis printInfoFromDatabase(). Ia akan mencetak maklumat tentang orang itu daripada pangkalan data ke konsol. Jika pangkalan data menunjukkan bahawa seseorang itu adalah superhero atau supervillain, maklumat ini juga akan dipaparkan pada skrin:
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 суперзлодей Магнето
Beginilah cara kaedah kami berfungsi bergantung pada data yang kami masukkan ke dalamnya. Satu lagi perkara penting:Susunan hujah itu penting! Katakan kaedah kami mengambil rentetan dan nombor sebagai 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!
   }
}
Jika kaedah sayYourAge()kelas Manmengambil rentetan dan nombor sebagai input, maka ini ialah tertib di mana ia perlu diluluskan dalam program! Jika kita lulus mereka dalam susunan yang berbeza, pengkompil akan membuang ralat dan orang itu tidak akan dapat memberitahu umurnya. Ngomong-ngomong, pembina yang kami bincangkan dalam kuliah lepas juga merupakan kaedah! Mereka juga boleh dibebankan (buat beberapa pembina dengan set hujah yang berbeza) dan bagi mereka susunan menghantar hujah juga pada asasnya penting. Kaedah sebenar! :)

Cara memanggil kaedah dengan parameter yang serupa

Seperti yang anda ketahui, di Jawa terdapat perkataan seperti null. Apabila bekerja dengannya, adalah sangat penting untuk memahami bahawa null bukanlah objek mahupun jenis data. Bayangkan kita mempunyai Lelaki kelas dan kaedah introduce()yang mengisytiharkan nama dan umur seseorang. Dalam kes ini, umur boleh disampaikan dalam bentuk teks, atau ia boleh dinyatakan sebagai nombor.
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);
   }
}
Kami sudah biasa dengan lebihan beban, jadi kami tahu bahawa kaedah itu akan berfungsi seperti yang diharapkan pada kedua-dua masa:

Меня зовут Саша, мой возраст - двадцать один 
Меня зовут Мария, мой возраст - 32 
Tetapi apa yang berlaku jika kita lulus null sebagai parameter kedua, bukan rentetan atau nombor?
public static void main(String[] args) {

   Man victor = new Man();
   victor.introduce("Виктор", null);//Ambiguous method call!
}
Kami akan mendapat ralat kompilasi! Ralat "Panggilan kaedah samar-samar" diterjemahkan sebagai "panggilan kaedah samar-samar". Mengapa ia boleh timbul dan apakah "kekaburan" itu? Ia sebenarnya mudah. Masalahnya, kami mempunyai dua varian kaedah: dengan Stringdan dengan Integersebagai hujah kedua. Tetapi kedua-duanya String, dan Integerboleh jadi batal! Untuk kedua-dua jenis (kerana ia adalah jenis rujukan), null ialah nilai lalai. Itulah sebabnya pengkompil dalam situasi ini tidak dapat mengetahui versi kaedah yang harus dipanggil. Menyelesaikan masalah ini agak mudah. Intinya ialah null boleh ditukar secara eksplisit kepada jenis rujukan tertentu. Oleh itu, apabila memanggil kaedah, anda boleh menunjukkan dalam kurungan jenis data yang anda perlukan untuk hujah kedua! Pengkompil akan memahami "petunjuk" anda dan memanggil kaedah yang diperlukan:
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
Tetapi jika parameter berangka adalah primitif intdan bukan objek jenis rujukan Integer, ralat sedemikian tidak akan berlaku.
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);
   }
}
Sudahkah anda meneka kenapa? Jika anda meneka, syabas :) Kerana primitif tidak boleh sama dengan null. Sekarang pengkompil hanya mempunyai satu pilihan untuk memanggil kaedah introduce()- dengan dua baris. Versi kaedah inilah yang akan diproses setiap kali kaedah dipanggil.
Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION