1. Statik yöntemler

Statik değişkenlere ek olarak, sınıfların statik yöntemleri de olabilir.

Normal yöntemler, bir sınıfın nesnelerine (örneklerine) bağlıdır ve sınıfın sıradan (statik olmayan) değişkenlerine (ayrıca statik değişkenlere ve yöntemlere ) atıfta bulunabilir. Statik yöntemler, sınıfın statik nesnesine bağlıdır ve yalnızca sınıfın statik değişkenlerine ve/veya diğer statik yöntemlerine erişebilir.

Bir sınıfta sıradan (statik olmayan) bir yöntemi çağırmak için, önce sınıfın bir nesnesini oluşturmanız ve ardından yöntemi nesne üzerinde çağırmanız gerekir. Sınıfta bir nesne yerine sıradan bir yöntem çağıramazsınız.

Örnek:

Bir sınıfta statik olmayan bir yöntemi çağıramazsınız!
public class DataInfo
{
   public int getValue()
   {
      return 100;
   }
}

public class Solution
{
   public static void main(String[] args)
   {
      System.out.println(DataInfo.getValue()); // This will generate an error!
   }
}

Ancak statik bir yöntemi çağırmak için, sınıfın statik nesnesinin basitçe var olması yeterlidir (ve sınıf belleğe yüklendikten sonra her zaman var olur). Bu nedenle main() yöntemi statiktir. Sınıfın statik nesnesine bağlıdır, dolayısıyla onu çağırmak için herhangi bir nesne oluşturmanız gerekmez.

Bir yöntemi static olarak bildirmek için, yöntem başlığından önce static anahtar sözcüğünü yazmanız gerekir. Bu yapının genel görünümü aşağıdaki gibidir:

static Type name(parameters)
{
   method code
}

Örnekler:

kod Not
public class Solution
{
   public static void main(String args[])
   {
      test();
   }

   public static void test()
   {
      int d = 2/0;
   }
}


Java makinesi, mainyöntemi şöyle bir komutla çağırır: Solution.main();



Statik test()yöntem, statik yöntemde çağrılır main().

Başka bir sınıftan statik bir yöntem çağırmak için statik yöntemin adından önce sınıf adını belirtmeniz gerekir. Bu yapının genel görünümü aşağıdaki gibidir:

Type name = ClassName.methodName(arguments)

Örnekler:

kod Statik yöntem
int x = Math.min(a, b);
int min(int a, int b)
Thread.sleep(200);
void sleep(long ms)
Path path = Path.of("c:\\readme.txt");
Path of(String str)


2. Statik ve sıradan (statik olmayan) yöntemler

Statik yöntemlerle sıradan yöntemler arasındaki fark nedir?

Sıradan bir yöntem, sıradan bir nesneye (bir sınıfın örneği) bağlıdır, statik bir yöntem ise değildir. Sıradan bir yöntem, örneğindeki değişkenlere erişebilir, ancak statik bir yöntem şunları yapamaz: İlişkili bir örneği yoktur.

İki yöntem türü arasındaki farklar aşağıdaki tabloda ifade edilmiştir:

Yetenek/özellik Sıradan yöntem Statik yöntem
Sınıfın bir örneğine bağlı Evet HAYIR
Sınıfın sıradan yöntemlerini çağırabilir Evet HAYIR
Sınıfın statik yöntemlerini çağırabilir Evet Evet
Sınıfın sıradan değişkenlerine erişebilir Evet HAYIR
Sınıfın statik değişkenlerine erişebilir Evet Evet
Bir nesne üzerinde çağrılabilir Evet Evet
Sınıfta çağrılabilir HAYIR Evet

Bu kadar ciddi şekilde sınırlıysa, bu tür yöntemlere neden ihtiyaç var? Cevap, bu yaklaşımın da avantajları olduğudur.

İlk olarak, statik yöntemlere ve değişkenlere erişmek için herhangi bir nesne referansı iletmeniz gerekmez.

İkincisi, bazen bir değişkenin yalnızca tek bir örneği olması gerekir. Örneğin, System.out( System sınıfının statik çıkış değişkeni ).

Ve üçüncüsü, bazen nesne yaratmanın bile mümkün olabilmesi için bir yöntemi çağırmanız gerekir. Örneğin, Java makinesi, sınıfın bir örneği oluşturulmadan önce programın yürütülmesini başlatmak için main() yöntemini çağırır.

Sınıfın bir örneğine bağlı

Sıradan bir yöntem çağrıldığında, yöntemin çağrıldığı nesne olan bir argüman ona dolaylı olarak iletilir. Bu parametre denir this. Bu örtülü parametre (yöntemin çağrıldığı nesneye bir başvuru), sıradan yöntemleri statik olanlardan ayırır.

