Mengapa Anda tidak dapat mendeklarasikan kelas sebagai statis di Java?
java
static-class
Mariselvam
sumber
sumber
static
?static
kelas sebagaiabstract final
, yaitu, mereka tidak bisa dipakai dan tidak bisa diperpanjang. Ini berarti mereka hanya dapat berisi anggota statis, yang berguna untuk kelas yang hanya berisi metode pembantu.Jawaban:
Hanya kelas bersarang yang bisa statis. Dengan melakukan itu, Anda dapat menggunakan kelas bersarang tanpa memiliki instance dari kelas luar.
Sumber:
Pada topik yang sama:
sumber
Kelas tingkat atas adalah statis secara default. Kelas dalam adalah non-statis secara default. Anda dapat mengubah default untuk kelas dalam dengan secara eksplisit menandainya statis. Kelas tingkat atas, berdasarkan tingkat atas, tidak dapat memiliki semantik non-statis karena tidak ada kelas induk untuk merujuk. Oleh karena itu, tidak ada cara untuk mengubah default untuk kelas tingkat atas.
sumber
static
kata kunci pada kelas tingkat atas untuk menyatakan dan menegakkan bahwa itu mungkin hanya berisi anggota statis, dan tidak akan dipakai; yang dapat, bagaimanapun, membingungkan orang karenastatic
memiliki arti yang berbeda untuk kelas bersarang.Jadi, saya datang terlambat ke pesta, tapi inilah dua sen saya - secara filosofis menambah jawaban Colin Hebert.
Pada tingkat tinggi, pertanyaan Anda membahas perbedaan antara objek dan tipe. Meskipun ada banyak mobil (objek), hanya ada satu kelas Mobil (tipe). Mendeklarasikan sesuatu sebagai statis berarti Anda beroperasi di ruang "ketik". Hanya ada satu. Kata kunci kelas tingkat atas sudah menentukan jenis di ruang "ketik". Akibatnya "mobil kelas statis publik" berlebihan.
sumber
Kelas dengan konstruktor pribadi bersifat statis.
Nyatakan kelas Anda seperti ini:
dan Anda dapat digunakan tanpa inisialisasi:
sumber
static class
deklarasi dalam C #), kompiler bahkan tidak akan mengizinkan kode untuk mendeklarasikan variabel jenis itu, atau menggunakannya sebagai parameter tipe generik. Kurangnya konstruktor yang dapat diakses di kelas yang jika tidak dapat dipakai atau diwarisi tidak akan menghalangi deklarasi variabel dari tipe itu, atau penggunaannya sebagai parameter tipe generik.Tentu mereka bisa, tetapi hanya kelas bersarang
batin. Di sana, itu berarti instance kelas bersarang tidak memerlukan instance terlampir dari kelas luar.Tetapi untuk kelas tingkat atas, perancang bahasa tidak dapat memikirkan sesuatu yang berguna untuk dilakukan dengan kata kunci, jadi itu tidak diperbolehkan.
sumber
static
, terkadang masuk akal untuk dapat melakukannya. Sebagai contoh, kelas yang hanya berisi metode pembantu statis tidak masuk akal untuk dipakai, tetapi bahasa Java tidak menghentikan Anda dari melakukannya. Anda bisa membuat kelas menjadi non-instantiable (dan praktis 'statis') ke kelas lain dengan mendeklarasikan konstruktor defaultprivate
, yang melarang instantiasi karena tidak ada konstruktor yang terlihat.Anda dapat membuat kelas utilitas (yang tidak dapat membuat instance dibuat) dengan mendeklarasikan tipe enum tanpa instance. yaitu Anda secara spesifik menyatakan bahwa tidak ada instance.
sumber
... itu dapat dideklarasikan statis - selama itu adalah kelas anggota.
Dari JLS:
dan di sini:
Kata kunci statis tidak masuk akal untuk kelas tingkat atas, hanya karena kelas tingkat atas tidak memiliki tipe penutup.
sumber
Inner
?Nested
akan menjadi pilihan yang kurang membingungkan.Seperti yang dijelaskan di atas, suatu Kelas tidak boleh statis kecuali jika itu adalah anggota dari Kelas lain.
Jika Anda ingin merancang kelas "yang tidak mungkin ada banyak contoh", Anda mungkin ingin melihat pola desain "Singleton".
Info Singleton Pemula di sini .
Peringatan:
sumber
Selain bagaimana Java mendefinisikan kelas dalam statis, ada definisi lain dari kelas statis sesuai dengan dunia C # [1] . Kelas statis adalah kelas yang hanya memiliki metode statis (fungsi) dan dimaksudkan untuk mendukung pemrograman prosedural. Kelas semacam itu sebenarnya bukan kelas karena pengguna kelas hanya tertarik pada fungsi helper dan tidak membuat instance kelas. Sementara kelas statis didukung dalam C #, tidak ada dukungan langsung seperti itu ada di Jawa. Namun Anda dapat menggunakan enums untuk meniru kelas statis C # di Java sehingga pengguna tidak pernah dapat membuat instance dari kelas tertentu (bahkan menggunakan refleksi) [2] :
sumber
Semua yang kita kode di java masuk ke kelas. Setiap kali kita menjalankan kelas JVM instantiates objek. JVM dapat membuat sejumlah objek, menurut definisi Static berarti Anda memiliki set salinan yang sama untuk semua objek.
Jadi, jika Java akan membiarkan kelas atas menjadi statis setiap kali Anda menjalankan program itu menciptakan Obyek dan terus mengesampingkan ke Lokasi Memori yang sama.
Jika Anda hanya mengganti objek setiap kali Anda menjalankannya, apa gunanya membuatnya?
Jadi itulah alasan Java menyingkirkan statis untuk Kelas Tingkat atas.
Mungkin ada alasan yang lebih konkret, tetapi ini masuk akal bagi saya.
sumber
Satu-satunya kelas yang bisa statis adalah kelas dalam. Kode berikut berfungsi dengan baik:
Inti dari kelas dalam statis adalah bahwa mereka tidak memiliki referensi ke objek kelas luar.
sumber
Saya pikir ini mungkin semudah minum segelas kopi !. Coba lihat ini. Kami tidak menggunakan kata kunci statis secara eksplisit saat mendefinisikan kelas.
Bukankah itu definisi kelas statis? Kami hanya menggunakan fungsi yang diikat ke kelas saja. Berhati-hatilah bahwa dalam hal ini kita bisa menggunakan kelas lain dalam sarang itu. Lihat ini:
sumber
new StaticClass()
dan itu tidak masuk akal. Dengan konstruktor pribadi itu tidak akan mengizinkan hal itu.Seseorang dapat melihat
PlatformUI
di Eclipse untuk kelas dengan metode statis dan konstruktor pribadi dengan dirinya sendiri bersifat final.sumber
jika manfaat menggunakan kelas-statis adalah tidak membuat instance objek dan menggunakan metode kemudian hanya menyatakan kelas sebagai publik dan metode ini sebagai statis.
sumber