JavaRush /Java Blog /Random-ID /Tanda tangan metode

Tanda tangan metode

Dipublikasikan di grup Random-ID
Halo! Anda telah menguasai pembuatan kelas Anda sendiri, dengan bidang dan metode. Hari ini kita akan berbicara secara rinci tentang metodenya. Kami, tentu saja, telah melakukan ini lebih dari sekali dalam perkuliahan kami, tetapi kami terutama membicarakan poin-poin umum. Hari ini kita akan menganalisis metode "sebagian" secara harfiah - kita akan mencari tahu apa saja isinya, opsi apa untuk membuatnya, dan bagaimana semua ini dapat dikelola :) Ayo!Tanda tangan metode - 1

Tanda tangan metode

Semua kode yang mendeskripsikan suatu metode disebut deklarasi metode . Tanda tangan metode menyertakan nama metode dan tipe parameter dalam urutan tertentu. Tampilan iklan secara umum dapat digambarkan sebagai berikut:
модификатор доступа, тип возвращаемого значения, Name метода(список параметров) {
    // тело метода
}
Mari kita ambil contoh deklarasi beberapa 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. Pengubah akses

Pengubah akses selalu dicantumkan terlebih dahulu. Semua metode kelas Dogditunjuk oleh pengubah public. Artinya, kita dapat memanggil mereka dari kelas lain mana pun:
public class Main {

   public static void main(String[] args) {

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

}
Metode kelas Dog, seperti yang Anda lihat, mudah diakses di kelas Main. Hal ini dimungkinkan berkat pengubah public. Ada pengubah lain di Java, dan tidak semuanya mengizinkan Anda menggunakan metode di dalam kelas lain. Kami akan membicarakannya di kuliah lain. Hal utama adalah mengingat apa yang menjadi tanggung jawab pengubah: ketersediaan/tidak dapat diaksesnya metode di kelas lain :)

2. Kata kunci statis

Salah satu caranya Dogyaitu main()ditunjukkan dengan kata kunci static. Jika ada, maka harus ditentukan setelah pengubah akses. Ingat pada kuliah sebelumnya kita berbicara tentang variabel kelas statis? Jika diterapkan pada metode, kata ini memiliki arti yang kurang lebih sama. Jika suatu metode ditentukan sebagai static, ini berarti metode tersebut dapat digunakan tanpa referensi ke objek kelas tertentu. Dan tentu saja, untuk menjalankan metode statis main()dalam sebuah kelas, DogAnda tidak perlu membuat sebuah instance Dog; ia akan berjalan tanpa instance tersebut. Jika metode ini tidak statis, maka untuk menggunakannya kita perlu membuat objek terlebih dahulu.

3. Nilai kembalian.

Jika metode kita harus mengembalikan sesuatu, maka kita kemudian menunjukkan jenis nilai yang dikembalikan. Hal ini dapat dilihat pada contoh getter getName():
public String getName() {
   return name;
}
Ini mengembalikan objek bertipe String. Jika metode tidak mengembalikan apa pun, kata kunci yang ditentukan bukan type void, seperti pada metode woof():
public void woof() {
   System.out.println("Собака по имени " + name + " говорит \"Гав-гав!\"");
}

Metode dengan nama yang sama

Ada situasi ketika program kita memerlukan beberapa opsi tentang cara kerja suatu metode. Mengapa kita tidak menciptakan kecerdasan buatan kita sendiri? Amazon punya Alexa, Yandex punya Alice, jadi mengapa kita lebih buruk? :) Dalam film tentang Iron Man, Tony Stark menciptakan kecerdasan buatannya yang luar biasa - JARVIS Mari kita memberi penghormatan kepada karakter yang luar biasa dan memberi nama AI kita untuk menghormatinya :) Hal pertama yang harus kita ajarkan pada Jarvis adalah menyapa orang yang memasuki ruangan (akan aneh jika kecerdasan sebesar 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");
   }
}
Keluaran konsol:

Добрый вечер, Тони Старк, How ваши дела?
Besar! Jarvis tahu bagaimana menyapa seseorang yang masuk. Paling sering, tentu saja, itu adalah pemiliknya - Tony Stark. Tapi dia mungkin tidak datang sendiri! Dan metode kami sayHi()hanya mengambil satu argumen sebagai masukan. Dan karenanya, dia hanya bisa menyapa salah satu dari mereka yang datang, dan mengabaikan yang lain. Tidak terlalu sopan, setuju?:/ Dalam hal ini, untuk menyelesaikan masalah, kita cukup menulis 2 metode di kelas dengan nama yang sama, tetapi dengan parameter berbeda:
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 disebut metode kelebihan beban . Kelebihan beban memungkinkan program kami menjadi lebih fleksibel dan mengakomodasi berbagai pilihan pekerjaan. Mari kita periksa cara kerjanya:
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");
   }
}
Keluaran konsol:

