Saya telah menulis kode tes ini:
class MyProgram
{
int count = 0;
public static void main(String[] args)
{
System.out.println(count);
}
}
Tapi itu memberikan kesalahan berikut:
Main.java:6: error: non-static variable count cannot be referenced from a static context
System.out.println(count);
^
Bagaimana saya mendapatkan metode saya untuk mengenali variabel kelas saya?
C
. Tapi itu tidak akan menjadi yang sangat bagus. Cobalah menggunakan Java dengan cara yang seharusnya digunakan, sebagai bahasa berorientasi objek.Jawaban:
Anda harus memahami perbedaan antara kelas dan turunan dari kelas itu. Jika Anda melihat mobil di jalan, Anda segera tahu bahwa itu adalah mobil walaupun Anda tidak dapat melihat model atau tipe mana. Ini karena Anda membandingkan apa yang Anda lihat dengan kelas "mobil". Kelas berisi yang mirip dengan semua mobil. Anggap saja sebagai templat atau gagasan.
Pada saat yang sama, mobil yang Anda lihat adalah turunan dari "mobil" kelas karena memiliki semua properti yang Anda harapkan: Ada seseorang yang mengendarainya, ia memiliki mesin, roda.
Jadi kelas mengatakan "semua mobil memiliki warna" dan contoh mengatakan "mobil khusus ini berwarna merah".
Di dunia OO, Anda mendefinisikan kelas dan di dalam kelas, Anda menentukan bidang tipe
Color
. Ketika kelas dipakai (ketika Anda membuat contoh tertentu), memori dicadangkan untuk warna dan Anda dapat memberikan contoh khusus ini warna. Karena atribut ini spesifik, mereka tidak statis.Bidang dan metode statis dibagikan dengan semua instance. Mereka adalah untuk nilai-nilai yang spesifik untuk kelas dan bukan contoh khusus. Untuk metode, ini biasanya adalah metode penolong global (seperti
Integer.parseInt()
). Untuk bidang, biasanya konstanta (seperti jenis mobil, yaitu sesuatu di mana Anda memiliki set terbatas yang tidak sering berubah).Untuk menyelesaikan masalah Anda, Anda perlu membuat instance (membuat objek) dari kelas Anda sehingga runtime dapat menyimpan memori untuk instance (jika tidak, instance yang berbeda akan saling menimpa yang tidak Anda inginkan).
Dalam kasus Anda, coba kode ini sebagai blok awal:
main()
Metode baru membuat instance kelas yang dikandungnya (terdengar aneh tapi karenamain()
dibuat dengan kelas bukan dengan instance, ia bisa melakukan ini) dan kemudian memanggil metode instance (run()
).sumber
Bidang dan metode statis terhubung ke kelas itu sendiri dan bukan instansnya. Jika Anda memiliki kelas
A
, metode 'normal'b
, dan metode statisc
, dan Anda membuat turunana
dari kelas AndaA
, panggilan keA.c()
dana.b()
valid. Metodec()
tidak tahu instance mana yang terhubung, sehingga tidak bisa menggunakan bidang non-statis.Solusi untuk Anda adalah Anda membuat bidang Anda statis atau metode Anda tidak statis. Anda dapat terlihat seperti ini:
sumber
Kata
static
kunci memodifikasi siklus hidup suatu metode atau variabel dalam suatu kelas. Sebuahstatic
metode atau variabel dibuat pada saat kelas dimuat. Metode atau variabel yang tidak dideklarasikan sebagaistatic
dibuat hanya ketika kelas dipakai sebagai objek misalnya dengan menggunakannew
operator.Siklus hidup suatu kelas, secara umum, adalah:
new
operator menggunakan kelas untuk membuat instance kelas sebagai objek aktual dan kemudian ketika dilakukan dengan objekUntuk memiliki titik masuk awal untuk suatu aplikasi, Java telah mengadopsi konvensi bahwa program Java harus memiliki kelas yang berisi metode dengan nama yang disepakati atau khusus. Metode khusus ini disebut
main()
. Karena metode harus ada apakah kelas yang berisi metode utama telah dipakai atau tidak,main()
metode harus dideklarasikan denganstatic
pengubah sehingga segera setelah kelas dimuat,main()
metode tersedia.Hasilnya adalah bahwa ketika Anda memulai aplikasi Java Anda dengan baris perintah seperti
java helloworld
serangkaian tindakan terjadi. Pertama-tama Java Virtual Machine dijalankan dan diinisialisasi. Selanjutnya file helloworld.class yang berisi kode Java yang dikompilasi dimuat ke Java Virtual Machine. Kemudian Java Virtual Machine mencari metode dihelloworld
kelas yang dipanggilmain(String [] args)
. metode ini harus sedemikianstatic
sehingga akan ada walaupun kelas belum benar-benar dipakai sebagai objek. Java Virtual Machine tidak membuat turunan kelas dengan membuat objek dari kelas. Itu hanya memuat kelas dan memulai eksekusi padamain()
metode.Jadi Anda perlu membuat instance kelas Anda sebagai objek dan kemudian Anda dapat mengakses metode dan variabel kelas yang belum dideklarasikan dengan
static
pengubah. Setelah program Java Anda mulai denganmain()
fungsi, Anda dapat menggunakan variabel atau metode apa pun yang memiliki pengubahstatic
sejak mereka ada sebagai bagian dari kelas yang sedang dimuat.Namun, variabel dan metode kelas yang berada di luar
main()
metode yang tidak memilikistatic
pengubah tidak dapat digunakan sampai turunan kelas telah dibuat sebagai objek dalammain()
metode. Setelah membuat objek, Anda dapat menggunakan variabel dan metode objek. Upaya untuk menggunakan variabel dan metode kelas yang tidak memilikistatic
pengubah tanpa melalui objek kelas ditangkap oleh kompiler Java pada waktu kompilasi dan ditandai sebagai kesalahan.sumber
Mari kita analisis program Anda terlebih dahulu .. Dalam program Anda, metode pertama Anda adalah
main()
, dan ingatlah itu adalah metode statis ... Kemudian Anda mendeklarasikan variabel lokal untuk metode itu (compareCount, rendah, tinggi, dll.). Cakupan variabel ini hanya metode yang dideklarasikan, terlepas dari itu metode statis atau non-statis. Jadi, Anda tidak dapat menggunakan variabel-variabel di luar metode itu. Ini adalah kesalahan dasar yang Anda buat.Kemudian kita sampai pada poin berikutnya. Anda bilang statis membunuh Anda. (Mungkin membunuhmu tetapi itu hanya memberi hidup pada programmu !!) Pertama-tama kamu harus memahami hal dasar. * Metode statis hanya memanggil metode statis dan hanya menggunakan variabel statis. * Variabel statis atau metode statis tidak tergantung pada instance kelas apa pun. (Yaitu Jika Anda mengubah keadaan variabel statis itu akan tercermin dalam semua objek dari kelas) * Karena ini Anda menyebutnya sebagai variabel kelas atau metode kelas. Dan masih banyak lagi tentang kata kunci "statis". Saya harap sekarang Anda mendapatkan idenya. Pertama-tama ubahlah ruang lingkup variabel dan nyatakan sebagai statis (untuk dapat menggunakannya dalam metode statis).
Dan saran untuk Anda adalah: Anda salah memahami gagasan tentang ruang lingkup variabel dan fungsi statis. Dapatkan ide yang jelas tentang itu.
sumber
Yang paling mendasar adalah variabel statis atau metode statis berada di level kelas. Variabel atau metode tingkat kelas dimuat sebelum metode tingkat variabel atau variabel. Dan jelas hal yang tidak dimuat tidak dapat digunakan. Jadi kompiler java tidak membiarkan hal-hal yang harus ditangani pada saat run diselesaikan pada waktu kompilasi. Itu sebabnya itu memberi Anda kesalahan hal-hal non-statis tidak dapat disebut dari konteks statis. Anda hanya perlu membaca tentang Lingkup Tingkat Kelas, Lingkup Tingkat Instans dan Lingkup Lokal.
sumber
Untuk dapat mengaksesnya dari metode statis Anda, mereka perlu variabel anggota statis, seperti ini:
sumber
Sekarang Anda dapat menambahkan / menggunakan instance dengan dalam metode ini
sumber
Saya akan mencoba menjelaskan hal yang statis kepada Anda. Pertama-tama variabel statis bukan milik instance kelas tertentu. Mereka dikenali dengan nama kelasnya. Metode statis lagi bukan milik lagi untuk contoh tertentu. Mereka hanya dapat mengakses variabel statis. Bayangkan Anda memanggil MyClass.myMethod () dan myMethod adalah metode statis. Jika Anda menggunakan variabel non-statis di dalam metode ini, bagaimana ia bisa tahu variabel mana yang akan digunakan? Itu sebabnya Anda dapat menggunakan metode statis hanya variabel statis. Saya ulangi lagi bahwa mereka TIDAK milik contoh tertentu.
sumber
Hal pertama adalah mengetahui perbedaan antara instance kelas, dan kelas itu sendiri. Kelas memodelkan properti tertentu, dan perilaku keseluruhan dalam konteks properti tersebut. Sebuah instance akan menentukan nilai spesifik untuk properti tersebut.
Apa pun yang terikat dengan kata kunci statis tersedia dalam konteks kelas daripada dalam konteks instance kelas
Sebagai akibat wajar atas
Masa pakai bidang / metode statis sama dengan masa pakai aplikasi Anda
Misalnya Katakanlah, mobil memiliki warna properti, dan menunjukkan perilaku 'gerak'. Sebuah contoh dari mobil itu adalah Beetle Red Volkswagen yang bergerak pada kecepatan 25 km / jam.
Sekarang properti statis mobil akan menjadi jumlah roda (4) di jalan, dan ini akan berlaku untuk semua mobil.
HTH
sumber
ClassLoader bertanggung jawab untuk memuat file kelas. Mari kita lihat apa yang terjadi ketika kita menulis kelas kita sendiri.
Contoh 1:
Sekarang kita dapat melihat bahwa kelas "StaticTest" memiliki 3 bidang. Tapi sebenarnya tidak ada b, variabel anggota c. Tapi mengapa ???. OK, jangan sampai. Di sini b, c adalah variabel instan. Karena variabel instan mendapat memori pada saat pembuatan objek. Jadi di sini b, c belum mendapatkan memori apa pun. Itu sebabnya tidak ada keberadaan b, c. Jadi hanya ada keberadaan a. Untuk ClassLoader hanya memiliki satu informasi tentang a. ClassLoader belum mengenali b, c karena objeknya belum dipakai.
Mari kita lihat contoh lain: Contoh 2:
Sekarang jika kita mencoba mengkompilasi kode ini kompiler akan memberikan kesalahan CE CE: tampilan metode non-statis () tidak dapat dirujuk dari konteks statis.
Sekarang Untuk ClassLoader sepertinya:
Dalam Contoh 2 kesalahan CE adalah karena kita memanggil metode non statis dari konteks statis. Jadi tidak mungkin bagi ClassLoader untuk mengenali tampilan metode () pada waktu kompilasi. Sehingga terjadi kesalahan waktu kompilasi.
sumber
Sebelum Anda memanggil metode instance atau variabel instan, diperlukan objek (Instance). Ketika variabel instance dipanggil dari compiler metode statis tidak tahu objek mana yang dimiliki variabel ini. Karena metode statis tidak memiliki objek (Hanya satu salinan selalu). Saat Anda memanggil variabel instan atau metode instan dari metode instan, ia merujuk
this
objek. Ini berarti variabel milik objek apa pun yang dibuat dan masing-masing objek memiliki salinan metode dan variabel contoh itu sendiri.Variabel statis ditandai sebagai
static
dan variabel instan tidak memiliki kata kunci spesifik.sumber
Ini sedikit berbeda untuk menjelaskan tentang kata kunci statis untuk semua pemula.
Anda akan mengetahuinya dengan jelas ketika Anda bekerja lebih banyak dengan Kelas dan Objek.
| * | Statis: Item statis dapat dipanggil dengan Nama Kelas
Jika Anda mengamati dalam kode, Beberapa fungsi secara langsung dipanggil dengan Nama kelas seperti
Ini karena NamFnc dan println akan dideklarasikan menggunakan kata kunci statis sebelum mereka.
| * | Non Statis: Item Non Statis dapat dipanggil dengan Kelas Variabel
Jika tidak statis, Anda memerlukan variabel kelas,
beri titik setelah variabel kelas,
lalu panggil fungsi.
Kode di bawah ini menjelaskan Anda dengan rapi
| * | Fungsi statis dan non Statis di kelas:
| * | Kelas Statis dan Non Statis di dalam Kelas:
sumber