Pelajari Java dari awal

Jadi, Anda ingin membuat program di Java? Itu bagus, dan Anda telah datang ke tempat yang tepat. Seri Java 101 menyediakan pengenalan mandiri untuk pemrograman Java, dimulai dengan dasar-dasar dan mencakup semua konsep inti yang perlu Anda ketahui untuk menjadi pengembang Java yang produktif. Seri ini bersifat teknis, dengan banyak contoh kode untuk membantu Anda memahami konsep saat kita melanjutkan. Saya akan berasumsi bahwa Anda sudah memiliki pengalaman pemrograman, hanya saja tidak di Java.

Artikel pertama ini memperkenalkan platform Java dan menjelaskan perbedaan antara tiga edisinya: Java SE, Java EE, dan Java ME. Anda juga akan belajar tentang peran mesin virtual Java (JVM) dalam menerapkan aplikasi Java. Saya akan membantu Anda menyiapkan Java Development Kit (JDK) di sistem Anda sehingga Anda dapat mengembangkan dan menjalankan program Java, dan saya akan membantu Anda memulai dengan arsitektur aplikasi Java yang khas. Terakhir, Anda akan belajar cara mengompilasi dan menjalankan aplikasi Java sederhana.

Diperbarui untuk Java 12 dan JShell baru

Seri ini telah diperbarui untuk Java 12 dan menyertakan pengantar singkat ke yang baru jshell: alat interaktif untuk mempelajari Java dan membuat prototipe kode Java.

unduh Dapatkan kodenya Unduh kode sumber untuk aplikasi contoh dalam tutorial ini. Dibuat oleh Jeff Friesen untuk JavaWorld.

Apa itu Jawa?

Anda dapat menganggap Java sebagai bahasa tujuan umum dan berorientasi objek yang sangat mirip dengan C dan C ++, tetapi lebih mudah digunakan dan memungkinkan Anda membuat program yang lebih kuat. Sayangnya, definisi ini tidak memberi Anda banyak wawasan tentang Java. Pada tahun 2000, Sun Microsystems (pencetus platform Java) mendeskripsikan Java seperti ini: 

Java adalah bahasa komputer yang sederhana, berorientasi objek, paham jaringan, ditafsirkan, kuat, aman, netral arsitektur, portabel, berkinerja tinggi, multithread, dan dinamis.

Mari pertimbangkan masing-masing definisi ini secara terpisah.

Java adalah bahasa yang sederhana . Java awalnya dimodelkan setelah C dan C ++, tanpa beberapa fitur yang berpotensi membingungkan. Pointer, beberapa pewarisan implementasi, dan kelebihan beban operator adalah beberapa fitur C / C ++ yang bukan bagian dari Java. Fitur yang tidak diamanatkan dalam C / C ++, tetapi penting untuk Java, adalah fasilitas pengumpulan sampah yang secara otomatis mengambil kembali objek dan larik.

Java adalah bahasa berorientasi objek . Fokus berorientasi objek Java memungkinkan pengembang bekerja mengadaptasi Java untuk memecahkan masalah, daripada memaksa kita memanipulasi masalah untuk memenuhi batasan bahasa. Ini berbeda dari bahasa terstruktur seperti C. Sebagai contoh, sedangkan Java memungkinkan Anda fokus pada objek rekening tabungan, C mengharuskan Anda untuk berpikir secara terpisah tentang status rekening tabungan (seperti saldo) dan perilaku (seperti setoran dan penarikan).

Java adalah bahasa yang paham jaringan . Pustaka jaringan Java yang luas memudahkan untuk mengatasi protokol jaringan Transmission Control Protocol / Internet Protocol (TCP / IP) seperti HTTP (HyperText Transfer Protocol) dan FTP (File Transfer Protocol), dan menyederhanakan tugas membuat koneksi jaringan. Lebih lanjut, program Java dapat mengakses objek melalui jaringan TCP / IP, melalui Uniform Resource Locators (URL), dengan kemudahan yang sama seperti Anda mengaksesnya dari sistem file lokal.

