JShell adalah fitur baru di Java 9 untuk memfasilitasi menjalankan cuplikan kode. Cuplikan kode JShell persis sama dengan kode sumber Java dalam file untuk aplikasi. Seperti yang dibahas dalam artikel sebelumnya, “Menggunakan JShell di Java 9 di NetBeans 9.0, Bagian 3,” JShell tidak mengizinkan beberapa pengubah—termasuk default, akses, sinkronisasi, publik, pribadi, dan dilindungi—yang didukung dalam file kode sumber . JShell dirancang terutama untuk menguji dan men-debug kode Java dan bukan untuk menjalankan aplikasi yang lengkap. Dalam artikel lanjutan ini, kita akan menjalankan snippet untuk class, interface, dan array. Kami telah menggunakan NetBeans 9 seperti pada artikel sebelumnya. Kami juga akan membahas pengecualian yang tidak dicentang. Artikel ini memiliki bagian berikut:
- Menggunakan Kelas
- Memodifikasi Kelas
- Mencantumkan Kelas
- Menggunakan Konstruktor Kelas
- Memperluas Kelas
- Mengganti Metode
- Menggunakan Antarmuka
- Menggunakan Implementasi Default untuk Metode
- Mendeklarasikan Metode Antarmuka menjadi Statis
- Menggunakan Array
- Menggunakan Pengecualian yang Tidak Dicentang
- Kesimpulan
Menggunakan Kelas
Di bagian ini, kita akan membahas menjalankan cuplikan kode untuk kelas. Mendeklarasikan kelas sederhana C sebagai berikut.
[1]-> class C { } | created class C
Kelas C akan dibuat. Tidak seperti metode yang dapat dipanggil secara langsung, kelas harus diinstansiasi terlebih dahulu sebagai berikut.
[3]-> new C() | $1 ==> [email protected]
Sebuah instance baru dari kelas C, $1 akan dibuat. Seperti halnya deklarasi metode, deklarasi kelas dapat dimodifikasi dengan mendeklarasikan ulang kelas. Kelas dapat mengimplementasikan antarmuka menggunakan implement . Sebagai contoh, deklarasikan sebuah antarmuka I .
[1]-> interface I{} | created interface I
Buat kelas C untuk mengimplementasikan antarmuka I .
[3]-> class C implements I{} | replaced class C [4]->
Kelas C , dibuat sebelumnya, akan diganti.
Deklarasi kelas di JShell tidak memiliki konsep aplikasi seperti yang dimiliki oleh kelas Java yang dideklarasikan dalam file. Kelas Java dalam file dengan public static void main(String[] argv) metode adalah aplikasi Java. public static void main(String[] argv) metode dapat ditambahkan di JShell tetapi hanyalah cuplikan kode lain. Buat kelas Halo yang menyertakan metode public static void main(String[] argv) .
[1]-> class Hello{ public static void main(String[] argv){System.out.println (argv[0]+argv[1]);} } | created class Hello [2]->
utama(String[]) metodenya adalah statis metode dan didefinisikan untuk kelas daripada turunan dari kelas. Buat String[] array untuk dipasok ke main(String[]) metode.
String[] strArray={"Hello"," JShell"};
Panggil main(String[]) metode dengan String[] sebagai argumen.
Hello.main(strArray)
Pesan Hello JShell mendapatkan output, seperti yang ditunjukkan pada Gambar 1.
Gambar 1: Memanggil metode statis di kelas
Memodifikasi Kelas
Kelas dapat dimodifikasi sesuai kebutuhan dengan memodifikasi atau menghapus salah satu deklarasi metodenya atau menambahkan metode baru. Deklarasikan ulang kelas Halo tanpa main(String[]) metode dan kelas akan diganti.
[4]-> class Hello{ } | replaced class Hello [5]->
Tambahkan kembali main(String[]) metode tetapi dengan System.out.println yang sedikit berbeda penyataan. Kelas Halo lagi akan diganti.
[5]-> class Hello{ public static void main(String[] argv) {System.out.println(argv[0]);} } | replaced class Hello [5]->
Panggil statis metode main(String[]) dengan Halo.main(strArray) untuk output yang berbeda, seperti yang ditunjukkan pada Gambar 2.
Gambar 2: Memanggil Variasi metode utama
Ketentuan untuk mengganti kelas berguna saat mengembangkan kelas. Satu metode dapat ditambahkan pada satu waktu dan kelas diuji. Sebagai contoh, tambahkan metode kedua hello(String) . Sekali lagi, kelas Halo akan diganti.
[9]-> class Hello{ void main(String[] argv){System.out.println(argv[0]);} String hello(String name){return name;} } | replaced class Hello
Metode halo(String) ditambahkan, sebagai metode instance, akan membutuhkan instance kelas untuk dipanggil. Buat instance kelas.
[10]-> new Hello() | $2 ==> [email protected]
Panggil metode halo(String) menggunakan instance kelas $2 .
[11]-> $2.hello("John") | $6 ==> "John"
Mencantumkan Kelas
Kelas Java adalah tipe. Antarmuka juga merupakan tipe. Semua tipe yang didefinisikan dalam sesi JShell terdaftar dengan /types memerintah. Tentukan beberapa kelas dan antarmuka.
[4]-> [1]-> class C{} | created class C [2]-> class D{} | created class D [3]-> class B{} | created class B [4]-> interface I{} | created interface I [5]-> interface J{} | created interface J
Jalankan /types perintah dan semua kelas dan antarmuka terdaftar.
[6]-> /types | class C | class D | class B | interface I | interface J
Menggunakan Konstruktor Kelas
Kelas no-arg secara implisit didefinisikan dalam kelas jika tidak mendefinisikan konstruktor dengan args. Kami sebelumnya telah membuat instance kelas C yang tidak mendeklarasikan konstruktor secara eksplisit dengan new C() . Konstruktor no-arg dapat didefinisikan secara eksplisit.
Selanjutnya, buat kelas Halo yang mendeklarasikan konstruktor kelas. Konstruktor memiliki satu parameter tipe String . Konstruktor dapat dideklarasikan dengan public pengubah dan secara implisit publik jika tidak disetel ke publik .
[6]-> class Hello{ String name; public Hello(String name){this.name=name;} void hello(){System.out.println("Hello "+name);} }
Buat instance kelas Halo .
Hello hello=new Hello("John")
Panggil metode instance hello() untuk menampilkan pesan, seperti yang ditunjukkan pada Gambar 3.
Gambar 3: Menggunakan Kelas dengan Konstruktor
Memperluas Kelas
Kelas dapat diperpanjang dengan ekstensi seperti pada file kode sumber Java. Sebagai contoh, buat kelas D yang mendeklarasikan nama variabel bertipe tt>String, konstruktor tanpa argumen dan metode hello(String) . halo(String) metode menghasilkan "Halo" pesan menggunakan nama arg disediakan.
class D{ String name="Michael"; public D(){} void hello(String name){System.out.println("Hello "+name);} }
Buat kelas C yang memperluas kelas C dan mendeklarasikan hello() metode, yang tidak menimpa kelas D 's halo(String) metode dan parameternya berbeda. halo() metode memanggil nama bidang, yang diwarisi dari kelas D .
class C extends D{ void hello(){System.out.println("Hello "+name);} }
Buat instance kelas C dan panggil hello() metode.
new C().hello()
Pesan “Halo” mendapatkan output, seperti yang ditunjukkan pada Gambar 4. nama nilai bidang ditetapkan di kelas D digunakan.
Gambar 4: Memperluas Kelas
Jika kita memanggil hello(String) metode kelas itu C mewarisi dari kelas D , kita akan mendapatkan output yang berbeda, seperti yang ditunjukkan pada Gambar 5.
Gambar 5: Memanggil Metode yang Diwarisi dari Kelas yang Diperluas
Mengganti Metode
Kelas dapat menimpa metode yang diwarisi dari kelas yang diperluas dengan memberikan definisi metodenya sendiri. Buat kelas D yang mendeklarasikan bidang nama dan metode halo() .
class D{ String name="Michael"; void hello(){System.out.println("Hello "+name);} }
Mendeklarasikan kelas C yang memperluas kelas D dan menimpa hello() metode. Kelas C juga menyembunyikan bidang nama .
class C extends D{ String name="John"; void hello(){System.out.println("Hello "+name); }
Buat instance kelas C dan panggil metode hello() .
new C().hello()
halo() metode dari kelas C dipanggil karena menimpa metode dari kelas D . Bidang nama di kelas C menyembunyikan bidang nama di kelas D . Keluaran pesan ditunjukkan pada Gambar 6.
Gambar 6: Mengganti Metode
Jika kelas C tidak menyembunyikan bidang nama dari kelas D , nama bidang di kelas D digunakan, seperti yang ditunjukkan pada Gambar 7.
Gambar 7: Mengakses Field dari Extended Class
Sebuah kelas C objek adalah turunan dari kelas D karena itu memperluas kelas D . Jalankan pernyataan berikut untuk menemukan apakah sebuah instance dari kelas C juga merupakan turunan dari kelas D .
new C() instanceof D
Nilai benar memverifikasi turunan dari kelas C juga merupakan turunan dari kelas D , seperti yang ditunjukkan pada Gambar 8.
Gambar 8: Memverifikasi apakah Instance Kelas C juga merupakan turunan dari kelas D
Karena turunan dari kelas C juga merupakan turunan dari kelas D , mungkin dilemparkan ke D sebagai berikut:
D d=(D)(new C());
Selanjutnya, akses bidang nama untuk objek d bertipe D .
d.name;
Dan, panggil metode hello() untuk objek d bertipe D .
d.hello();
Output nilai bidang berasal dari kelas D karena d adalah objek bertipe D , seperti yang ditunjukkan pada Gambar 9. Metode hello() dipanggil berasal dari kelas C .
Gambar 9: Casting Object tipe C ke D
Menggunakan Antarmuka
Di bagian ini, kita akan menjalankan beberapa cuplikan untuk antarmuka di JShell. Kelas yang ada dapat dimodifikasi untuk mengimplementasikan antarmuka. Buat kelas C .
[1]-> class C{} | created class C
Buat antarmuka I yang mendefinisikan metode halo() .
[2]-> interface I { String hello(); } | created interface I
Deklarasikan ulang kelas C untuk mengimplementasikan antarmuka I . Kelas C menyediakan implementasi untuk metode hello() .
[3]-> class C implements I{ public String hello(){ return "Hello JShell"; } } | replaced class C
Buat instance kelas C .
[4]-> new C() | $1 ==> [email protected]
Menggunakan variabel instance kelas, panggil metode hello() dan keluaran metode akan ditampilkan.
[5]-> $1.hello() | $2 ==> "Hello JShell" [6]->
Karena metode dalam antarmuka secara implisit publik sementara metode di kelas bukan metode, implementasi di kelas C harus dideklarasikan dengan publik pengubah akses. Jika tidak dinyatakan publik , pesan kesalahan dikeluarkan karena tidak menentukan publik pengubah akses default ke pengubah akses yang lebih lemah, yang tidak diizinkan saat mengimplementasikan antarmuka.
[3]-> class C implements I{ String hello(){ return "Hello JShell"; } } | Error: | hello() in C cannot implement hello() in I | attempting to assign weaker access privileges; was public | String hello(){ | ^--------------...
Menggunakan Implementasi Default untuk Metode
Pada Java 8, metode antarmuka dapat menyediakan implementasi default untuk metode dengan menggunakan kata kunci default . Deklarasikan antarmuka yang menyediakan implementasi default untuk metode hello() menggunakan default kata kunci.
[1]-> interface I { default String hello(){ return "Hello JShell"; } } | created interface I
Mendeklarasikan kelas C yang mengimplementasikan antarmuka I .
[2]-> class C implements I{ } | created class C
Buat instance kelas C dan panggil metode hello() . Metode dari implementasi default di antarmuka I mendapat keluaran.
[3]-> new C().hello(); | $1 ==> "Hello JShell"
Mendeklarasikan Metode Antarmuka menjadi Statis
Sejak Java 8, metode Antarmuka dapat dideklarasikan statis . Buat antarmuka I yang mendeklarasikan statis metode.
[1]-> interface I { static String hello(){ return "Hello JShell"; } } | created interface I
Panggil metode statis dengan menggunakan antarmuka I .
[2]-> I.hello() | $1 ==> "Hello JShell"
Sebuah kelas tidak dapat dinyatakan final dan, jika final pengubah digunakan, diabaikan.
[5]-> [1]-> final class C{} | Warning: | Modifier 'final' not permitted in top-level declarations, | ignored | final class C{} | ^---^ | created class C
Menggunakan Array
Di bagian ini, kita akan menjalankan beberapa cuplikan kode untuk array. Mendeklarasikan, membuat instance, dan mengakses array tidak berbeda dengan aplikasi berbasis file kode sumber Java. Sebagai contoh, deklarasikan sebuah array dengan tipe String[] . Array diinisialisasi ke null .
[1]-> String[] strArray; | strArray ==> null
Alokasikan memori ke array. Ukuran larik, setelah disetel, tidak dapat diubah. Elemen array diinisialisasi ke null .
[2]-> strArray =new String[3]; | strArray ==> String[3] { null, null, null }
Inisialisasi elemen array menggunakan indeks array.
[3]-> strArray[0]="A"; strArray[1]="B"; strArray[2]="C"; | $4 ==> "A" | $5 ==> "B" | $6 ==> "C"
Keluarkan panjang array dan elemen pada indeks 1.
[6]-> strArray.length; strArray[1]; | $9 ==> 3 | $10 ==> "B"
Panjang array adalah output sebagai 3. Elemen pada indeks 1 adalah "B". Sebuah array dapat diinisialisasi ketika dideklarasikan sebagai berikut.
[1]-> String[] strArray={"A","B","C"}; | strArray ==> String[3] { "A", "B", "C" }
Keluarkan panjang larik.
[2]-> strArray.length; | $1 ==> 3
Keluarkan elemen pada indeks 0.
[3]-> strArray[0]; | $4 ==> "A" [4]->
Array multi-dimensi dapat dideklarasikan seperti dalam aplikasi Java. Buat array tiga dimensi dengan tipe String[][][] dan inisialisasi array.
[1]-> String[][][] strArray={{{"A","B","C"},{"AA","AB","AC"}}, {{"B","C","A"},{"BB","BC","BA"}},{{"C","A","B"}, {"CC","CA","CB"}}}; | strArray ==> String[3][][] { String[2][] { String[3] | { "A", "B", "C" }, String[3] { "AA", ...
Keluarkan panjang larik.
[2]-> strArray.length; | $1 ==> 3
Keluarkan panjang larik pada indeks 0.
[3]-> strArray[0].length; | $4 ==> 2
Keluarkan panjang larik pada indeks 1 dalam larik pada indeks 0.
[4]-> strArray[0][1].length; | $6 ==> 3
Keluarkan array pada indeks 0.
[5]-> strArray[0] | $10 ==> String[2][] { String[3] { "A", "B", "C" }, | String[3] { "AA", "AB", "AC" } }
Keluarkan array pada indeks 1 dalam array pada indeks 0.
strArray[0][1] | $11 ==> String[3] { "AA", "AB", "AC" }
Keluarkan elemen pada indeks 0 dalam larik pada indeks 1 dalam larik pada indeks 0.
strArray[0][1][0] | $12 ==> "AA" [8]->
Menggunakan Pengecualian yang Tidak Dicentang
JShell melempar pengecualian yang tidak dicentang saat runtime. Sebagai contoh, jika variabel bertipe String yang telah diinisialisasi ke nilai default null diakses. java.lang.NullPointerException dilempar.
[1]-> String str; | str ==> null [2]-> str.length(); | java.lang.NullPointerException thrown: | at (#2:1) [3]->
Sebagai contoh lain, jika indeks array di luar ukuran array diakses, java.lang.ArrayIndexOutOfBoundsException dilempar.
[4]-> String[] str={"A","B","C"}; | str ==> String[3] { "A", "B", "C" } [5]-> str[3]; | java.lang.ArrayIndexOutOfBoundsException thrown: 3 | at (
Jika metode yang mendefinisikan pembagian dengan nol dipanggil, java.lang.ArithmeticException dilempar.
[1]-> int average(int i,int j){ return (i+j)/0; } | created method average(int,int) [2]-> average(2,4) | java.lang.ArithmeticException thrown: / by zero | at average (#1:2) | at (#2:1) [3]->
Kesimpulan
Dalam empat artikel pertama ini, kami membahas menjalankan cuplikan kode untuk variabel, pernyataan, metode, kelas, antarmuka, dan array. JShell dirancang untuk menjalankan hanya potongan kode dan karena itu beberapa fiturnya berbeda dari saat menjalankan aplikasi Java lengkap dari file kode sumber. Dalam dua artikel lagi, kita akan menjelajahi beberapa fitur lain dari JShell.