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 |
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β CARA KERJA JAVA β β β β ββββββββββββ ββββββββββββ βββββββββββββββββββββββββ β β .java βββββΆβ javac βββββΆβ .class (bytecode) ββ β β Source β β Compiler β β Platform-neutral ββ β ββββββββββββ ββββββββββββ ββββββββββββ¬βββββββββββββ β β β β βΌ β β ββββββββββββββββββββ β β β JVM β β β β (Java Virtual β β β β Machine) β β β ββββββββββ¬ββββββββββ β β β β β ββββββββββββββββββββββΌββββββββββββ β β βΌ βΌ βΌ β β βββββββββββ βββββββββββ βββββββββ β β Windows β β Linux β β macOSββ β βββββββββββ βββββββββββ βββββββββ βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
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
# 1. Kunjungi https://adoptium.net/ atau https://www.oracle.com/java/ # 2. Download JDK 21 (LTS terbaru) # 3. Jalankan installer dan ikuti wizard # 4. Setelah selesai, tambahkan ke PATH jika tidak otomatis # Verifikasi instalasi di Command Prompt: java --version # Output: openjdk 21.0.3 2024-04-16 javac --version # Output: javac 21.0.3 # Cek JAVA_HOME echo %JAVA_HOME% # Output: C:\Program Files\Java\jdk-21
Instalasi di macOS
# Gunakan Homebrew untuk instalasi mudah: brew install openjdk@21 # Verifikasi: java --version javac --version # Atau download dari https://adoptium.net/
Instalasi di Linux (Ubuntu/Debian)
# Update dan instal JDK sudo apt update sudo apt install openjdk-21-jdk -y # Verifikasi java --version javac --version # Set JAVA_HOME (opsional) echo 'export JAVA_HOME=/usr/lib/jvm/java-21-openjdk-amd64' >> ~/.bashrc source ~/.bashrc
Program Java Pertama
// File: HelloWorld.java
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Halo, Dunia!");
System.out.println("Selamat datang di Java!");
System.out.println("Nama saya: BeebaneLabs");
}
}
// Kompilasi dan jalankan:
// javac HelloWorld.java
// java HelloWorld
//
// Output:
// Halo, Dunia!
// Selamat datang di Java!
// Nama saya: BeebaneLabs
IDE yang Direkomendasikan
| IDE | Kelebihan | Cocok untuk |
|---|---|---|
| IntelliJ IDEA | Fitur lengkap, auto-complete canggih, refactoring | Developer profesional |
| VS Code | Ringan, gratis, banyak ekstensi | Pemula dan menengah |
| Eclipse | Gratis, open source, plugin berlimpah | Enterprise dan akademik |
| NetBeans | Mudah digunakan, bawaan Oracle | Pemula |
Untuk pemula, IntelliJ IDEA Community Edition (gratis) sangat direkomendasikan. IDE ini punya fitur smart code completion dan debugging yang sangat membantu saat belajar. Pastikan JDK sudah terinstal sebelum membuka IDE.
3. Variabel dan Tipe Data
Variabel di Java harus dideklarasikan dengan tipe data secara eksplisit karena Java menggunakan static typing. Setiap variabel harus ditentukan tipe datanya sebelum digunakan.
Deklarasi Variabel
public class ContohVariabel {
public static void main(String[] args) {
// Deklarasi dan inisialisasi variabel
String nama = "Budi Santoso"; // String (class, huruf besar)
int umur = 25; // integer
double tinggi = 175.5; // double (desimal)
boolean isAktif = true; // boolean
char grade = 'A'; // karakter tunggal
// Deklarasi tanpa inisialisasi
int nilai;
nilai = 100; // inisialisasi belakangan
// Final (konstanta) β tidak bisa diubah
final double PI = 3.14159;
final String KAMPUS = "Universitas Indonesia";
// Menampilkan nilai
System.out.println("Nama: " + nama);
System.out.println("Umur: " + umur + " tahun");
System.out.println("Tinggi: " + tinggi + " cm");
System.out.println("Aktif: " + isAktif);
System.out.println("Grade: " + grade);
// Aturan penamaan variabel Java:
// β
namaLengkap, umurPengguna, _private, jumlah2
// β 2angka, nama-lengkap, class, public (reserved words)
}
}
Tipe Data Primitif
| Tipe | Ukuran | Range | Contoh |
|---|---|---|---|
byte | 1 byte | -128 s/d 127 | byte b = 100; |
short | 2 byte | -32,768 s/d 32,767 | short s = 30000; |
int | 4 byte | -2.1M s/d 2.1M | int x = 42; |
long | 8 byte | Sangat besar | long l = 100000L; |
float | 4 byte | Desimal presisi tunggal | float f = 3.14f; |
double | 8 byte | Desimal presisi ganda | double d = 3.14159; |
char | 2 byte | Karakter Unicode | char c = 'A'; |
boolean | 1 bit | true / false | boolean b = true; |
Tipe Data Non-Primitif (Reference)
public class TipeDataRef {
public static void main(String[] args) {
// String β kumpulan karakter
String sapaan = "Selamat pagi";
String nama = new String("Budi");
// Array β kumpulan data dengan tipe sama
int[] angka = {10, 20, 30, 40, 50};
String[] namaOrang = {"Budi", "Ani", "Citra"};
System.out.println(sapaan + ", " + nama + "!");
System.out.println("Angka pertama: " + angka[0]);
System.out.println("Jumlah elemen: " + angka.length);
// Array 2D
int[][] matrix = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
System.out.println("Matrix[1][2]: " + matrix[1][2]); // 6
// Konversi tipe data
String angkaStr = "42";
int angkaInt = Integer.parseInt(angkaStr); // String β int
double angkaDbl = Double.parseDouble("3.14"); // String β double
String hasil = String.valueOf(100); // int β String
System.out.println("Parsed: " + angkaInt); // 42
System.out.println("Double: " + angkaDbl); // 3.14
}
}
4. Operator
Java menyediakan berbagai jenis operator untuk memanipulasi data. Sintaksnya mirip dengan C/C++ sehingga jika sudah familiar dengan bahasa tersebut, kamu akan mudah beradaptasi.
Operator Aritmatika dan Perbandingan
public class OperatorDemo {
public static void main(String[] args) {
int a = 15, b = 4;
// Operator aritmatika
System.out.println(a + b); // 19 (penjumlahan)
System.out.println(a - b); // 11 (pengurangan)
System.out.println(a * b); // 60 (perkalian)
System.out.println(a / b); // 3 (pembagian bulat!)
System.out.println(a % b); // 3 (modulus/sisa bagi)
// PERHATIAN: pembagian integer menghasilkan integer
System.out.println(15 / 4); // 3, bukan 3.75
System.out.println(15.0 / 4); // 3.75 (gunakan double)
// Shortcut assignment
int x = 10;
x += 5; // x = x + 5 β 15
x -= 3; // x = x - 3 β 12
x *= 2; // x = x * 2 β 24
// Increment / Decrement
int y = 10;
y++; // y = 11
y--; // y = 10
++y; // y = 11 (prefix β ambil nilai setelah)
// Operator perbandingan β menghasilkan boolean
System.out.println(a == b); // false
System.out.println(a != b); // true
System.out.println(a > b); // true
System.out.println(a <= b); // false
// Operator logika
boolean aktif = true;
boolean premium = false;
System.out.println(aktif && premium); // AND β false
System.out.println(aktif || premium); // OR β true
System.out.println(!aktif); // NOT β false
// Ternary operator (if-else singkat)
int umur = 20;
String status = (umur >= 17) ? "Dewasa" : "Anak-anak";
System.out.println(status); // Dewasa
}
}
5. Kontrol Alur
Kontrol alur menentukan jalannya eksekusi program. Java mendukung if-else, switch, for, while, do-while, dan enhanced for loop.
public class KontrolAlur {
public static void main(String[] args) {
// ===== IF-ELSE =====
int nilai = 85;
if (nilai >= 90) {
System.out.println("Grade: A");
} else if (nilai >= 80) {
System.out.println("Grade: B");
} else if (nilai >= 70) {
System.out.println("Grade: C");
} else {
System.out.println("Grade: D (Tidak Lulus)");
}
// ===== SWITCH =====
String hari = "Senin";
switch (hari) {
case "Senin":
case "Selasa":
case "Rabu":
case "Kamis":
case "Jumat":
System.out.println("Hari kerja");
break;
case "Sabtu":
case "Minggu":
System.out.println("Hari libur");
break;
default:
System.out.println("Hari tidak valid");
}
// Switch expression (Java 14+)
String tipeHari = switch (hari) {
case "Sabtu", "Minggu" -> "Libur";
default -> "Kerja";
};
System.out.println(hari + " = " + tipeHari);
// ===== FOR LOOP =====
for (int i = 1; i <= 5; i++) {
System.out.println("Iterasi ke-" + i);
}
// Enhanced for (for-each) β untuk array/collection
String[] buah = {"Apel", "Mangga", "Jeruk", "Pisang"};
for (String b : buah) {
System.out.println("Buah: " + b);
}
// ===== WHILE =====
int counter = 0;
while (counter < 3) {
System.out.println("Counter: " + counter);
counter++;
}
// ===== DO-WHILE =====
int angka = 5;
do {
System.out.println("Angka: " + angka);
angka--;
} while (angka > 0);
// ===== BREAK & CONTINUE =====
for (int i = 0; i < 10; i++) {
if (i == 3) continue; // skip angka 3
if (i == 7) break; // stop di angka 7
System.out.println("i = " + i);
}
// Output: 0, 1, 2, 4, 5, 6
}
}
6. OOP Dasar β Class dan Object
Object-Oriented Programming (OOP) adalah paradigma pemrograman yang menjadi fondasi Java. Empat pilar OOP: Encapsulation, Inheritance, Polymorphism, dan Abstraction.
Membuat Class dan Object
// File: Mahasiswa.java
public class Mahasiswa {
// Atribut (fields) β ENCAPSULATION dengan access modifier
private String nama;
private int umur;
private String jurusan;
private double ipk;
// Constructor β dipanggil saat object dibuat
public Mahasiswa(String nama, int umur, String jurusan) {
this.nama = nama;
this.umur = umur;
this.jurusan = jurusan;
this.ipk = 0.0;
}
// Constructor overload (dengan IPK)
public Mahasiswa(String nama, int umur, String jurusan, double ipk) {
this.nama = nama;
this.umur = umur;
this.jurusan = jurusan;
this.ipk = ipk;
}
// Getter methods β ENCAPSULATION
public String getNama() { return nama; }
public int getUmur() { return umur; }
public String getJurusan() { return jurusan; }
public double getIpk() { return ipk; }
// Setter methods
public void setNama(String nama) { this.nama = nama; }
public void setIpk(double ipk) {
if (ipk >= 0.0 && ipk <= 4.0) {
this.ipk = ipk;
} else {
System.out.println("IPK tidak valid!");
}
}
// Method umum
public String getStatus() {
return ipk >= 2.75 ? "Lulus" : "Tidak Lulus";
}
public void tampilkanInfo() {
System.out.println("=== Data Mahasiswa ===");
System.out.println("Nama : " + nama);
System.out.println("Umur : " + umur + " tahun");
System.out.println("Jurusan : " + jurusan);
System.out.println("IPK : " + ipk);
System.out.println("Status : " + getStatus());
}
}
// File: Main.java
public class Main {
public static void main(String[] args) {
// Membuat object dari class Mahasiswa
Mahasiswa mhs1 = new Mahasiswa("Budi", 20, "Teknik Informatika");
mhs1.setIpk(3.75);
mhs1.tampilkanInfo();
Mahasiswa mhs2 = new Mahasiswa("Ani", 21, "Sistem Informasi", 3.89);
mhs2.tampilkanInfo();
// Error β field private, tidak bisa diakses langsung
// mhs1.nama = "Hacker"; // COMPILE ERROR!
}
}
Encapsulation adalah konsep menyembunyikan detail internal class dari luar. Gunakan private untuk atribut dan berikan public getter/setter. Ini melindungi data dari perubahan yang tidak diinginkan.
7. Inheritance (Pewarisan)
Inheritance memungkinkan class anak mewarisi atribut dan method dari class parent. Ini menghindari duplikasi kode dan memungkinkan code reuse.
// Class Parent (Superclass)
public class Hewan {
protected String nama;
protected String jenis;
public Hewan(String nama, String jenis) {
this.nama = nama;
this.jenis = jenis;
}
public void makan() {
System.out.println(nama + " sedang makan.");
}
public void bersuara() {
System.out.println(nama + " mengeluarkan suara...");
}
public void info() {
System.out.println("Nama: " + nama + ", Jenis: " + jenis);
}
}
// Class Anak (Subclass) β extends parent
public class Kucing extends Hewan {
private String warnaBulu;
public Kucing(String nama, String warnaBulu) {
super(nama, "Kucing"); // panggil constructor parent
this.warnaBulu = warnaBulu;
}
// Override method parent β POLYMORPHISM
@Override
public void bersuara() {
System.out.println(nama + " berkata: Meong! π±");
}
// Method khusus Kucing
public void bermainBenang() {
System.out.println(nama + " sedang bermain benang!");
}
@Override
public void info() {
super.info(); // panggil method parent
System.out.println("Warna Bulu: " + warnaBulu);
}
}
public class Anjing extends Hewan {
private boolean terlatih;
public Anjing(String nama, boolean terlatih) {
super(nama, "Anjing");
this.terlatih = terlatih;
}
@Override
public void bersuara() {
System.out.println(nama + " berkata: Guk guk! πΆ");
}
public void menggonggong() {
if (terlatih) {
System.out.println(nama + " menggonggong sesuai perintah!");
} else {
System.out.println(nama + " menggonggong liar!");
}
}
}
// Main class
public class MainHewan {
public static void main(String[] args) {
Kucing kucing = new Kucing("Kitty", "Putih");
Anjing anjing = new Anjing("Buddy", true);
kucing.info();
kucing.bersuara(); // Meong! π±
kucing.makan(); // diwarisi dari Hewan
kucing.bermainBenang();
anjing.info();
anjing.bersuara(); // Guk guk! πΆ
anjing.menggonggong();
// Polymorphism β referensi parent, object child
Hewan hewan1 = new Kucing("Tom", "Abu");
Hewan hewan2 = new Anjing("Rex", true);
hewan1.bersuara(); // Meong!
hewan2.bersuara(); // Guk guk!
}
}
βββββββββββββββββββββββββββ
β Hewan β
β βββββββββββββββββββββ β
β - nama: String β
β - jenis: String β
β + makan() β
β + bersuara() β
β + info() β
βββββββββββ¬ββββββββββββββββ
β extends
βββββββ΄βββββββ
βΌ βΌ
ββββββββββ ββββββββββ
β Kucing β β Anjing β
ββββββββββ ββββββββββ
βwarnaBuluβ βterlatihβ
βbermain β βgonggongβ
ββββββββββ ββββββββββ
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
ββββββββββββββββββββββββ
β Throwable β
β βββββββββββββββββββ β
β + getMessage() β
β + printStackTrace() β
ββββββββββββ¬ββββββββββββ
ββββββ΄βββββ
βΌ βΌ
ββββββββββββ βββββββββββββββββ
β Error β β Exception β
β (fatal, β β (bisa ditanganiβ
β jangan β β dengan catch) β
β catch) β βββββββββ¬ββββββββ
β β ββββββ΄βββββ
β StackOverβ βΌ βΌ
β flow β ββββββββββ βββββββββββββββββββββ
β OutOfMem β β Checkedβ β RuntimeException β
ββββββββββββ β(wajib β β (Unchecked) β
βhandle) β β - NullPointer β
β- IO β β - ArrayIndex β
β- SQL β β - NumberFormat β
β- File β β - Arithmetic β
ββββββββββ βββββββββββββββββββββ
10. Quiz: Uji Pemahamanmu!
Setelah membaca tutorial di atas, jawablah 5 pertanyaan berikut untuk menguji pemahamanmu tentang Java: