Untuk lebih spesifik, saya mencoba kode ini:
package hello;
public class Hello {
Clock clock = new Clock();
public static void main(String args[]) {
clock.sayTime();
}
}
Tapi itu memberi kesalahan
Tidak dapat mengakses bidang non-statis dalam metode statis utama
Jadi saya mengubah pernyataan clock
menjadi ini:
static Clock clock = new Clock();
Dan itu berhasil. Apa artinya menempatkan kata kunci itu sebelum deklarasi? Apa tepatnya yang akan dilakukannya dan / atau batasi dalam hal apa yang dapat dilakukan untuk objek itu?
java
static
oop
language-features
restriction
Klik Upvote
sumber
sumber
Jawaban:
static
anggota menjadi anggota kelas, bukan contoh khusus.Ini berarti bahwa hanya ada satu instance dari
static
bidang yang ada [1] bahkan jika Anda membuat sejuta instance dari kelas atau Anda tidak membuat apapun. Ini akan dibagikan oleh semua instance.Karena
static
metode juga bukan milik instance tertentu, mereka tidak dapat merujuk ke anggota instance. Dalam contoh yang diberikan,main
tidak tahu instanceHello
kelas apa (dan karenanya instanceClock
kelas mana) yang harus dirujuk.static
anggota hanya dapat merujuk kestatic
anggota. Anggota Instance dapat, tentu saja, mengaksesstatic
anggota.Catatan samping: Tentu saja,
static
anggota dapat mengakses anggota contoh melalui referensi objek .Contoh:
[1]: Bergantung pada karakteristik runtime, itu bisa satu per ClassLoader atau AppDomain atau utas, tetapi itu di samping intinya.
sumber
Ini berarti bahwa hanya ada satu instance dari "jam" di Hello, tidak satu per setiap instance terpisah dari kelas "Hello", atau lebih-lebih, itu berarti bahwa akan ada satu referensi "jam" yang umum dibagikan di antara semua contoh kelas "Halo".
Jadi jika Anda melakukan "Halo baru" di mana saja dalam kode Anda: A- dalam skenario pertama (sebelum perubahan, tanpa menggunakan "statis"), itu akan membuat jam baru setiap kali "Halo baru" dipanggil, tetapi B- dalam skenario kedua (setelah perubahan, menggunakan "statis"), setiap instance "Halo baru" masih akan berbagi dan menggunakan referensi "jam" awal dan yang sama yang pertama kali dibuat.
Kecuali jika Anda membutuhkan "jam" di suatu tempat di luar main, ini juga akan berfungsi:
sumber
main()
rutin harus mandiri.main
metode karena OP lakukan. Jika sebaliknya itu adalah metode publik yang dipanggil dari tempat lain, dan kelas Hello dipakai lebih dari satu kali, maka itu bisa membuat instance Clock untuk setiap instance Hello, kecuali jikaclock
statis.Kata
static
kunci berarti bahwa sesuatu (bidang, metode, atau kelas bertingkat) terkait dengan tipe daripada setiap instance tipe tertentu. Jadi misalnya, seseorang memanggilMath.sin(...)
tanpa instanceMath
kelas apa pun, dan memang Anda tidak dapat membuat instanceMath
kelas.Untuk informasi lebih lanjut, lihat bit yang relevan dari Tutorial Java Oracle .
Sidenote
Sayangnya Java memungkinkan Anda untuk mengakses anggota statis seolah-olah mereka adalah anggota contoh, mis
Itu membuatnya tampak seolah-olah
sleep
adalah metode instan, tapi itu sebenarnya metode statis - selalu membuat thread saat ini tidur. Ini praktik yang lebih baik untuk memperjelas ini dalam kode panggilan:sumber
System.out
tidak suka nama jenis bagi saya.Kata
static
kunci dalam Java berarti bahwa variabel atau fungsi dibagi di antara semua instance kelas itu karena itu termasuk tipe , bukan objek aktual itu sendiri.Jadi jika Anda memiliki variabel:
private static int i = 0;
dan Anda menambahkannya (i++
) dalam satu contoh, perubahan akan tercermin dalam semua contoh.i
sekarang akan menjadi 1 dalam semua kasus.Metode statis dapat digunakan tanpa membuat instance objek.
sumber
Penggunaan dasar anggota statis ...
Itulah cara Anda dapat memiliki nilai yang dibagikan di semua anggota kelas tanpa mengirim instance kelas Halo ke kelas lain. Dan sedikit statis Anda tidak perlu membuat instance kelas.
Anda bisa memanggil nilai atau metode statis dengan nama kelas:
sumber
Statis berarti bahwa Anda tidak harus membuat turunan kelas untuk menggunakan metode atau variabel yang terkait dengan kelas. Dalam contoh Anda, Anda dapat menghubungi:
secara langsung, alih-alih:
Dari dalam metode statis (yang termasuk kelas) Anda tidak dapat mengakses anggota mana pun yang tidak statis, karena nilainya tergantung pada instantiasi Anda dari kelas. Objek Clock non-statis, yang merupakan anggota instance, akan memiliki nilai / referensi yang berbeda untuk setiap instance kelas Hello Anda, dan karenanya Anda tidak dapat mengaksesnya dari bagian statis kelas.
sumber
Statis di Jawa:
Statis adalah Pengubah Akses Non. Kata kunci statis milik kelas daripada instance kelas. dapat digunakan untuk melampirkan Variabel atau Metode ke Kelas.
Kata kunci statis BISA digunakan dengan:
metode
Variabel
Kelas bersarang di dalam Kelas lain
Blok Inisialisasi
TIDAK BISA digunakan dengan:
Kelas (tidak bersarang)
Konstruktor
Antarmuka
Metode Kelas Batin Lokal (Perbedaan lalu kelas bersarang)
Metode Kelas Batin
Variabel Instance
Variabel Lokal
Contoh:
Bayangkan contoh berikut yang memiliki jumlah instance bernama variabel yang ditambahkan dalam konstruktor:
Keluaran:
Karena variabel instan mendapatkan memori pada saat pembuatan objek, masing-masing objek akan memiliki salinan variabel instan, jika ditambahkan, itu tidak akan mencerminkan ke objek lain.
Sekarang jika kita mengubah jumlah variabel instance menjadi yang statis maka program akan menghasilkan output yang berbeda:
Keluaran:
Dalam hal ini variabel statis akan mendapatkan memori hanya sekali, jika ada objek yang mengubah nilai variabel statis, ia akan mempertahankan nilainya.
Statis dengan Final:
Variabel global yang dinyatakan sebagai final dan statis tetap tidak berubah untuk seluruh eksekusi. Karena, anggota statis disimpan dalam memori kelas dan mereka dimuat hanya sekali dalam seluruh eksekusi. Mereka umum untuk semua objek kelas. Jika Anda mendeklarasikan variabel statis sebagai final, salah satu objek tidak dapat mengubah nilainya karena final. Oleh karena itu, variabel yang dinyatakan sebagai final dan statis kadang-kadang disebut sebagai Konstanta. Semua bidang antarmuka disebut konstanta, karena bersifat final dan statis secara default.
Sumber Daya Gambar: Final Static
sumber
Untuk menambah jawaban yang ada, izinkan saya mencoba dengan gambar:
Tingkat bunga 2% diterapkan untuk SEMUA rekening tabungan. Karena itu statis .
Keseimbangan harus individual , jadi tidak statis.
sumber
Diskusi ini sejauh ini mengabaikan pertimbangan classloader. Sebenarnya, bidang statis Java dibagi antara semua instance kelas untuk classloader yang diberikan .
sumber
Bidang dapat ditugaskan ke kelas atau instance kelas. Secara default, field adalah variabel instan. Dengan menggunakan
static
bidang menjadi variabel kelas, dengan demikian ada satu dan hanya satuclock
. Jika Anda membuat perubahan di satu tempat, itu terlihat di mana-mana. Instans varables diubah secara independen satu sama lain.sumber
Kata kunci
static
digunakan untuk menunjukkan bidang atau metode sebagai milik kelas itu sendiri dan bukan turunannya. Menggunakan kode Anda, jika objekClock
statis, semua instanceHello
kelas akan berbagiClock
anggota data (bidang) ini secara umum. Jika Anda membuatnya non-statis, setiap instance individuHello
dapat memilikiClock
bidang unik .Masalahnya adalah Anda menambahkan metode utama ke kelas Anda
Hello
sehingga Anda bisa menjalankan kode. Masalahnya di sini adalah bahwa metode utama adalah statis dan karena itu, tidak dapat merujuk ke bidang atau metode non-statis di dalamnya. Anda dapat menyelesaikan ini dengan dua cara:Hello
statis kelas sehingga mereka dapat dirujuk di dalam metode utama . Ini benar-benar bukan hal yang baik untuk dilakukan (atau alasan yang salah untuk membuat bidang dan / atau metode statis)Hello
kelas Anda di dalam metode utama dan akses semua bidang itu dan metode seperti yang dimaksudkan di tempat pertama.Bagi Anda, ini berarti perubahan berikut pada kode Anda:
sumber
Di Jawa,
static
kata kunci dapat dianggap sebagai menunjukkan hal-hal berikut:Jika Anda berpikir
static
seperti ini, akan lebih mudah untuk memahami penggunaannya dalam berbagai konteks yang dihadapi:Sebuah
static
lapangan adalah bidang yang termasuk kelas daripada keadaan apa punSebuah
static
metode adalah metode yang tidak memiliki gagasanthis
; itu didefinisikan pada kelas dan tidak tahu tentang contoh tertentu dari kelas itu kecuali referensi dilewatkan ke sanaKelas
static
anggota adalah kelas bersarang tanpa gagasan atau pengetahuan tentang instance kelas melampirkan (kecuali referensi ke instance kelas melampirkan diteruskan ke sana)sumber
Statis menjadikan anggota jam sebagai anggota kelas, bukan anggota contoh. Tanpa kata kunci statis, Anda harus membuat turunan dari kelas Hello (yang memiliki variabel anggota jam) - mis
sumber
metode statis tidak menggunakan variabel instan dari kelas mereka didefinisikan. Penjelasan yang sangat baik tentang perbedaan dapat ditemukan di halaman ini
sumber
Saya telah mengembangkan kesukaan untuk metode statis (hanya, jika mungkin) di kelas "pembantu".
Kelas panggilan tidak perlu membuat variabel anggota lain (contoh) dari kelas pembantu. Anda cukup memanggil metode kelas pembantu. Juga kelas helper ditingkatkan karena Anda tidak lagi memerlukan konstruktor, dan Anda tidak perlu variabel anggota (contoh).
Mungkin ada keuntungan lain.
sumber
sumber
Bisa juga memikirkan anggota statis tidak memiliki pointer "ini". Mereka dibagikan di antara semua contoh.
sumber
Memahami konsep statis
Kelas kedua
sumber
main()
adalah metode statis yang memiliki dua batasan mendasar:this()
dansuper()
tidak dapat digunakan dalam konteks statis.sumber
Variabel Statis Hanya dapat diakses hanya dengan metode statis, jadi ketika kita mendeklarasikan variabel statis, metode pengambil dan penyetel akan berupa metode statis
metode statis adalah tingkat kelas yang dapat kita akses menggunakan nama kelas
Berikut ini adalah contoh untuk Variabel Statis Getters And Setters:
sumber
Sebuah pertanyaan diajukan di sini tentang pilihan kata 'statis' untuk konsep ini. Itu bohong dengan pertanyaan ini, tapi saya tidak berpikir etimologinya sudah jelas diatasi. Begitu...
Itu karena penggunaan kembali kata kunci, dimulai dengan C.
Pertimbangkan deklarasi data dalam C (di dalam fungsi tubuh):
Variabel foo dibuat pada stack ketika fungsi dimasukkan (dan dimusnahkan ketika fungsi berakhir). Sebaliknya, bilah selalu ada, jadi 'statis' dalam arti bahasa Inggris yang umum - bilah tidak ada kemana-mana.
Java, dan bahasa-bahasa serupa, memiliki konsep yang sama untuk data. Data dapat dialokasikan per instance kelas (per objek) atau sekali untuk seluruh kelas. Karena Java bertujuan untuk memiliki sintaks yang akrab untuk programmer C / C ++, kata kunci 'statis' sesuai di sini.
Terakhir, kami sampai pada metode.
Secara konseptual, ada turunan foo () untuk setiap turunan kelas C. Hanya ada satu turunan bar () untuk seluruh kelas C. Ini paralel dengan kasus yang kita bahas untuk data, dan oleh karena itu menggunakan 'statis Lagi-lagi merupakan pilihan yang masuk akal, terutama jika Anda tidak ingin menambahkan lebih banyak kata kunci yang dilindungi undang-undang ke bahasa Anda.
sumber