Java adalah bahasa yang ditafsirkan . Saat runtime, program Java secara tidak langsung dijalankan pada platform yang mendasarinya (seperti Windows atau Linux) melalui mesin virtual (yang merupakan representasi perangkat lunak dari platform hipotetis) dan lingkungan eksekusi terkait. Mesin virtual menerjemahkan bytecode program Java (instruksi dan data terkait) ke instruksi khusus platform melalui interpretasi. Interpretasi adalah tindakan mencari tahu apa arti instruksi bytecode dan kemudian memilih instruksi khusus platform yang setara "kaleng" untuk dieksekusi. Mesin virtual kemudian menjalankan instruksi khusus platform tersebut.

Interpretasi memudahkan untuk men-debug program Java yang salah karena lebih banyak informasi waktu kompilasi tersedia saat runtime. Interpretasi juga memungkinkan untuk menunda langkah penghubung antara bagian-bagian dari program Java hingga runtime, yang mempercepat pengembangan.

Java adalah bahasa yang kuat . Program Java harus dapat diandalkan karena digunakan dalam aplikasi konsumen dan misi penting, mulai dari pemutar Blu-ray hingga sistem navigasi kendaraan atau kontrol udara. Fitur bahasa yang membantu membuat Java kuat termasuk deklarasi, pemeriksaan tipe duplikat pada waktu kompilasi dan waktu proses (untuk mencegah masalah ketidakcocokan versi), array sebenarnya dengan pemeriksaan batas otomatis, dan penghilangan pointer. (Lihat "Fitur bahasa Java Dasar" untuk memulai dengan jenis bahasa Java, literal, variabel, dan lainnya.)

Aspek lain dari ketangguhan Java adalah bahwa loop harus dikontrol oleh ekspresi Boolean, bukan ekspresi integer di mana 0 salah dan nilai bukan nol adalah true. Misalnya, Java tidak mengizinkan loop gaya-C seperti while (x) x++;karena loop mungkin tidak berakhir di tempat yang diharapkan. Sebagai gantinya, Anda harus secara eksplisit memberikan ekspresi Boolean, seperti while (x != 10) x++;(yang berarti pengulangan akan berjalan hingga xsama dengan 10).

Java adalah bahasa yang aman . Program Java digunakan dalam lingkungan jaringan / terdistribusi. Karena program Java dapat bermigrasi ke dan mengeksekusi di berbagai platform jaringan, penting untuk melindungi platform ini dari kode berbahaya yang mungkin menyebarkan virus, mencuri informasi kartu kredit, atau melakukan tindakan jahat lainnya. Fitur bahasa Java yang mendukung ketahanan (seperti penghilangan pointer) berfungsi dengan fitur keamanan seperti model keamanan kotak pasir Java dan enkripsi kunci publik. Bersama-sama, fitur-fitur ini mencegah virus dan kode berbahaya lainnya mendatangkan malapetaka pada platform yang tidak mencurigakan.

Secara teori, Java aman. Dalam praktiknya, berbagai kerentanan keamanan telah terdeteksi dan dieksploitasi. Hasilnya, Sun Microsystems dan Oracle sekarang terus merilis pembaruan keamanan.

Java adalah bahasa arsitektur netral . Jaringan menghubungkan platform dengan arsitektur berbeda berdasarkan berbagai mikroprosesor dan sistem operasi. Anda tidak dapat mengharapkan Java untuk menghasilkan instruksi khusus platform dan membuat instruksi ini "dipahami" oleh semua jenis platform yang merupakan bagian dari jaringan. Sebaliknya, Java menghasilkan instruksi bytecode yang tidak bergantung platform yang mudah ditafsirkan oleh setiap platform (melalui implementasi JVM-nya).

Java adalah bahasa portabel . Netralitas arsitektur berkontribusi pada portabilitas. Namun, ada lebih banyak portabilitas Java daripada instruksi bytecode yang tidak bergantung platform. Pertimbangkan bahwa ukuran jenis integer tidak boleh bervariasi. Misalnya, tipe integer 32-bit harus selalu ditandatangani dan menempati 32 bit, di mana pun integer 32-bit diproses (misalnya, platform dengan register 16-bit, platform dengan register 32-bit, atau platform dengan register 64-bit). Perpustakaan Java juga berkontribusi pada portabilitas. Jika perlu, mereka menyediakan tipe yang menghubungkan kode Java dengan kapabilitas khusus platform dengan cara yang paling portabel.

Java adalah bahasa berkinerja tinggi . Interpretasi menghasilkan tingkat kinerja yang biasanya lebih dari cukup. Untuk skenario aplikasi berkinerja sangat tinggi, Java menggunakan kompilasi just-in-time, yang menganalisis urutan instruksi bytecode yang ditafsirkan dan mengompilasi urutan instruksi yang sering ditafsirkan ke instruksi khusus platform. Upaya selanjutnya untuk menafsirkan urutan instruksi bytecode ini menghasilkan eksekusi instruksi khusus platform yang setara, menghasilkan peningkatan kinerja.

Java adalah bahasa multithread . Untuk meningkatkan kinerja program yang harus menyelesaikan beberapa tugas sekaligus, Java mendukung konsep eksekusi berulir . Misalnya, program yang mengelola Graphical User Interface (GUI) sambil menunggu input dari koneksi jaringan menggunakan utas lain untuk melakukan menunggu alih-alih menggunakan utas GUI default untuk kedua tugas. Ini membuat GUI tetap responsif. Primitif sinkronisasi Java memungkinkan utas mengkomunikasikan data dengan aman di antara mereka sendiri tanpa merusak data. (Lihat pemrograman berulir di Java yang dibahas di tempat lain dalam seri Java 101.)

Java adalah bahasa dinamis . Karena interkoneksi antara kode program dan pustaka terjadi secara dinamis pada waktu proses, tidak perlu untuk menautkannya secara eksplisit. Akibatnya, ketika program atau salah satu perpustakaannya berkembang (misalnya, untuk perbaikan bug atau peningkatan kinerja), pengembang hanya perlu mendistribusikan program atau pustaka yang diperbarui. Meskipun perilaku dinamis menghasilkan lebih sedikit kode untuk didistribusikan saat terjadi perubahan versi, kebijakan distribusi ini juga dapat menyebabkan konflik versi. Misalnya, pengembang menghapus tipe kelas dari pustaka, atau mengganti namanya. Ketika perusahaan mendistribusikan pustaka yang diperbarui, program yang ada yang bergantung pada tipe kelas akan gagal. Untuk mengurangi masalah ini secara signifikan, Java mendukung tipe antarmuka, yang seperti kontrak antara dua pihak. (Lihat antarmuka, tipe, dan fitur bahasa berorientasi objek lainnya yang dibahas di tempat lain dalam seri Java 101.)

Membongkar definisi ini mengajarkan kita banyak hal tentang Java. Yang terpenting, ini mengungkapkan bahwa Java adalah bahasa dan platform. Anda akan mempelajari lebih lanjut tentang komponen platform Java - yaitu mesin virtual Java dan lingkungan eksekusi Java - nanti dalam tutorial ini.

Tiga edisi Java: Java SE, Java EE, dan Java ME

