1. Pengenalan Java
Java adalah bahasa pemrograman berorientasi objek yang dikembangkan oleh James Gosling di Sun Microsystems dan pertama kali dirilis pada tahun 1995. Java menggunakan prinsip "Write Once, Run Anywhere" (WORA), artinya kode Java bisa dijalankan di semua platform yang mendukung Java Virtual Machine (JVM).
Java digunakan secara luas dalam pengembangan aplikasi enterprise, Android mobile, big data, sistem embedded, dan masih banyak lagi. Hingga saat ini, Java tetap menjadi salah satu bahasa pemrograman paling populer di dunia.
Mengapa Memilih Java?
| Keunggulan | Penjelasan |
|---|---|
| Platform Independent | Bisa dijalankan di mana saja selama ada JVM |
| Object-Oriented | Mendukung OOP sepenuhnya — encapsulation, inheritance, polymorphism |
| Multi-Threading | Bisa menjalankan banyak proses secara paralel |
| Keamanan | Fitur keamanan bawaan seperti sandbox dan bytecode verifier |
| Stabil & Mature | Sudah 30+ tahun, digunakan oleh jutaan perusahaan di seluruh dunia |
| Ekosistem Besar | Spring, Hibernate, Maven, Gradle, Android SDK, dan banyak lagi |
Java vs Bahasa Lain
| Aspek | Java | Python | C++ |
|---|---|---|---|
| Tipe | Compiled + Interpreted | Interpreted | Compiled |
| Typing | Static | Dynamic | Static |
| Sintaks | 🟡 Sedang-Verbose | 🟢 Sangat Mudah | 🔴 Kompleks |
| Kecepatan | 🟢 Cepat | 🟡 Sedang | 🟢 Sangat Cepat |
| Cocok untuk | Enterprise, Android | AI, Data, Otomasi | System, Game |
2. Instalasi JDK dan IDE
Untuk mulai memprogram Java, kamu perlu menginstal JDK (Java Development Kit) dan sebuah IDE (Integrated Development Environment).
Instalasi JDK di Windows
8. Interface dan Abstract Class
Interface adalah kontrak yang mendefinisikan method-method yang HARUS diimplementasikan oleh class yang menggunakannya. Abstract class adalah class yang tidak bisa diinstansiasi langsung dan bisa memiliki method abstrak (tanpa body) dan konkret.
// Interface — kontrak yang harus dipenuhi
public interface DapatBergerak {
void bergerak(); // method abstrak (default)
default void berhenti() { // method default (Java 8+)
System.out.println("Berhenti bergerak.");
}
}
public interface DapatBerenang {
void berenang();
}
// Class yang mengimplementasi interface
public class Orang implements DapatBergerak, DapatBerenang {
private String nama;
public Orang(String nama) {
this.nama = nama;
}
@Override
public void bergerak() {
System.out.println(nama + " berjalan kaki.");
}
@Override
public void berenang() {
System.out.println(nama + " sedang berenang di kolam.");
}
}
public class Ikan implements DapatBerenang {
private String nama;
public Ikan(String nama) {
this.nama = nama;
}
@Override
public void berenang() {
System.out.println(nama + " berenang di laut.");
}
}
Abstract Class
// Abstract class — tidak bisa diinstansiasi langsung
public abstract class BangunDatar {
protected String nama;
public BangunDatar(String nama) {
this.nama = nama;
}
// Method abstrak — HARUS diimplementasi oleh subclass
public abstract double hitungLuas();
public abstract double hitungKeliling();
// Method konkret — bisa langsung dipakai
public void tampilkanInfo() {
System.out.println("Bangun: " + nama);
System.out.println("Luas: " + hitungLuas());
System.out.println("Keliling: " + hitungKeliling());
}
}
public class Lingkaran extends BangunDatar {
private double jariJari;
public Lingkaran(double jariJari) {
super("Lingkaran");
this.jariJari = jariJari;
}
@Override
public double hitungLuas() {
return Math.PI * jariJari * jariJari;
}
@Override
public double hitungKeliling() {
return 2 * Math.PI * jariJari;
}
}
public class PersegiPanjang extends BangunDatar {
private double panjang, lebar;
public PersegiPanjang(double panjang, double lebar) {
super("Persegi Panjang");
this.panjang = panjang;
this.lebar = lebar;
}
@Override
public double hitungLuas() {
return panjang * lebar;
}
@Override
public double hitungKeliling() {
return 2 * (panjang + lebar);
}
}
// Main
public class MainBangun {
public static void main(String[] args) {
// Polymorphism dengan abstract class
BangunDatar[] bangun = {
new Lingkaran(7),
new PersegiPanjang(10, 5)
};
for (BangunDatar b : bangun) {
b.tampilkanInfo();
System.out.println("---");
}
}
}
Interface = kontrak murni, semua method abstrak (kecuali default), bisa multiple inheritance. Abstract class = bisa punya atribut, method konkret, constructor, dan hanya single inheritance. Gunakan interface untuk kemampuan (capability), abstract class untuk hierarki.
9. Exception Handling
Exception adalah error yang terjadi saat runtime. Java menggunakan try-catch-finally untuk menangani exception secara elegan tanpa membuat program crash.
public class ExceptionDemo {
public static void main(String[] args) {
// ===== TRY-CATCH DASAR =====
try {
int hasil = 10 / 0; // ArithmeticException!
System.out.println("Hasil: " + hasil);
} catch (ArithmeticException e) {
System.out.println("Error: " + e.getMessage());
}
// ===== MULTIPLE CATCH =====
try {
int[] arr = {1, 2, 3};
System.out.println(arr[10]); // IndexError!
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("Index di luar batas!");
} catch (Exception e) {
System.out.println("Error umum: " + e.getMessage());
} finally {
System.out.println("Blok finally selalu dijalankan!");
}
// ===== CONTOH DENGAN INPUT =====
try {
String teks = "abc";
int angka = Integer.parseInt(teks); // NumberFormatException!
} catch (NumberFormatException e) {
System.out.println("'abc' bukan angka yang valid!");
}
// ===== CUSTOM EXCEPTION =====
try {
tarikTunai(100000, 150000);
} catch (SaldoTidakCukupException e) {
System.out.println("Error: " + e.getMessage());
System.out.println("Kurang: Rp " + e.getKekurangan());
}
}
// Method yang melempar exception (throws)
public static void tarikTunai(int saldo, int jumlah)
throws SaldoTidakCukupException {
if (jumlah > saldo) {
throw new SaldoTidakCukupException(saldo, jumlah);
}
System.out.println("Penarikan berhasil. Sisa: Rp " + (saldo - jumlah));
}
}
// Custom Exception Class
public class SaldoTidakCukupException extends Exception {
private int saldo;
private int jumlah;
public SaldoTidakCukupException(int saldo, int jumlah) {
super("Saldo Rp " + saldo + " kurang dari Rp " + jumlah);
this.saldo = saldo;
this.jumlah = jumlah;
}
public int getKekurangan() {
return jumlah - saldo;
}
}
Hierarchy Exception di Java
flowchart TD
N0["Throwable + getMessage(") + printStackTrace(")"]
N1["Error (fatal, jangan catch) StackOver flow OutO..."]
N2["Exception (bisa ditangani dengan catch)"]
N3["Checked (wajib handle) - IO - SQL - File Runtim..."]
N0 --> N1
N1 --> N2
N2 --> N3
10. Quiz: Uji Pemahamanmu!
Setelah membaca tutorial di atas, jawablah 5 pertanyaan berikut untuk menguji pemahamanmu tentang Java: