Skip to content

Latest commit

 

History

History
 
 

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 

Statik Metotlar

Sınıfın içine yazdığımız değişkenler ve metotlar, o sınıfın bir örneği oluşturulduğunda hafızaya yüklenir. Bir metodu çağırabilmeniz için, önce o metodun ait olduğu sınıfın bir örneğini almanız gerekir. Fakat bazı durumlarda sınıftan bağımsız metotlar yazmak isteyebilirsiniz. Bu metotları çağırmak için bütün sınıfın bir örneğini oluşturup hafızaya yüklemek gereksiz olabilir. Bu gibi durumlarda statik metot tanımlarız. Statik metotlar, sınıfın içine yazılmasına rağmen sınıftan bağımsız olan ve çalıştırılması için sınıfın örneğinin alınmasına gerek olmayan metotlardır. Her Java programının giriş noktası olan main() metodunun da statik bir metot olduğunu hatırlayacaksınız.

Statik metot tanımlarken metodun dönüş tipinden önce static deyimini kullanırız.

Statik metotlarla ilgili bazı kısıtlamalar bulunmaktadır:

  • Yalnızca aynı sınıf içindeki statik metot ve değişkenlere doğrudan erişebilirler; çünkü statik olmayan alanların hafızada oluşabilmesi için sınıfın bir örneğinin alınması gerekir.
  • Statik metotlar this ve super deyimlerini kullanamazlar; çünkü bu deyimleri kullanabilmek için sınıfın bir örneğinin alınmış olması gerekir.

Şimdi durumu daha iyi kavramak adına bir örnek inceleyelim. Math adında matematiksel işlemleri yaptığımız bir sınıfımız olsun. Bu sınıfın içine, iki parametre arasında değeri en küçük olan sayıyı bulan bir metot yazalım:

class Math
{
	public int min(int a, int b)
	{
		return a < b ? a : b;
	}
}

Yukarıda yazdığımız min() metodunu aşağıdaki gibi kullanabiliriz:

Math math = new Math();
System.out.println(math.min(3, 5)); // Konsola 3 yazar

Gördüğünüz gibi metodu çağırabilmek için sınıfın örneğini almak zorundayız. Fakat hemen fark edeceğiniz gibi, bu metodun Math sınıfıyla herhangi bir bağlantısı yoktur. Sınıfın herhangi bir metoduna veya değişkenine erişmediği gibi, çalışması için bu sınıfın hafızada var olmasına da gerek yoktur. Yine de metodu çağırabilmek için mecburen sınıfın bir örneğini alıyoruz. Şimdi aynı metodu statik olarak tanımlayalım ve aradaki farkı görelim:

class Math
{
	public static int min(int a, int b)
	{
		return a < b ? a : b;
	}
}

Statik olarak tanımladığımız bu metodu aşağıdaki gibi kullanabiliriz:

System.out.println(Math.min(3, 5)); // Konsola 3 yazar

Gördüğünüz gibi, statik metodu çağırmak için sınıfın bir örneğini almamıza gerek yoktur. Bu tarz metotları yazmak için statik deyimini sıklıkla kullanacağız. Fakat statik kısıtlamalarına dikkat etmemiz gerekir. Aşağıdaki örnekleri inceleyelim:

class Math
{
	private int result;

    public static int min(int a, int b)
	{
		result = a < b ? a : b; // Bu satır hataya neden olur
		return result;
	}
}

Yukarıdaki örnekte Math sınıfının içinde result adında bir değişken tanımladık. Şimdi metodun içinde iki sayı arasından değeri küçük olanı buluyor ve bu değişkene atıyoruz. Fakat bu satır hataya neden olur; çünkü result değişkeni statik olarak belirtilmediği için ancak sınıfın bir örneği alınırsa hafızada bulunabilir. Metodumuz ise statik olduğundan Math sınıfının örneğini almaya gerek yoktur. Uzun lafın kısası, min() metodumuz çalıştığında hafızada result adında bir değişken yoktur.

Statik bir metottan, ancak ve ancak sınıfın diğer statik alanlarına erişilebilir. Yukarıdaki kodu değiştirerek result değişkenini de statik olarak belirlersek hata olmayacaktır:

class Math
{
	private static int result;
	
    public static int min(int a, int b)
	{
		result = a < b ? a : b; // Bu satır hataya neden olmaz
		return result;
	}
}