Добрый вечер, Тони Старк, How ваши дела? 
Добрый вечер, Тони Старк, Капитан Америка, How ваши дела?
Hebat, kedua opsi berfungsi :) Namun, kami tidak menyelesaikan masalah! Bagaimana jika ada tiga tamu? Tentu saja kita bisa membebani metode itu lagi sayHi()untuk menerima nama ketiga tamu tersebut. Tapi bisa ada 4 atau 5. Dan seterusnya tanpa batas. Apakah ada cara lain untuk mengajari Jarvis bekerja dengan sejumlah nama, tanpa sejuta metode yang berlebihan sayHi()? :/ Tentu saja pernah! Jika tidak, apakah Java akan menjadi bahasa pemrograman paling populer 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");
   }
}
Catatan ( String...names) yang diteruskan sebagai parameter memungkinkan kita untuk menunjukkan bahwa sejumlah string tertentu diteruskan ke metode tersebut. Kami tidak menentukan terlebih dahulu berapa banyak yang harus ada, sehingga pengoperasian metode kami sekarang menjadi jauh 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");
   }
}
Keluaran konsol:

Добрый вечер, Тони Старк, How ваши дела? 
Добрый вечер, Капитан Америка, How ваши дела? 
Добрый вечер, Черная Вдова, How ваши дела? 
Добрый вечер, Халк, How ваши дела?
Di dalam metode ini, kami mengulang semua argumen dan menampilkan frasa siap pakai dengan nama ke konsol. Di sini kami menggunakan loop yang disederhanakan for-each(Anda sudah menemukannya). Ini bagus karena menulis String...namessebenarnya berarti bahwa semua parameter yang diteruskan dimasukkan ke dalam array oleh kompiler. Oleh karena itu, namesAnda dapat bekerja dengan variabel seperti halnya array, termasuk mengulangnya. Selain itu, ini akan berfungsi untuk sejumlah jalur yang ditransfer! Dua, sepuluh, bahkan seribu - metode ini akan bekerja dengan andal untuk sejumlah tamu berapa pun. Jauh lebih nyaman daripada melakukan kelebihan beban untuk semua opsi yang memungkinkan, setujukah Anda? :) Mari kita berikan contoh lain dari metode kelebihan beban. Mari tambahkan metode ke Jarvis printInfoFromDatabase(). Ini akan mencetak informasi tentang orang tersebut dari database ke konsol. Jika database menunjukkan bahwa seseorang adalah pahlawan super atau penjahat super, informasi ini juga akan ditampilkan di 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 суперзлодей Магнето
Beginilah cara kerja metode kami bergantung pada data yang kami masukkan ke dalamnya. Poin penting lainnya:Urutan argumen itu penting! Katakanlah metode kita mengambil string dan angka sebagai masukan:
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 metode sayYourAge()kelas Manmengambil string dan angka sebagai input, maka ini adalah urutan yang harus diteruskan ke dalam program! Jika kita meneruskannya dalam urutan yang berbeda, kompiler akan memberikan kesalahan dan orang tersebut tidak akan dapat mengetahui usianya. Ngomong-ngomong, konstruktor yang kita bahas di kuliah terakhir juga merupakan metode! Mereka juga dapat kelebihan beban (membuat beberapa konstruktor dengan rangkaian argumen berbeda) dan bagi mereka urutan penyampaian argumen juga penting secara mendasar. Metode nyata! :)

Cara memanggil metode dengan parameter serupa

Seperti yang kalian ketahui, di Java ada yang namanya null. Saat bekerja dengannya, sangat penting untuk memahami bahwa null bukanlah objek atau tipe data. Bayangkan kita memiliki kelas Man dan sebuah metode introduce()yang menyatakan nama dan umur seseorang. Dalam hal ini usia dapat disampaikan dalam bentuk teks, atau dapat dinyatakan dalam angka.
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 sudah familiar dengan kelebihan beban, jadi kita tahu bahwa metode ini akan bekerja seperti yang diharapkan pada kedua kasus:

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

   Man victor = new Man();
   victor.introduce("Виктор", null);//Ambiguous method call!
}
Kami akan mendapatkan kesalahan kompilasi! Kesalahan "Pemanggilan metode ambigu" diterjemahkan sebagai "pemanggilan metode ambigu". Mengapa hal itu bisa muncul dan apa yang dimaksud dengan “ambiguitas”? Ini sebenarnya sederhana. Masalahnya adalah, kita mempunyai dua opsi untuk metode ini: dengan Stringdan dengan Integersebagai argumen kedua. Namun keduanya String, dan Integerbisa menjadi nol! Untuk kedua tipe (karena merupakan tipe referensi), null adalah nilai default. Itulah sebabnya kompiler dalam situasi ini tidak dapat mengetahui versi metode mana yang harus dipanggil. Mengatasi masalah ini cukup sederhana. Intinya adalah null dapat secara eksplisit dikonversi ke tipe referensi tertentu. Oleh karena itu, saat memanggil suatu metode, Anda dapat menunjukkan dalam tanda kurung tipe data yang Anda perlukan untuk argumen kedua! Kompiler akan memahami “petunjuk” Anda dan memanggil metode 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
Namun jika parameter numeriknya adalah primitif int, dan bukan objek bertipe referensi Integer, kesalahan seperti itu tidak akan terjadi.
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 menebak alasannya? Jika Anda dapat menebaknya, bagus sekali :) Karena primitif tidak bisa sama dengan nol. Sekarang kompiler hanya memiliki satu opsi untuk memanggil metode ini introduce()- dengan dua baris. Versi metode inilah yang akan diproses setiap kali metode dipanggil.
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION