Senin, 01 Desember 2025

PBO A - Pertemuan 11 - Penerapan Inheritance pada Sistem Rental Kendaraan

 Nama    : Erlangga Rizqi Dwi Raswanto

NRP      : 5025241179

Kelas     : PBO A


Penerapan Inheritance pada Sistem Rental Kendaraan berbasis Java



  1. Menerapkan konsep inheritance (pewarisan) dalam Java dengan membuat satu kelas induk Kendaraan dan beberapa kelas turunan (Mobil, Motor, Sepeda).

  2. Menunjukkan bagaimana enkapsulasi digunakan untuk melindungi data (atribut dibuat private / protected, akses lewat getter/setter).

  3. Menunjukkan contoh polimorfisme lewat pemanggilan method yang sama (getInfo(), hitungBiaya()) pada objek-objek Kendaraan yang berbeda jenis.

  4. Mengembangkan contoh sederhana menjadi aplikasi kecil yang bisa:

    • menyimpan daftar kendaraan,

    • mencatat penyewa dan transaksi rental,

    • menampilkan kendaraan yang masih tersedia dan daftar transaksi.


2.  Konsep OOP yang Dipakai

  1. Inheritance (pewarisan)

    • Mobil, Motor, Sepeda mewarisi atribut umum dari Kendaraan.

    • Semua jenis kendaraan punya merk, model, tahunProduksi, dan status tersedia.

  2. Enkapsulasi

    • Atribut dibuat private / protected.

    • Akses data melalui method getter dan setter.

  3. Polimorfisme

    • List kendaraan bertipe List<Kendaraan>, tapi isinya bisa Mobil, Motor, atau Sepeda.

    • Saat dipanggil kendaraan.getInfo() atau kendaraan.hitungBiaya(...), yang dipanggil adalah versi method dari kelas turunan masing-masing (dynamic dispatch).

  4. Abstraksi

    • Kendaraan dibuat abstract: tidak dibuat objeknya langsung.

    • Method getInfo() dan hitungBiaya() dibuat abstrak → wajib dioverride di subclass.


3. Implementasi Kelas

3.1. Kendaraan.java

Peran:

  • Menyimpan atribut umum semua kendaraan: merk, model, tahunProduksi, tersedia.

  • Memberi kontrak method abstrak getInfo() dan hitungBiaya().

  • Menyediakan method isTersedia() dan setTersedia() untuk menandai apakah kendaraan masih bisa disewa atau tidak.

/**
 * Kelas induk abstrak untuk semua jenis kendaraan
 */
public abstract class Kendaraan {
    private String merk;
    private String model;
    private int tahunProduksi;
    private boolean tersedia;

    public Kendaraan(String merk, String model, int tahunProduksi) {
        this.merk = merk;
        this.model = model;
        this.tahunProduksi = tahunProduksi;
        this.tersedia = true; // default: masih tersedia untuk disewa
    }

    public String getMerk() {
        return merk;
    }

    public String getModel() {
        return model;
    }

    public int getTahunProduksi() {
        return tahunProduksi;
    }

    public boolean isTersedia() {
        return tersedia;
    }

    public void setTersedia(boolean tersedia) {
        this.tersedia = tersedia;
    }

    /**
     * Info dasar kendaraan: merk, model, tahun produksi.
     * Dipakai oleh subclass untuk menyusun info lengkap.
     */
    protected String getInfoDasar() {
        return merk + " " + model + " (" + tahunProduksi + ")";
    }

    /**
     * Harus dioverride oleh setiap subclass untuk menampilkan info lengkap.
     */
    public abstract String getInfo();

    /**
     * Menghitung biaya sewa berdasarkan lama hari.
     * Implementasi spesifik ada di masing-masing subclass.
     */
    public abstract double hitungBiaya(int lamaHari);
}

3.2. Mobil.java

Peran:

  • Turunan Kendaraan yang mewakili mobil.

  • Menambahkan atribut jumlahRoda.

  • Menentukan cara menampilkan info dan menghitung biaya sewa khusus mobil.

/**
 * Kelas Mobil sebagai turunan dari Kendaraan
 */
public class Mobil extends Kendaraan {
    private int jumlahRoda;

