İçeriğe geç
Educora
Başlangıç16 dk6 / 18

Metotlar

Kodu yeniden kullanılabilir metotlara böl: parametreler, dönüş değeri, void, static, aşırı yükleme ve özyineleme.

Kendini test et
Bu derste öğreneceklerin
  • Parametreleri ve dönüş değeri olan static bir metot yazmak ve çağırmak
  • Metot aşırı yüklemesini (overloading) kullanmak
  • Java'da argümanların değerle aktarıldığını açıklamak

Programının on farklı yerinde bir odanın alanını hesaplaman gerektiğini düşün. Aynı formülü on kez yazarsan tek bir hatayı düzeltmek için on yeri değiştirmen gerekir. Metot, adı olan bir kod bloğudur: onu bir kez yazar, istediğin kadar çağırırsın. Bir metodu zaten tanıyorsun: main.

Bir metodun yapısı

Java
public class Main {
    static void greet(String name) {
        System.out.println("Hello, " + name + "!");
    }

    static double area(double width, double height) {
        return width * height;
    }

    static boolean isEven(int n) {
        return n % 2 == 0;
    }

    public static void main(String[] args) {
        greet("Aysel");
        greet("Murad");
        double room = area(4.5, 3);
        System.out.println("Room area: " + room);
        System.out.println(isEven(10) + " " + isEven(7));
    }
}
Beklenen çıktı
Hello, Aysel!
Hello, Murad!
Room area: 13.5
true false
  • static, metodun sınıfa ait olduğunu ve nesne oluşturmadan çağrılabileceğini gösterir. Nesne metotlarını bir sonraki modülde göreceksin.
  • Dönüş türü (void, double, boolean) metodun ne döndürdüğünü belirtir. void, “hiçbir şey döndürmez” demektir.
  • Parantez içindeki parametreler metodun girdileridir; her birinin bir türü ve adı vardır. Çağrıda verilen somut değerlere argüman denir.
  • return, sonucu metodun çağrıldığı yere geri gönderir ve metodu hemen bitirir.

Dikkat: area(4.5, 3) çağrısında 3 bir tam sayıdır ama parametre double türündedir; Java onu otomatik olarak 3.0'a genişletir. boolean döndüren metotların adları genellikle is ya da has ile başlar: isEven, hasTicket.

Aşırı yükleme ve Math sınıfı

Java'da aynı adlı birden fazla metot olabilir; yeter ki parametre listeleri (sayı ya da tür bakımından) farklı olsun. Buna metot aşırı yüklemesi (overloading) denir. Derleyici hangi sürümü çağıracağını argümanlara bakarak seçer. Yalnızca dönüş türünün farklı olması yeterli değildir.

Java
public class Main {
    static int max(int a, int b) {
        return a > b ? a : b;
    }

    static double max(double a, double b) {
        return a > b ? a : b;
    }

    static int max(int a, int b, int c) {
        return max(max(a, b), c);
    }

    public static void main(String[] args) {
        System.out.println(max(3, 9));
        System.out.println(max(2.5, 1.5));
        System.out.println(max(4, 11, 7));
        System.out.println(Math.max(5, 8) + " " + Math.sqrt(49) + " " + Math.pow(2, 10) + " " + Math.abs(-3));
    }
}
Beklenen çıktı
9
2.5
11
8 7.0 1024.0 3

Argümanlar değerle aktarılır

Bir metot çağrıldığında Java her argümanın değerini parametreye kopyalar. Bu yüzden metodun içinde bir int parametresini değiştirmek, çağıran taraftaki değişkeni etkilemez. Dizilerde ve nesnelerde ise kopyalanan şey nesnenin kendisi değil, ona bir referanstır; metot bu referans üzerinden aynı dizinin elemanlarını değiştirebilir.

Java
public class Main {
    static void tryToChange(int x, int[] arr) {
        x = 100;
        arr[0] = 100;
    }

    public static void main(String[] args) {
        int number = 1;
        int[] numbers = {1, 2, 3};
        tryToChange(number, numbers);
        System.out.println(number);
        System.out.println(numbers[0]);
    }
}
Beklenen çıktı
1
100

Özyineleme ve değişken sayıda argüman

Bir metot kendini de çağırabilir; buna özyineleme (recursion) denir. Her özyinelemeli metodun bir durma koşulu olmalıdır; yoksa çağrılar sonsuza kadar sürer ve program StackOverflowError ile durur. int... values yazımı ise metoda istenen sayıda argüman vermeyi sağlar; metodun içinde bunlar bir dizi gibi görünür.

Java
public class Main {
    static int factorial(int n) {
        if (n <= 1) {
            return 1;
        }
        return n * factorial(n - 1);
    }

    static int sum(int... values) {
        int total = 0;
        for (int v : values) {
            total += v;
        }
        return total;
    }

    public static void main(String[] args) {
        System.out.println(factorial(5));
        System.out.println(sum(1, 2, 3));
        System.out.println(sum(10, 20, 30, 40));
        System.out.println(sum());
    }
}
Beklenen çıktı
120
6
100
0
factorial(5) nasıl hesaplanır?

Özyinelemeli factorial metodunun factorial(5) çağrısını adım adım izle.

Çözümü göster
factorial(5) = 5 · factorial(4)
factorial(4) = 4 · factorial(3)
factorial(3) = 3 · factorial(2)
factorial(2) = 2 · factorial(1)
factorial(1) = 1 — durma koşulu.
Şimdi geri döneriz: 2 · 1 = 2, 3 · 2 = 6, 4 · 6 = 24, 5 · 24 = 120.

Önemli noktalar

  • Metot, adı olan bir kod bloğudur: bir kez yazılır, defalarca çağrılır.
  • Başlık; dönüş türünü, adı ve parametreleri belirtir. void hiçbir şey döndürmez, diğer türler return gerektirir.
  • Aşırı yükleme: aynı adlı metotların parametre listeleri farklı olmalıdır.
  • Java argümanları değerle aktarır; dizilerde ve nesnelerde kopyalanan değer bir referanstır.
  • Özyinelemeli bir metodun mutlaka bir durma koşulu olmalıdır.

Kendini test et

10 soru. Her doğru cevap XP kazandırır.

1 / 10
void dönüş türü ne anlama gelir?