1. Kaedah statik
Selain pembolehubah statik, kelas juga boleh mempunyai kaedah statik.
Kaedah biasa terikat pada objek (contoh) kelas dan boleh merujuk kepada pembolehubah biasa (bukan statik) kelas (serta pembolehubah statik dan kaedah ). Kaedah statik terikat pada objek statik kelas dan hanya boleh mengakses pembolehubah statik dan/atau kaedah statik kelas lain.
Untuk memanggil kaedah biasa (bukan statik) pada kelas, anda mesti mencipta objek kelas dahulu dan kemudian memanggil kaedah pada objek. Anda tidak boleh memanggil kaedah biasa pada kelas dan bukannya objek.
Contoh:
Anda tidak boleh memanggil kaedah bukan statik pada kelas! |
---|
|
Tetapi untuk memanggil kaedah statik, cukup untuk objek statik kelas hanya wujud (dan ia sentiasa wujud selepas kelas dimuatkan ke dalam memori). Inilah sebabnya kaedah main() adalah statik. Ia terikat pada objek statik kelas, jadi anda tidak perlu mencipta sebarang objek untuk memanggilnya.
Untuk mengisytiharkan kaedah statik, anda perlu menulis kata kunci statik sebelum pengepala kaedah. Penampilan umum binaan ini adalah seperti berikut:
static Type name(parameters)
{
method code
}
Contoh:
Kod | Catatan |
---|---|
|
Mesin Java memanggil main kaedah dengan arahan seperti ini: Solution.main() ; Kaedah statik test() dipanggil dalam main() kaedah statik. |
Untuk memanggil kaedah statik dari kelas lain, anda perlu menentukan nama kelas sebelum nama kaedah statik. Penampilan umum binaan ini adalah seperti berikut:
Type name = ClassName.methodName(arguments)
Contoh:
Kod | Kaedah statik |
---|---|
|
|
|
|
|
|
2. Kaedah statik vs biasa (bukan statik).
Apakah perbezaan antara kaedah statik dan kaedah biasa?
Kaedah biasa terikat pada objek biasa (contoh kelas), manakala kaedah statik tidak. Kaedah biasa boleh mengakses pembolehubah dalam contohnya, tetapi kaedah statik tidak boleh: ia hanya tidak mempunyai contoh yang berkaitan.
Perbezaan antara dua jenis kaedah dinyatakan dalam jadual berikut:
Keupayaan/harta benda | Kaedah biasa | Kaedah statik |
---|---|---|
Terikat kepada contoh kelas | ya | Tidak |
Boleh memanggil kaedah biasa kelas | ya | Tidak |
Boleh memanggil kaedah statik kelas | ya | ya |
Boleh mengakses pembolehubah biasa kelas | ya | Tidak |
Boleh mengakses pembolehubah statik kelas | ya | ya |
Boleh dipanggil pada objek | ya | ya |
Boleh dipanggil masuk kelas | Tidak | ya |
Mengapakah kaedah sedemikian diperlukan jika ia sangat terhad? Jawapannya ialah pendekatan ini juga ada kelebihannya.
Pertama, anda tidak perlu menghantar sebarang rujukan objek untuk mengakses kaedah dan pembolehubah statik.
Kedua, kadangkala anda perlu ada hanya satu contoh pembolehubah. Sebagai contoh, System.out
( pembolehubah keluar statik kelas Sistem ).
Dan, ketiga, kadangkala anda perlu memanggil kaedah sebelum ia mungkin untuk mencipta objek. Sebagai contoh, mesin Java memanggil kaedah main() untuk memulakan pelaksanaan program walaupun sebelum contoh kelas dibuat.
Terikat kepada contoh kelas
Apabila kaedah biasa dipanggil, hujah - objek yang kaedah dipanggil - secara tersirat dihantar kepadanya. Parameter ini dipanggil this
. Parameter tersirat ini (rujukan kepada objek yang kaedah dipanggil) membezakan kaedah biasa daripada kaedah statik.
Kaedah statik tidak mempunyai parameter tersirat ini, jadi anda tidak boleh menggunakan this
kata kunci dalam kaedah statik dan anda tidak boleh memanggil kaedah bukan statik dalam kaedah statik. Tiada tempat untuk mendapatkan rujukan kepada contoh kelas.
Boleh memanggil kaedah biasa kelas
Kaedah biasa sentiasa mempunyai this
parameter tersirat, jadi anda sentiasa mempunyai rujukan kepada objek yang kaedah dipanggil. Setiap kali anda memanggil kaedah biasa dalam kaedah biasa lain, this
parameter tersirat digunakan untuk membuat panggilan itu. Contoh
Kod | Bagaimana ia berfungsi |
---|---|
|
|
Itulah sebabnya anda tidak boleh memanggil kaedah biasa daripada kaedah statik. Tiada pembolehubah tersirat yang dinamakan this
di dalam kaedah statik.
Atau bayangkan situasi lain: belum ada satu pun objek kelas kami yang dicipta dalam program kami. Bolehkah kita memanggil kaedah statik kelas kita? ya. Dan bolehkah kaedah statik ini memanggil kaedah biasa (bukan statik)?
Nah, objek apa yang akan kita panggil? Lagipun, belum ada satu pun contoh kelas kami yang wujud!
Boleh memanggil kaedah statik kelas
Kaedah statik boleh dipanggil dari mana-mana — dari mana-mana tempat dalam program. Ini bermakna bahawa mereka boleh dipanggil dari kedua-dua kaedah statik dan yang biasa. Tiada sekatan di sini.
Boleh mengakses pembolehubah biasa kelas
Anda boleh mengakses pembolehubah biasa kelas daripada kaedah biasa, kerana ia boleh mendapatkan rujukan dengan mudah kepada contoh kelas melalui this
parameter tersirat.
Kaedah statik tidak mengetahui contoh kelas yang harus digunakan untuk mendapatkan nilai pembolehubah biasa. Dan secara amnya, kita boleh dengan mudah mempunyai situasi di mana kaedah statik dipanggil tetapi belum ada satu contoh kelas pun dicipta dalam atur cara.
Akibatnya, kaedah statik tidak boleh mengakses pembolehubah biasa kelas.
Katakan kaedah statik memanggil kaedah biasa. Apakah objek yang harus dipanggil kaedah biasa itu?
Tiada sesiapa yang tahu! Itulah sebabnya anda tidak boleh memanggil kaedah biasa daripada kaedah statik tanpa memberikan rujukan kepada objek!
Boleh mengakses pembolehubah statik kelas
Situasi dengan panggilan kepada pembolehubah statik adalah sama seperti dengan panggilan kepada kaedah statik. Pembolehubah statik boleh diakses dari mana-mana dalam program. Ini bermakna anda boleh mengaksesnya daripada kaedah statik dan biasa.
Boleh dipanggil pada objek
Kedua-dua kaedah statik dan biasa boleh dipanggil pada objek. Panggilan kaedah biasa mungkin — sememangnya, itulah satu-satunya cara untuk memanggil kaedah biasa. Kaedah statik juga boleh dipanggil pada objek: dalam kes ini pengkompil sendiri menentukan jenis pembolehubah dan memanggil kaedah statik berdasarkan jenisnya:
Kod | Bagaimana pengkompil melihatnya |
---|---|
|
|
|
|
|
|
Boleh dipanggil masuk kelas
Anda hanya boleh memanggil kaedah statik pada kelas. Untuk memanggil kaedah biasa, anda memerlukan rujukan kepada contoh kelas. Oleh itu, anda tidak boleh memanggil kaedah biasa menggunakan binaan ini:ClassName.methodName(arguments)