Sun Microsystems merilis perangkat pengembangan perangkat lunak Java 1.0 (JDK) pada Mei 1995. JDK pertama digunakan untuk mengembangkan aplikasi desktop dan applet, dan Java kemudian berkembang untuk mencakup pemrograman server perusahaan dan perangkat seluler. Menyimpan semua pustaka yang diperlukan dalam satu JDK akan membuat JDK terlalu besar untuk didistribusikan, terutama karena distribusi pada tahun 1990-an dibatasi oleh CD berukuran kecil dan kecepatan jaringan yang lambat. Karena sebagian besar pengembang tidak membutuhkan semua API terakhir (pengembang aplikasi desktop hampir tidak perlu mengakses API Java perusahaan), Sun memfaktorkan Java ke dalam tiga edisi utama. Ini akhirnya dikenal sebagai Java SE, Java EE, dan Java ME:

  • Platform Java, Edisi Standar (Java SE) adalah platform Java untuk mengembangkan aplikasi sisi klien (yang berjalan di desktop) dan applet (yang berjalan di browser web). Perhatikan bahwa untuk alasan keamanan, applet tidak lagi didukung secara resmi.
  • Platform Java, Edisi Perusahaan (Java EE ) adalah platform Java yang dibangun di atas Java SE, yang digunakan secara eksklusif untuk mengembangkan aplikasi server berorientasi perusahaan. Aplikasi sisi server termasuk servlet Java , yang merupakan program Java yang mirip dengan applet tetapi berjalan di server, bukan di klien. Servlet sesuai dengan Java Servlet API.
  • Platform Java, Edisi Mikro (Java ME) juga dibangun di atas Java SE. Ini adalah platform Java untuk mengembangkan MIDlets , yaitu program Java yang berjalan pada perangkat informasi seluler, dan Xlets , yang merupakan program Java yang berjalan pada perangkat tertanam.

Java SE adalah platform dasar untuk Java dan merupakan fokus dari seri Java 101. Contoh kode akan didasarkan pada versi Java terbaru pada saat penulisan, Java 12.

Platform Java dan JVM

Java adalah bahasa pemrograman dan platform untuk menjalankan kode Java yang dikompilasi. Platform ini sebagian besar terdiri dari JVM, tetapi juga mencakup lingkungan eksekusi yang mendukung eksekusi JVM pada platform (asli) yang mendasarinya. JVM mencakup beberapa komponen untuk memuat, memverifikasi, dan menjalankan kode Java. Gambar 1 menunjukkan bagaimana program Java dijalankan pada platform ini. 

Jeff Friesen

Di bagian atas diagram adalah serangkaian file kelas program, salah satunya dilambangkan sebagai file kelas utama. Program Java setidaknya terdiri dari file kelas utama, yang merupakan file kelas pertama yang akan dimuat, diverifikasi, dan dijalankan.

JVM mendelegasikan pemuatan kelas ke komponen pemuat kelasnya. Classloader memuat file kelas dari berbagai sumber, seperti sistem file, jaringan, dan file arsip. Mereka mengisolasi JVM dari kerumitan pemuatan kelas.

File kelas yang dimuat disimpan dalam memori dan direpresentasikan sebagai objek yang dibuat dari Classkelas. Setelah dimuat, pemverifikasi bytecode memverifikasi berbagai instruksi bytecode untuk memastikan bahwa instruksi tersebut valid dan tidak akan membahayakan keamanan.

Jika bytecode file kelas tidak valid, JVM berakhir. Jika tidak, komponen interpreternya menafsirkan bytecode satu instruksi pada satu waktu. Interpretasi mengidentifikasi instruksi bytecode dan menjalankan instruksi asli yang setara.

Beberapa urutan instruksi bytecode lebih sering dieksekusi daripada yang lain. Ketika interpreter mendeteksi situasi ini, compiler just-in-time (JIT) JVM mengompilasi urutan bytecode ke kode native untuk eksekusi yang lebih cepat.

Selama eksekusi, interpreter biasanya menemukan permintaan untuk mengeksekusi bytecode file kelas lain (milik program atau library). Ketika ini terjadi, classloader memuat file kelas dan verifikator bytecode memverifikasi bytecode file kelas yang dimuat sebelum dijalankan. Juga selama eksekusi, instruksi bytecode mungkin meminta JVM membuka file, menampilkan sesuatu di layar, membuat suara, atau melakukan tugas lain yang memerlukan kerja sama dengan platform asli. JVM merespons dengan menggunakan teknologi jembatan Java Native Interface (JNI) untuk berinteraksi dengan platform asli untuk melakukan tugas.