CodeGym /Java Blog /Acak /Deklarasi metode
John Squirrels
Level 41
San Francisco

Deklarasi metode

Dipublikasikan di grup Acak
Hai! Anda sudah tahu tentang membuat kelas Anda sendiri dengan bidang dan metode. Sekarang kita akan memikirkan metode.
Deklarasi metode - 1
Tentu saja, kami telah melakukan ini lebih dari sekali dalam pelajaran kami, tetapi kami terutama membahas hal-hal umum. Hari ini, kita akan membedah metode, dan mempelajari terbuat dari apa metode tersebut, berbagai cara untuk membuatnya, dan cara mengelola semuanya. :) Ayo pergi!

Deklarasi metode

Semua kode yang mendefinisikan metode disebut deklarasi metode . Bentuk umum dari deklarasi method dapat digambarkan sebagai berikut:

access modifier, return type, method name (parameter list) {
    // method body
}
Sebagai contoh, lihat deklarasi berbagai 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("A dog named " + name + " says \"Woof, woof!\"");
   }

   public void run(int distanceInFeet) {
       System.out.println("A dog named " + name + " ran " + distanceInFeet + " feet!");
   }

   public String getName() {
       return name;
   }
}

1. Pengubah akses

Pengubah akses selalu ditunjukkan terlebih dahulu. Semua Dogmetode kelas ditandai dengan pengubah publik . Ini berarti kita dapat memanggil mereka dari kelas lain:

public class Main {

   public static void main(String[] args) {

       Dog butch = new Dog("Butch");
       butch.run(100);
   }

}
Seperti yang Anda lihat, Dogmetode kelas mudah diakses di Mainkelas. Ini dimungkinkan karena pengubah publik . Di Jawa, ada pengubah lain. Mereka tidak semua mengizinkan metode untuk digunakan di kelas lain. Kami akan membicarakannya di pelajaran lain. Hal utama yang harus diingat adalah tanggung jawab pengubah: apakah suatu metode dapat diakses di kelas lain :)

2. kata kunci statis

Salah satu Dogmetode, main(), ditandai dengan kata kunci static . Itu juga bagian dari deklarasi metode, dan kita sudah tahu artinya. Kami tidak menyebutkannya di templat deklarasi metode yang diberikan di awal pelajaran, karena ini opsional. Jika ditentukan, maka harus muncul setelah pengubah akses. Ingat bahwa dalam pelajaran baru-baru ini kita berbicara tentang variabel statis (kelas)? Ketika diterapkan pada metode, kata kunci ini kira-kira memiliki arti yang sama. Jika suatu metode statis , maka itu dapat digunakan tanpa referensi ke objek tertentu dari kelas. Dan memang, Anda tidak memerlukan Dogobjek untuk menjalankan metode statis main()diDogkelas. Ini akan berjalan dengan baik tanpa satu pun. Jika metode ini tidak statis, pertama-tama kita perlu membuat objek untuk menjalankannya.

3. Nilai pengembalian

Jika metode kami harus mengembalikan sesuatu, maka kami menentukan jenis nilai pengembalian. Ini terbukti dari contoh pengambil getName():

public String getName() {
   return name;
}
Ini mengembalikan Stringobjek. Jika suatu metode tidak mengembalikan apa pun, maka kata kunci void digunakan sebagai gantinya, seperti pada woof()metode:

public void woof() {
   System.out.println("A dog named " + name + " says \"Woof, woof!\"");
}

Metode dengan nama yang sama

Ada situasi ketika kita menginginkan beberapa cara berbeda untuk memanggil sebuah metode. Mengapa tidak membuat kecerdasan buatan kita sendiri? Amazon punya Alexa, Apple punya Siri, jadi mengapa kita tidak punya? :) Dalam film Iron Man, Tony Stark menciptakan kecerdasan buatannya sendiri yang luar biasa, Jarvis. Mari beri penghormatan untuk karakter luar biasa itu dan beri nama AI kita untuk menghormatinya. :) Hal pertama yang perlu kita lakukan adalah mengajari Jarvis menyapa orang yang memasuki ruangan (akan aneh jika kecerdasan yang luar biasa ternyata tidak sopan).

public class Jarvis {

   public void sayHi(String name) {
       System.out.println("Good evening, " + name + ". How are you?");
   }

   public static void main(String[] args) {
       Jarvis jarvis = new Jarvis();
       jarvis.sayHi("Tony Stark");
   }
}
Keluaran konsol: Selamat malam, Tony Stark. Apa kabarmu? Sangat bagus! Jarvis sekarang bisa menyambut tamu. Tentu saja, lebih sering daripada tuannya, Tony Stark. Tetapi bagaimana jika dia tidak datang sendiri! Tetapi sayHi()metode kami hanya menerima satu argumen. Sehingga hanya bisa menyapa satu orang yang memasuki ruangan, dan akan mengabaikan yang lain. Tidak terlalu sopan, setuju? :/ Dalam hal ini, kita dapat menyelesaikan masalah hanya dengan menulis 2 metode dengan nama yang sama, tetapi parameter berbeda:

public class Jarvis {

   public void sayHi(String firstGuest) {
       System.out.println("Good evening, " + firstGuest + ". How are you?");
   }

   public void sayHi(String firstGuest, String secondGuest) {
       System.out.println("Good evening, " + firstGuest + " and " + secondGuest + ". How are you?");
   }

}
Ini disebut metode overloading . Kelebihan metode membuat program kita lebih fleksibel dan mengakomodasi berbagai cara kerja. Mari kita tinjau cara kerjanya:

public class Jarvis {

   public void sayHi(String firstGuest) {
       System.out.println("Good evening, " + firstGuest + ". How are you?");
   }

   public void sayHi(String firstGuest, String secondGuest) {
       System.out.println("Good evening, " + firstGuest + " and " + secondGuest + ". How are you?");
   }

   public static void main(String[] args) {
       Jarvis jarvis = new Jarvis();
       jarvis.sayHi("Tony Stark");
       jarvis.sayHi("Tony Stark", "Captain America");
   }
}
Keluaran konsol: Selamat malam, Tony Stark. Apa kabarmu? Selamat malam, Tony Stark dan Kapten Amerika. Apa kabarmu? Luar biasa, kedua versi berfungsi. :) Tapi kami tidak menyelesaikan masalah! Bagaimana jika ada tiga tamu? Kita bisa, tentu saja, membebani sayHi()metode lagi, sehingga menerima tiga nama tamu. Tapi mungkin ada 4 atau 5. Hingga tak terhingga. Apakah tidak ada cara yang lebih baik untuk mengajari Jarvis menangani sejumlah nama, tanpa membebani metode sayHi()jutaan kali()? :/ Tentu saja ada! Jika tidak ada, menurut Anda 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?");
       }
   }

   public static void main(String[] args) {
       Jarvis jarvis = new Jarvis();
       jarvis.sayHi("Tony Stark");
       System.out.println();
       jarvis.sayHi("Tony Stark", "Captain America");
   }
}
Ketika ( String... nama ) digunakan sebagai parameter, ini menunjukkan bahwa kumpulan String akan diteruskan ke metode. Kami tidak harus menentukan sebelumnya berapa banyak yang akan ada, jadi sekarang metode kami jauh lebih fleksibel:

public class Jarvis {

   public void sayHi(String...names) {

       for (String name: names) {
           System.out.println("Good evening, " + name + ". How are you?");
       }
   }

   public static void main(String[] args) {
       Jarvis jarvis = new Jarvis();
       jarvis.sayHi("Tony Stark", "Captain America", "Black Widow", "Hulk");
   }
}
Keluaran konsol: Selamat malam, Tony Stark. Apa kabarmu? Selamat malam, Kapten Amerika. Apa kabarmu? Selamat malam, Janda Hitam. Apa kabarmu? Selamat malam, Hulk. Apa kabarmu? Di dalam metode, kami mengulangi semua argumen dan menampilkan frasa yang diformat dengan nama. Di sini kami menggunakan for-eachloop yang disederhanakan (yang telah Anda lihat sebelumnya). Ini sempurna di sini, karena notasi ( String... names ) sebenarnya berarti bahwa kompiler meletakkan semua argumen yang diteruskan ke dalam sebuah array. Akibatnya, kita dapat bekerja dengan nama variabelkarena kami akan bekerja dengan sebuah array, termasuk dengan mengulanginya dalam satu lingkaran. Plus, itu akan bekerja dengan sejumlah string yang diteruskan! Dua, sepuluh, bahkan seribu — metode ini akan bekerja dengan baik dengan jumlah tamu berapa pun. Jauh lebih nyaman daripada membebani metode untuk semua kemungkinan, bukan begitu? :) Inilah contoh lain dari metode overloading. Mari beri Jarvis sebuah printInfoFromDatabase()metode. Ini akan menampilkan informasi tentang seseorang dari database. Jika basis data menunjukkan bahwa seseorang adalah pahlawan super atau penjahat super, kami akan menampilkan informasi tersebut:

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("Also known as the superhero " + nickname);
       } else {
           System.out.println("Also known as the supervillain " + nickname);
       }
   }

   public static void main(String[] args) {
       Jarvis jarvis = new Jarvis();
       jarvis.printInfoFromDatabase("Laura Palmer. Date of birth: July 22, 1972. Twin Peaks, Washington");
       System.out.println();
       jarvis.printInfoFromDatabase("Max Eisenhardt. Height: 15.6 ft. Weight: 189 lbs. ", true, "Magneto");
   }
}
Keluaran: Laura Palmer. Tanggal lahir: 22 Juli 1972. Twin Peaks, Washington Max Eisenhardt. Tinggi: 15,6 kaki. Berat: 189 lbs. Juga dikenal sebagai penjahat super Magneto Jadi, perilaku metode kita bergantung pada data yang kita berikan padanya. Inilah poin penting lainnya: urutan argumen itu penting! Katakanlah metode kita menggunakan sebuah String dan sebuah angka:

public class Person {

   public static void sayYourAge(String greeting, int age) {
       System.out.println(greeting + " " + age);
   }

   public static void main(String[] args) {

       sayYourAge("My age is ", 33);
       sayYourAge(33, "My age is "); // Error!
   }
}
Jika metode Personkelas sayYourAge()mengambil string dan angka sebagai input, maka ini adalah urutan argumen yang harus diteruskan ke metode! Jika kita meneruskannya dalam urutan yang berbeda, maka kompiler akan menghasilkan kesalahan dan orang tersebut tidak akan dapat menyebutkan usianya. Ngomong-ngomong, konstruktor, yang kita bahas di pelajaran terakhir, juga merupakan metode! Anda juga dapat membebani mereka (yaitu membuat beberapa konstruktor dengan kumpulan parameter yang berbeda) dan urutan argumen yang diteruskan pada dasarnya juga penting bagi mereka. Itu adalah metode nyata! :)

Cara memanggil metode dengan parameter serupa

Seperti yang Anda ketahui, nulladalah kata kunci di Jawa. Sangat penting untuk dipahami bahwa nullini bukan objek atau tipe data . Bayangkan kita memiliki Personkelas dan introduce()metode, yang mengumumkan nama dan usia seseorang. Selanjutnya, usia dapat diteruskan sebagai teks atau angka.

public class Person {

   public void introduce(String name, String age) {
       System.out.println("My name is " + name + ". My age is " + age);
   }

   public void introduce(String name, Integer age) {
       System.out.println("My name is " + name + ". My age is " + age);
   }

   public static void main(String[] args) {

       Person alex = new Person();
       alex.introduce ("Alex", "twenty-one");

       Person mary = new Person();
       mary.introduce("Mary", 32);
   }
}
Kami sudah terbiasa dengan kelebihan beban, jadi kami tahu bahwa kedua metode akan berperilaku sebagaimana mestinya: Nama saya Alex. Usia saya dua puluh satu tahun. Nama saya Mary. Usia saya 32 tahun Tapi apa yang akan terjadi jika kita meneruskan nullsebagai parameter kedua, bukan string atau angka?

public static void main(String[] args) {

   Person victor = new Person();
   victor.introduce("Victor", null);// Ambiguous method call!
}
Kami akan mendapatkan kesalahan kompilasi! Apa yang menyebabkan ini dan apa sebenarnya "ambiguitas" itu? Faktanya, semuanya sangat sederhana. Masalahnya adalah kita memiliki dua versi metode: satu dengan a Stringsebagai argumen kedua, dan satu lagi dengan a Integersebagai argumen kedua. Tapi a Stringdan an Integerkeduanya bisa null! Karena mereka adalah tipe referensi, nulladalah nilai default untuk keduanya. Itu sebabnya dalam situasi ini kompiler tidak dapat mengetahui versi metode mana yang harus dipanggil. Solusi untuk masalah ini cukup sederhana. Nulldapat secara eksplisit dikonversi ke tipe referensi tertentu. Jadi, saat Anda memanggil metode, Anda dapat menunjukkan dalam tanda kurung tipe data yang Anda inginkan untuk argumen kedua! Kompiler akan memahami "petunjuk" Anda dan akan memanggil metode yang benar:

public class Person {

   public void introduce(String name, String age) {
       System.out.println("Method with two strings!");
       System.out.println("My name is " + name + ". My age is " + age);
   }

   public void introduce(String name, Integer age) {
       System.out.println("Method with a string and a number!");
       System.out.println("My name is " + name + ". My age is " + age);
   }

   public static void main(String[] args) {

       Person victor = new Person();
       victor.introduce("Victor", (String) null);
   }
}
Keluaran: Metode dengan dua string! Nama saya Victor. Umur saya null Perhatikan bahwa jika parameter angka adalah primitif int, bukan turunan dari tipe referensi Integer, tidak akan ada kesalahan seperti itu.

public class Person {

   public void introduce(String name, String age) {
       System.out.println("Method with two strings!");
       System.out.println("My name is " + name + ". My age is " + age);
   }

   public void introduce(String name, int age) {
       System.out.println("Method with a string and a number!!");
       System.out.println("My name is " + name + ". My age is " + age);
   }

   public static void main(String[] args) {

       Person victor = new Person();
       victor.introduce("Victor", null);
   }
}
Bisakah Anda menebak mengapa? Jika Anda menebak mengapa, bagus sekali! :) Karena primitif tidak bisa null. Sekarang compiler hanya memiliki satu pilihan, yaitu memanggil introduce()metode dengan dua string. Ini adalah versi dari metode yang akan dijalankan setiap kali metode dipanggil.

Lebih banyak membaca:

Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION