CodeGym /Java Blogu /Rastgele /Yöntem bildirimi
John Squirrels
Seviye
San Francisco

Yöntem bildirimi

grupta yayınlandı
MERHABA! Alanlar ve yöntemlerle kendi sınıflarınızı oluşturmayı zaten biliyorsunuz. Şimdi yöntemler üzerinde duracağız.
Yöntem bildirimi - 1
Elbette, bunu derslerimizde birden çok kez yaptık, ancak esas olarak genellemeleri ele aldık. Bugün, yöntemleri inceleyeceğiz ve nelerden yapıldıklarına, onları yaratmanın çeşitli yollarına ve hepsini nasıl yöneteceğimize bakacağız. :) Hadi gidelim!

Yöntem bildirimi

Bir yöntemi tanımlayan tüm kodlara yöntem bildirimi denir . Bir yöntem bildiriminin genel biçimi şu şekilde açıklanabilir:

access modifier, return type, method name (parameter list) {
    // method body
}
Örnek olarak, sınıfın çeşitli yöntemlerinin bildirimlerine bir göz atın 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. Erişim değiştirici

Erişim değiştiricisi her zaman önce belirtilir. Sınıfın tüm metotları publicDog değiştiricisi ile işaretlenmiştir . Bu, onları başka herhangi bir sınıftan arayabileceğimiz anlamına gelir:

public class Main {

   public static void main(String[] args) {

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

}
Gördüğünüz gibi, Dogsınıfın yöntemlerine sınıf içinde kolayca erişilebilir Main. Bu, genel değiştirici nedeniyle mümkündür . Java'da başka değiştiriciler de vardır. Hepsi yöntemlerin diğer sınıflarda kullanılmasına izin vermez. Onlar hakkında başka derslerde konuşacağız. Unutulmaması gereken en önemli şey, değiştiricinin neden sorumlu olduğu: bir yöntemin diğer sınıflarda erişilebilir olup olmadığı :)

2. statik anahtar kelime

DogYöntemlerden biri olan , staticmain() anahtar sözcüğüyle işaretlenmiştir . Aynı zamanda yöntem bildiriminin bir parçasıdır ve anlamını zaten biliyoruz. İsteğe bağlı olduğu için dersin başında verilen yöntem bildirimi şablonunda bahsetmedik. Belirtilmişse, erişim değiştiricisinden sonra gelmelidir. Son derslerde statik (sınıf) değişkenlerden bahsettiğimizi hatırlıyor musunuz? Yöntemlere uygulandığında, bu anahtar kelime kabaca aynı anlama gelir. Bir yöntem static ise , sınıfın belirli bir nesnesine başvuru olmadan kullanılabilir. Ve aslında, statik yöntemi çalıştırmak için bir nesneye ihtiyacınız yoktur.Dogmain()Dogsınıf. Biri olmadan gayet iyi çalışacak. Bu yöntem statik olmasaydı, onu çalıştırmak için önce bir nesne yaratmamız gerekirdi.

3. Dönüş değeri

Metodumuz bir şey döndürmeliyse, o zaman dönüş değerinin türünü belirtiriz. Bu, alıcı örneğinden açıkça görülmektedir getName():

public String getName() {
   return name;
}
Bir nesne döndürür String. Bir yöntem hiçbir şey döndürmezse, yöntemde olduğu gibi bunun yerine geçersiz anahtar kelime kullanılır woof():

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

Aynı ada sahip yöntemler

Bir yöntemi çağırmak için birkaç farklı yol isteyeceğimiz durumlar vardır. Neden kendi yapay zekamızı yaratmayalım? Amazon'da Alexa var, Apple'da Siri var, öyleyse neden bizde olmasın? :) Demir Adam filminde Tony Stark kendi inanılmaz yapay zekası Jarvis'i yaratıyor. Bu harika karaktere saygılarımızı sunalım ve yapay zekamıza onun adını verelim. :) Yapmamız gereken ilk şey, Jarvis'e odaya giren insanlara merhaba demeyi öğretmek (böylesine harika bir zekanın kaba çıkması tuhaf olurdu).

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");
   }
}
Konsol çıktısı: İyi akşamlar Tony Stark. Nasılsın? Çok güzel! Jarvis artık konukları ağırlayabilir. Tabii ki, efendisi Tony Stark'tan daha sık olacak. Ama ya yalnız gelmezse! Ancak yöntemimiz sayHi()yalnızca bir bağımsız değişkeni kabul eder. Ve böylece odaya giren sadece bir kişiyi selamlayabilir ve diğerini görmezden gelir. Pek kibar değil, anlaştık mı? :/ Bu durumda, aynı isimde fakat farklı parametrelere sahip 2 metot yazarak sorunu çözebiliriz:

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?");
   }

}
Buna yöntem aşırı yüklemesi denir . Yöntem aşırı yükleme, programımızın daha esnek olmasını ve çeşitli çalışma biçimlerini barındırmasını sağlar. Nasıl çalıştığını gözden geçirelim:

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");
   }
}
Konsol çıktısı: İyi akşamlar Tony Stark. Nasılsın? İyi akşamlar Tony Stark ve Kaptan Amerika. Nasılsın? Mükemmel, her iki sürüm de çalıştı. :) Ama sorunu çözmedik! Ya üç misafir varsa? Elbette sayHi()yöntemi tekrar aşırı yükleyebiliriz, böylece üç konuk adını kabul edebilir. Ama 4 veya 5 olabilir. Sonsuza kadar. sayHi()Yöntemi milyonlarca kez aşırı yüklemeden(), Jarvis'e herhangi bir sayıda adı işlemeyi öğretmenin daha iyi bir yolu yok mu ? :/ Elbette var! Olmasaydı, sizce Java dünyadaki en popüler programlama dili olur muydu? ;)

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");
   }
}
( String...names ) parametre olarak kullanıldığında, yönteme bir Dizeler koleksiyonunun aktarılacağını belirtir. Kaç tane olacağını önceden belirtmek zorunda değiliz, bu yüzden artık yöntemimiz çok daha esnek:

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");
   }
}
Konsol çıktısı: İyi akşamlar Tony Stark. Nasılsın? İyi akşamlar, Kaptan Amerika. Nasılsın? İyi akşamlar Kara Dul. Nasılsın? İyi akşamlar Hulk. Nasılsın? Yöntemin içinde, tüm bağımsız değişkenleri yineliyoruz ve adlarla biçimlendirilmiş tümcecikleri gösteriyoruz. for-eachBurada (daha önce gördüğünüz) basitleştirilmiş bir döngü kullanıyoruz . Burası mükemmel, çünkü ( String...names ) gösterimi aslında derleyicinin iletilen tüm bağımsız değişkenleri bir diziye koyduğu anlamına gelir. Sonuç olarak, değişken isimleri ile çalışabiliriz.bir döngüde yineleme yapmak da dahil olmak üzere bir dizi ile çalışacağımız gibi. Artı, herhangi bir sayıda geçirilen diziyle çalışacaktır! İki, on, hatta bin—yöntem herhangi bir sayıda misafirle düzgün çalışacaktır. Yöntemi tüm olasılıklar için aşırı yüklemekten çok daha uygun, sence de öyle değil mi? :) İşte başka bir yöntem aşırı yükleme örneği. Jarvis'e bir yöntem verelim printInfoFromDatabase(). Bir veritabanındaki bir kişi hakkında bilgi görüntüler. Veritabanı, bir kişinin bir süper kahraman veya kötü adam olduğunu belirtirse, bu bilgiyi gösteririz:

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");
   }
}
Çıktı: Laura Palmer. Doğum tarihi: 22 Temmuz 1972. Twin Peaks, Washington Max Eisenhardt. Yükseklik: 15,6 ft. Ağırlık: 189 lbs. Süper kötü adam Magneto So olarak da bilinir , yöntemimizin davranışı ona ilettiğimiz verilere bağlıdır. İşte bir başka önemli nokta: argümanların sırası önemlidir! Diyelim ki yöntemimiz bir String ve bir sayı alıyor:

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!
   }
}
PersonSınıfın yöntemi girdi olarak bir dize ve bir sayı alıyorsa sayYourAge(), bu argümanların yönteme iletilmesi gereken sıra budur! Bunları farklı bir sırayla iletirsek, derleyici bir hata üretecek ve kişi yaşını söyleyemeyecektir. Bu arada, son derste ele aldığımız yapıcılar da yöntemlerdir! Ayrıca bunları aşırı yükleyebilirsiniz (yani, farklı parametre kümelerine sahip birkaç oluşturucu oluşturun) ve aktarılan bağımsız değişkenlerin sırası onlar için de temelde önemlidir. Bunlar gerçek yöntemler! :)

