1. Metode statis

Selain variabel statis, kelas juga dapat memiliki metode statis.

Metode reguler terikat ke objek (instance) kelas dan dapat merujuk ke variabel kelas biasa (non-statis) (serta variabel dan metode statis ). Metode statis terikat ke objek statis kelas dan hanya dapat mengakses variabel statis dan/atau metode statis kelas lainnya.

Untuk memanggil metode biasa (non-statis) pada sebuah kelas, Anda harus terlebih dahulu membuat objek kelas dan kemudian memanggil metode pada objek tersebut. Anda tidak dapat memanggil metode biasa di kelas daripada objek.

Contoh:

Anda tidak dapat memanggil metode non-statis di kelas!
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!
   }
}

Tetapi untuk memanggil metode statis, itu cukup untuk objek statis kelas hanya ada (dan selalu ada setelah kelas dimuat ke dalam memori). Inilah mengapa metode main() bersifat statis. Itu terikat ke objek statis kelas, jadi Anda tidak perlu membuat objek apa pun untuk memanggilnya.

Untuk mendeklarasikan metode statis, Anda perlu menulis kata kunci statis sebelum header metode. Tampilan umum dari konstruksi ini adalah sebagai berikut:

static Type name(parameters)
{
   method code
}

Contoh:

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

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


Mesin Java memanggil mainmetode dengan perintah seperti ini: Solution.main();



Metode statis test()disebut dalam main()metode statis.

Untuk memanggil metode statis dari kelas lain, Anda harus menentukan nama kelas sebelum nama metode statis. Tampilan umum dari konstruksi ini adalah sebagai berikut:

Type name = ClassName.methodName(arguments)

Contoh:

Kode Metode statis
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. Metode statis vs biasa (non-statis).

Apa perbedaan antara metode statis dan metode biasa?

Metode biasa terikat pada objek biasa (instance dari kelas), sedangkan metode statis tidak. Metode biasa dapat mengakses variabel dalam instance-nya, tetapi metode statis tidak bisa: ia tidak memiliki instance terkait.

Perbedaan antara kedua jenis metode tersebut disajikan dalam tabel berikut:

Kemampuan/properti Metode biasa Metode statis
Terikat ke instance kelas Ya TIDAK
Dapat memanggil metode biasa dari kelas Ya TIDAK
Dapat memanggil metode statis kelas Ya Ya
Dapat mengakses variabel biasa dari kelas Ya TIDAK
Dapat mengakses variabel statis kelas Ya Ya
Dapat dipanggil pada suatu objek Ya Ya
Bisa dipanggil di kelas TIDAK Ya

Mengapa metode seperti itu diperlukan jika sangat terbatas? Jawabannya adalah pendekatan ini juga memiliki kelebihan.

Pertama, Anda tidak perlu meneruskan referensi objek apa pun untuk mengakses metode dan variabel statis.

Kedua, kadang-kadang Anda hanya membutuhkan satu contoh variabel. Misalnya, System.out( variabel keluar statis kelas Sistem ).

Dan, ketiga, terkadang Anda perlu memanggil metode bahkan sebelum membuat objek. Misalnya, mesin Java memanggil metode main() untuk memulai eksekusi program bahkan sebelum instance kelas dibuat.

Terikat ke instance kelas

Ketika metode biasa dipanggil, sebuah argumen — objek di mana metode dipanggil — secara implisit diteruskan ke sana. Parameter ini disebut this. Parameter implisit ini (referensi ke objek tempat metode dipanggil) membedakan metode biasa dari metode statis.

Metode statis tidak memiliki parameter implisit ini, jadi Anda tidak dapat menggunakan kata thiskunci di dalam metode statis, dan Anda tidak dapat memanggil metode non-statis di dalam metode statis. Tidak ada tempat untuk mendapatkan referensi ke instance kelas.

Dapat memanggil metode biasa dari kelas

Metode biasa selalu memiliki thisparameter implisit, jadi Anda selalu memiliki referensi ke objek yang memanggil metode tersebut. Setiap kali Anda memanggil metode biasa di dalam metode biasa lainnya, thisparameter implisit digunakan untuk melakukan panggilan itu. Contoh

Kode Bagaimana itu bekerja
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);
}

Itulah mengapa Anda tidak dapat memanggil metode biasa dari metode statis. Tidak ada variabel implisit yang disebutkan thisdi dalam metode statis.

Atau bayangkan situasi lain: belum ada satu objek pun dari kelas kita yang dibuat dalam program kita. Bisakah kita memanggil metode statis kelas kita? Ya. Dan bisakah metode statis ini memanggil metode biasa (non-statis)?

Nah, objek apa yang akan kita sebut? Lagi pula, belum ada satu pun instance dari kelas kita!

Dapat memanggil metode statis kelas

Metode statis dapat dipanggil dari mana saja — dari mana saja dalam program. Ini berarti bahwa mereka dapat dipanggil dari metode statis dan metode biasa. Tidak ada batasan di sini.

Dapat mengakses variabel biasa dari kelas

Anda dapat mengakses variabel biasa dari suatu kelas dari metode biasa, karena dapat dengan mudah memperoleh referensi ke turunan kelas melalui parameter implisit this.

Metode statis tidak mengetahui instance kelas mana yang harus digunakan untuk mendapatkan nilai variabel biasa. Dan lebih umum, kita dapat dengan mudah memiliki situasi di mana metode statis dipanggil tetapi belum ada satu pun instance kelas yang dibuat dalam program.

Akibatnya, metode statis tidak dapat mengakses variabel biasa dari suatu kelas.

Misalkan metode statis memanggil metode biasa. Objek apa yang harus dipanggil dengan metode biasa itu?

Metode statis

Tidak ada yang tahu! Itu sebabnya Anda tidak dapat memanggil metode biasa dari yang statis tanpa meneruskan referensi ke suatu objek!

Dapat mengakses variabel statis kelas

Situasi dengan panggilan ke variabel statis sama dengan panggilan ke metode statis. Variabel statis dapat diakses dari mana saja di dalam program. Itu berarti Anda dapat mengaksesnya dari metode statis dan biasa.

Dapat dipanggil pada suatu objek

Baik metode statis maupun biasa dapat dipanggil pada suatu objek. Kemungkinan pemanggilan metode biasa — memang, itulah satu-satunya cara untuk memanggil metode biasa. Metode statis juga dapat dipanggil pada suatu objek: dalam hal ini kompiler itu sendiri menentukan jenis variabel dan memanggil metode statis berdasarkan jenisnya:

Kode Bagaimana kompiler melihatnya
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);

Bisa dipanggil di kelas

Anda hanya dapat memanggil metode statis di kelas. Untuk memanggil metode biasa, Anda memerlukan referensi ke instance kelas. Oleh karena itu, Anda tidak dapat memanggil metode biasa menggunakan konstruksi ini:ClassName.methodName(arguments)