    public Mobil(String merk, String model, int tahunProduksi, int jumlahRoda) {
        super(merk, model, tahunProduksi);
        this.jumlahRoda = jumlahRoda;
    }

    public int getJumlahRoda() {
        return jumlahRoda;
    }

    @Override
    public String getInfo() {
        return "Mobil  : " + getInfoDasar() + ", jumlah roda: " + jumlahRoda;
    }

    @Override
    public double hitungBiaya(int lamaHari) {
        // contoh: tarif mobil Rp350.000 per hari
        double tarifPerHari = 350_000;
        return tarifPerHari * lamaHari;
    }
}

3.3. Motor.java

Peran:

  • Turunan Kendaraan yang mewakili motor.

  • Juga memakai jumlahRoda, biasanya 2.

  • Biaya sewa berbeda dari mobil.

/**
 * Kelas Motor sebagai turunan dari Kendaraan
 */
public class Motor extends Kendaraan {
    private int jumlahRoda;

    public Motor(String merk, String model, int tahunProduksi, int jumlahRoda) {
        super(merk, model, tahunProduksi);
        this.jumlahRoda = jumlahRoda;
    }

    public int getJumlahRoda() {
        return jumlahRoda;
    }

    @Override
    public String getInfo() {
        return "Motor  : " + getInfoDasar() + ", jumlah roda: " + jumlahRoda;
    }

    @Override
    public double hitungBiaya(int lamaHari) {
        // contoh: tarif motor Rp100.000 per hari
        double tarifPerHari = 100_000;
        return tarifPerHari * lamaHari;
    }
}

3.4. Sepeda.java

Peran:

  • Turunan Kendaraan yang mewakili sepeda.

  • Menambahkan atribut jenisSepeda (misalnya: Gunung, Balap, BMX, Lipat).

  • Biaya sewanya lebih murah.

/**
 * Kelas Sepeda sebagai turunan dari Kendaraan
 */
public class Sepeda extends Kendaraan {
    private String jenisSepeda;

    public Sepeda(String merk, String model, int tahunProduksi, String jenisSepeda) {
        super(merk, model, tahunProduksi);
        this.jenisSepeda = jenisSepeda;
    }

    public String getJenisSepeda() {
        return jenisSepeda;
    }

    @Override
    public String getInfo() {
        return "Sepeda : " + getInfoDasar() + ", jenis: " + jenisSepeda;
    }

    @Override
    public double hitungBiaya(int lamaHari) {
        // contoh: tarif sepeda Rp50.000 per hari
        double tarifPerHari = 50_000;
        return tarifPerHari * lamaHari;
    }
}

3.5. Penyewa.java

Peran:

  • Menyimpan data orang yang menyewa kendaraan.

  • Di sini disimpan nama dan noIdentitas (misal: NIK, KTP, SIM, atau ID lain).

/**
 * Menyimpan data penyewa kendaraan
 */
public class Penyewa {
    private String nama;
    private String noIdentitas;

    public Penyewa(String nama, String noIdentitas) {
        this.nama = nama;
        this.noIdentitas = noIdentitas;
    }

    public String getNama() {
        return nama;
    }

    public String getNoIdentitas() {
        return noIdentitas;
    }

    public String getInfo() {
        return nama + " (ID: " + noIdentitas + ")";
    }
}

3.6. Rental.java

Peran:

  • Menghubungkan satu Penyewa dengan satu Kendaraan.

  • Menyimpan lama sewa (hari) dan total biaya sewa.

  • Saat objek Rental dibuat, status kendaraan otomatis diubah jadi tidak tersedia.

/**
 * Mewakili satu transaksi rental kendaraan
 */
public class Rental {
    private Penyewa penyewa;
    private Kendaraan kendaraan;
    private int lamaHari;
    private double totalBiaya;

    public Rental(Penyewa penyewa, Kendaraan kendaraan, int lamaHari) {
        this.penyewa = penyewa;
        this.kendaraan = kendaraan;
        this.lamaHari = lamaHari;

        // saat dirental, kendaraan tidak lagi tersedia
        this.kendaraan.setTersedia(false);

        // hitung total biaya sewa menggunakan polimorfisme
        this.totalBiaya = kendaraan.hitungBiaya(lamaHari);
    }

    public Penyewa getPenyewa() {
        return penyewa;
    }

    public Kendaraan getKendaraan() {
        return kendaraan;
    }

    public int getLamaHari() {
        return lamaHari;
    }

    public double getTotalBiaya() {
        return totalBiaya;
    }

    public String getInfo() {
        String biayaFormatted = String.format("Rp %,.0f", totalBiaya);
        return "Penyewa : " + penyewa.getInfo() +
               "\nKendaraan: " + kendaraan.getInfo() +
               "\nLama sewa: " + lamaHari + " hari" +
               "\nTotal    : " + biayaFormatted;
    }
}

3.7. RentalApp.java (Main)

Peran:

  • Menjadi titik masuk program (main).

  • Membuat daftar kendaraan (mobil, motor, sepeda).

  • Membuat beberapa penyewa dan transaksi rental.

  • Menampilkan:

    • daftar kendaraan yang masih tersedia,

    • daftar transaksi rental yang sedang berjalan.

import java.util.ArrayList;
import java.util.List;

/**
 * Kelas utama untuk menjalankan aplikasi rental kendaraan
 */
public class RentalApp {

    public static void main(String[] args) {
        // 1. Membuat daftar kendaraan
        List<Kendaraan> daftarKendaraan = new ArrayList<>();
        daftarKendaraan.add(new Mobil("Toyota", "Avanza", 2022, 4));
        daftarKendaraan.add(new Motor("Honda", "Vario", 2021, 2));
        daftarKendaraan.add(new Sepeda("Polygon", "Xtrada", 2020, "Gunung"));
        daftarKendaraan.add(new Mobil("Suzuki", "Ertiga", 2019, 4));
        daftarKendaraan.add(new Sepeda("United", "Miami", 2023, "BMX"));
        daftarKendaraan.add(new Motor("Yamaha", "NMax", 2022, 2));

        // 2. Daftar rental (transaksi)
        List<Rental> daftarRental = new ArrayList<>();

        // 3. Membuat beberapa penyewa
        Penyewa p1 = new Penyewa("Budi", "KTP001");
        Penyewa p2 = new Penyewa("Siti", "KTP002");
        Penyewa p3 = new Penyewa("Andi", "KTP003");

        // 4. Contoh transaksi:
        //    Budi sewa Avanza 2 hari, Siti sewa Sepeda Gunung 3 hari, Andi sewa Motor NMax 1 hari
        Rental r1 = new Rental(p1, daftarKendaraan.get(0), 2); // Avanza
        Rental r2 = new Rental(p2, daftarKendaraan.get(2), 3); // Sepeda Gunung
        Rental r3 = new Rental(p3, daftarKendaraan.get(5), 1); // NMax

        daftarRental.add(r1);
        daftarRental.add(r2);
        daftarRental.add(r3);

        // 5. Tampilkan daftar kendaraan yang masih tersedia
        System.out.println("=== Daftar Kendaraan Tersedia ===");
        for (Kendaraan k : daftarKendaraan) {
            if (k.isTersedia()) {
                System.out.println("- " + k.getInfo());
            }
        }

        System.out.println();

        // 6. Tampilkan daftar penyewa dan kendaraan yang disewa
        System.out.println("=== Daftar Transaksi Rental ===");
        for (Rental r : daftarRental) {
            System.out.println(r.getInfo());
            System.out.println("--------------------------------");
        }
    }
}

4. Contoh Output Program

Kurang lebih output di console akan seperti ini:


Terlihat bahwa:

  • Kendaraan yang sudah disewa tidak muncul lagi di daftar tersedia, karena setTersedia(false) dipanggil saat Rental dibuat.

  • Method yang dipanggil sama (getInfo() dan hitungBiaya()), tapi hasilnya berbeda tergantung jenis kendaraan → contoh polimorfisme.

Tidak ada komentar:

Posting Komentar

PBO A - Pertemuan 15 - Pong!

Nama : Erlangga Rizqi Dwi Raswanto NRP : 5025241179 Kelas : PBO A 1. Pendahuluan Pada pertemuan 15, kita mempraktikkan pembuatan game...