Statik yöntemlerde bu örtük parametre yoktur, bu nedenle statik yöntemler içinde anahtar kelimeyi kullanamazsınız thisve statik bir yöntem içinde statik olmayan bir yöntemi çağıramazsınız. Bir sınıfın örneğine referans almak için hiçbir yer yoktur.

Sınıfın sıradan yöntemlerini çağırabilir

Sıradan bir yöntem her zaman örtük thisparametreye sahiptir, bu nedenle her zaman yöntemin çağrıldığı nesneye bir başvurunuz olur. Sıradan bir yöntemi başka bir sıradan yöntem içinde çağırdığınızda, thisbu çağrıyı yapmak için örtük parametre kullanılır. Örnek

kod Nasıl çalışır
int min(int a, int b)
{
   return a < b ? a : b;
}

int min(int a, int b, int c)
{
   int t = min(a, b);
   return min(t, c);
}
int min(int a, int b)
{
   return a < b ? a : b;
}

int min(int a, int b, int c)
{
   int t = this.min(a, b);
   return this.min(t, c);
}

Bu nedenle, statik bir yöntemden sıradan bir yöntem çağıramazsınız. thisStatik bir yöntem içinde adlandırılmış hiçbir örtük değişken yoktur .

Ya da başka bir durum hayal edin: Programımızda henüz sınıfımızın tek bir nesnesi bile yaratılmadı. Sınıfımızın statik bir metodunu çağırabilir miyiz? Evet. Ve bu statik yöntem sıradan (statik olmayan) bir yöntemi çağırabilir mi?

Peki, onu hangi nesne üzerinde arayacağız? Ne de olsa, sınıfımızın tek bir örneği henüz yok!

Sınıfın statik yöntemlerini çağırabilir

Statik yöntemler, programın herhangi bir yerinden — herhangi bir yerden çağrılabilir. Bu, hem statik yöntemlerden hem de sıradan yöntemlerden çağrılabilecekleri anlamına gelir. Burada herhangi bir kısıtlama yoktur.

Sınıfın sıradan değişkenlerine erişebilir

Bir sınıfın sıradan değişkenlerine, sıradan bir yöntemden erişebilirsiniz, çünkü bu, örtük parametre aracılığıyla sınıfın bir örneğine kolayca bir başvuru elde edebilir this.

Statik bir yöntem, sıradan değişkenlerin değerlerini almak için sınıfın hangi örneğini kullanması gerektiğini bilmez. Ve daha genel olarak, statik bir yöntemin çağrıldığı ancak programda henüz sınıfın tek bir örneğinin oluşturulmadığı bir duruma kolaylıkla sahip olabiliriz.

Sonuç olarak, statik yöntemler bir sınıfın sıradan değişkenlerine erişemez.

Statik bir yöntemin sıradan bir yöntemi çağırdığını varsayalım. Bu sıradan yöntem hangi nesne üzerinde çağrılmalıdır?

Statik yöntemler

Kimse bilmiyor! Bu nedenle, bir nesneye referans vermeden, statik bir yöntemden sıradan bir yöntem çağıramazsınız !

Sınıfın statik değişkenlerine erişebilir

Statik değişkenlere yapılan çağrılardaki durum, statik yöntemlere yapılan çağrılarla aynıdır. Statik değişkenlere programın herhangi bir yerinden erişilebilir. Bu, onlara statik ve sıradan yöntemlerden erişebileceğiniz anlamına gelir.

Bir nesne üzerinde çağrılabilir

Bir nesne üzerinde hem statik hem de sıradan yöntemler çağrılabilir. Sıradan bir yöntem çağrısı mümkündür - aslında sıradan bir yöntemi çağırmanın tek yolu budur. Bir nesne üzerinde statik bir yöntem de çağrılabilir: bu durumda derleyicinin kendisi değişkenin türünü belirler ve türüne göre statik yöntemi çağırır:

kod Derleyici bunu nasıl görür?
Thread th = Thread.current();
th.sleep(1000);
Thread th = Thread.current();
Thread.sleep(1000);
Integer i = 1;
int x = i.parseInt("12");
Integer i = 1;
int x = Integer.parseInt("12");
"".valueOf(12);
String.valueOf(12);

Sınıfta çağrılabilir

Bir sınıfta yalnızca statik bir yöntem çağırabilirsiniz. Sıradan bir yöntemi çağırmak için, sınıfın bir örneğine başvuruya ihtiyacınız vardır. Bu nedenle, bu yapıyı kullanarak sıradan bir yöntemi çağıramazsınız:ClassName.methodName(arguments)