Salah satu anak saya mengambil Jawa di sekolah menengah dan melakukan ini di salah satu tesnya:
Manakah dari berikut ini yang merupakan pengidentifikasi yang valid di Java?
Sebuah.
123java
b.main
c.java1234
d.{abce
e.)whoot
Dia menjawab b dan salah.
Saya melihat pertanyaan dan berpendapat bahwa itu main
adalah pengidentifikasi yang valid dan itu seharusnya benar.
Kami melihat pada spec Java untuk pengidentifikasi dan memperkuat titik itu. Kami juga menulis contoh program yang memiliki variabel yang dipanggil main
, serta metode. Dia membuat bantahan tertulis yang menyertakan referensi dokumentasi Java, program tes dan guru mengabaikannya dan mengatakan jawabannya masih salah.
Apakah main
pengidentifikasi yang valid?
java
language-lawyer
main
identifier
Gary Bak
sumber
sumber
Jawaban:
Ini mengkompilasi, dan ketika dieksekusi, memancarkan output ini:
Urutan karakter
main
adalah pengidentifikasi, bukan kata kunci atau kata yang dipesan.Bagian yang relevan dari JLS adalah 3.8 :
Urutan karakter
main
sesuai dengan deskripsi di atas dan tidak ada dalam daftar kata kunci di Bagian 3.9 .(Urutan karakter
java1234
juga merupakan pengidentifikasi, untuk alasan yang sama.)sumber
main
juga;)main
adalah pengidentifikasi java yang valid, dan guru salah.Dokumentasi yang relevan ada di Spesifikasi Bahasa Jawa, di sini:
Bab 3. "Struktur Leksikal", bagian 3.8. "Pengidentifikasi":
https://docs.oracle.com/javase/specs/jls/se10/html/jls-3.html#jls-3.8
Ia mengatakan:
Yang berarti Anda dapat membuktikan bahwa itu adalah pengidentifikasi yang valid baik dengan:
sumber
Seperti yang dinyatakan jawaban lainnya
main
adalah pengidentifikasi Java yang valid , jugajava1234
.Saya kira yang membingungkan berasal dari fakta bahwa
main(String[])
metode ini sering digunakan sebagai titik masuk oleh JVM 1 . Namun, itu tidak berarti bahwa tokenmain
itu sendiri tidak dapat digunakan sebagai pengidentifikasi 2 .Spesifikasi mengatakan demikian, dan deklarasi berikut ini juga valid:
Bidang:
Variabel lokal:
Sebuah metode:
Kelas (meskipun nama kelas yang dimulai dengan huruf kecil tidak disarankan):
Sebuah paket:
1: Seperti disebutkan dalam komentar, spesifikasi JVM itu sendiri tidak mengamanatkan metode tertentu sebagai titik masuk, tetapi alat yang banyak digunakan
java
sering menggunakan metode seperti itu sebagai titik masuk.2: Saya biasanya menghindari membuat metode utama selain
main(String[])
.sumber
main
bukan titik masuk untuk JVM. Ini adalah titik masuk yangjava
digunakan alat untuk menjalankan aplikasi. Alat lain (wadah servlet, misalnya) menggunakan titik masuk lainnya.java
alat tidak memerlukanmain(String[])
metode jika kelas utama meluas javafx.application.Application .Ini mengkompilasi dengan baik pada Java 1.8 ...
... dan ketika dieksekusi menghasilkan output:
sumber
static main
metode lain dengan parameter yang berbeda?package main;
!Saya melemparkan semua yang saya bisa ke sana, dan tampaknya berhasil. Saya akan mengatakan utama adalah pengidentifikasi yang valid.
sumber
public static void main(main...Main)
( kehilangan ruang ) tidak bisa bekerja, bukan?Bagaimana
main
tidak bisa digunakan sebagai pengidentifikasi sementara itu digunakan sebagai pengidentifikasi untuk mendeklarasikan metode "utama"?Untuk ungkapan klasik seperti itu:
main
bukan kata kunci dan mungkin tidak akan pernah menjadi kata kunci di Jawa karena alasan kompatibilitas retro yang jelas.Tentang pertanyaan, apakah
main
pengidentifikasi yang baik?Pertama: valid untuk kompiler tidak berarti selalu baik.
Misalnya
java1234
opsi yang diusulkan juga merupakan pengidentifikasi yang valid tetapi itu harus benar-benar dihindari.main
memiliki arti yang sangat khusus dan penting: digunakan sebagai metode titik masuk kelas dan guci yang dieksekusi olehjava
baris perintah.Menggunakan
main
untuk nama metode yang tidak memenuhi kriteria yang akan digunakan olehjava
baris perintah akan hanya menyesatkan saat menggunakannya sebagai nama variabel atau nama kelas bisa masuk akal.Misalnya mendefinisikan kelas yang mewakili titik masuk aplikasi sebagai
Main
kelas aplikasi dapat diterima dan menggunakannya sebagai nama variabel juga seperti:Secara umum, di Jawa, banyak karakter atau "kata" dianggap sebagai pengidentifikasi yang valid untuk kompiler tetapi sangat tidak disarankan untuk digunakan dalam kode klien (tetapi kode yang dihasilkan dapat melakukan hal itu: kelas bersarang misalnya) tidak dapat dibaca dan / atau benar-benar menyesatkan.
Misalnya ini bisa valid untuk kompiler:
Tapi kami tidak mau:
Object
kelas kami karena ini didefinisikan dalamjava.lang
(1).main()
jika tidak memenuhi kriteria yang akan digunakan olehjava
baris perintah (2).Object.toString()
metode (3)._
,$
atau karakter mengejutkan / tidak berarti yang bertentangan dengan konvensi penamaan bersama (4).sumber
main
bisa berupa kata kunci yang hanya dapat digunakan sebagai nama untuk metode statis dengan tanda tangan yang sesuai (atau apa pun). Perhatikan bahwa panggilan kelas super digunakansuper
dengan cara yang membuatnya terlihat seperti pengidentifikasi:super(foo);
dansuper.foo
, tetapisuper
ADALAH kata kunci (dan sebelum obat generik ditambahkan, ini adalah satu-satunya cara untuk menggunakannya (yang dapat saya ingat)).main
sebagai kata kunci dalam versi baru java, itu berarti bahwa setiap kode yang menggunakan utama sebagai nama metode (atau nama anggota apa pun) tidak akan dikompilasi lagi. Penggunaansuper
dalam generik tidak memiliki efek samping dalam kode yang ada karena generik tidak ada saat ini.main
ini masih merupakan pengidentifikasi yang lebih baik daripadajava1234
. Menggunakannya untuk metode "biasa" akan menyesatkan, tetapi saya tidak akan memiliki masalah dalam penamaan variabelmain
, jika itu sebenarnya sesuatu yang utama dalam metode saya.java1234
hanya mengerikan, nama harus deskriptif ...main
jika fungsi yang saya lihat melakukan sesuatu dengan data utama air. Aku akan muntah jika saya pernah melihatjava1234
dalam kode produksi (dan berdoa tidak ada 1233 variabel lain dengan awalanjava
).Apakah itu pengidentifikasi yang valid? Iya.
Apakah ini pengenal yang baik? Tidak jika Anda menggunakannya untuk apa pun selain metode yang dimulai pada peluncuran JVM.
Apakah pengidentifikasi lain yang valid terdaftar? Iya.
Apakah instruksi tes mengatakan untuk memilih jawaban terbaik?
sumber
main
pengidentifikasi dapat ditoleransi daripada yang bisa sayajava1234
lakukan. Pertimbangkan, misalnya, basis kode yang bekerja dengan data pasokan air (saluran air).main
adalah pengidentifikasi sempurna di mana saja di luar domain sempit aplikasi Java biasa. Itu bisa berupa nama bidang dalam kelas yang mewakili set menu. Atau<main>
bagian dari dokumen dalam pembuat HTML.java1234
, di sisi lain, hampir sama mengerikannya dengan pengidentifikasi.main
sangat valid karena, dari dokumen :sumber
sumber
Guru itu membuat kesalahan kecil dalam mengasumsikan utama bukan pengidentifikasi yang valid atau hanya mengutarakan pertanyaan yang salah. Dia mungkin bermaksud mengatakan "pengidentifikasi yang baik".
Tetapi mengabaikan argumen putra Anda dan dengan demikian menghambat pendekatan ilmiahnya memeriksa literatur yang relevan (spesifikasi Java) dan melakukan percobaan (menulis program sampel) adalah kebalikan dari apa yang seharusnya dilakukan oleh seorang guru.
sumber
main
jauh lebih sering pengidentifikasi "baik" daripada sebelumnyajava1234
. Bahkan di sana, gurunya salah. ;)Keduanya
main
danjava123
merupakan pengidentifikasi yang valid , utama bukan kata kunci yang dilindungi undang-undang sehingga sangat dapat diterima untuk digunakan, sejauh pengujian berlangsung, Anda setidaknya harus mendapatkan poin atau setengah poin.sumber
Harus satu kata. Itu spasi tidak diizinkan.
Contoh: mangoprice valid tetapi harga mangga tidak valid.
Harus dimulai dengan huruf (alfabet) atau garis bawah atau simbol $.
Contoh: harga, _ harga dan $ harga adalah pengidentifikasi yang valid.
Seharusnya bukan kata kunci Java karena kata kunci membawa arti khusus ke kompiler.
Contoh: kelas atau batal dll.
Seharusnya tidak dimulai dengan angka tetapi digit bisa di tengah atau di akhir.
Contoh: 5mangoescost tidak valid dan mango5cost dan mangocost5 valid.
Panjang pengidentifikasi di Jawa bisa 65.535 karakter dan semuanya signifikan. Pengidentifikasi peka terhadap huruf besar-kecil. Baik itu mangga maupun mangga diperlakukan berbeda. Dapat berisi semua huruf besar atau huruf kecil atau campuran.
IDENTIFIER : mereka adalah nama kelas, nama metode, nama variabel ...
Sebagai kata kunci bukan kata yang dilindungi undang-undang dan menurut penjelasan di atas untuk mendefinisikan kata pengenal, kata kunci adalah pengidentifikasi yang valid dan java1234 juga. Opsi penahanan tidak valid karena penjelasan di atas.
sumber