Benzer parametrelere sahip yöntemler nasıl çağrılır?

Bildiğiniz gibi, nullJava'da bir anahtar kelimedir. nullBunun ne bir nesne ne de bir veri türü olmadığını anlamak çok önemlidir . Kişinin adını ve yaşını bildiren bir Personsınıfımız ve yöntemimiz olduğunu hayal edin . introduce()Ayrıca yaş, metin veya sayı olarak iletilebilir.

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);
   }
}
Aşırı yüklemeye zaten aşinayız, dolayısıyla her iki yöntemin de olması gerektiği gibi davranacağını biliyoruz: Benim adım Alex. Yaşım yirmi bir Benim adım Mary. Yaşım 32null Ama ikinci parametre olarak string veya sayı yerine geçersek ne olur ?

public static void main(String[] args) {

   Person victor = new Person();
   victor.introduce("Victor", null);// Ambiguous method call!
}
Bir derleme hatası alacağız! Buna ne sebep olur ve "belirsizlik" tam olarak nedir? Aslında, her şey çok basit. Sorun şu ki, yöntemin iki versiyonuna sahibiz: biri Stringikinci argüman olarak a ile, diğeri Integerikinci argüman olarak an ile. Ama a Stringve an Integerher ikisi de olabilir null! Referans türleri olduklarından, nullher ikisi için de varsayılan değerdir. Bu nedenle bu durumda derleyici, yöntemin hangi sürümünü çağırması gerektiğini anlayamaz. Bu sorunun çözümü oldukça basittir. Nullaçıkça belirli bir referans türüne dönüştürülebilir. Böylece bir metot çağırdığınızda ikinci argüman için istediğiniz veri tipini parantez içinde belirtebilirsiniz! Derleyici "ipucunuzu" anlayacak ve doğru yöntemi arayacaktır:

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);
   }
}
Çıktı: İki dizili yöntem! Benim adım Victor. Yaşım null Sayı parametresi, Tamsayı referans türünün bir örneği yerine ilkel olsaydı int, böyle bir hata olmayacağını unutmayın.

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);
   }
}
Nedenini tahmin edebilir misin? Nedenini tahmin ettiyseniz, aferin! :) Çünkü ilkel olamaz null. Artık derleyicinin tek bir seçeneği vardır, yani introduce()yöntemi iki dizge ile çağırmak. Bu, yöntem her çağrıldığında çalışacak yöntemin sürümüdür.
Yorumlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION