Nama : Erlangga Rizqi Dwi Raswanto
NRP : 5025241179
Kelas : PBO A
Penerapan Inheritance pada Sistem Rental Kendaraan berbasis Java
-
Menerapkan konsep inheritance (pewarisan) dalam Java dengan membuat satu kelas induk
Kendaraandan beberapa kelas turunan (Mobil,Motor,Sepeda). -
Menunjukkan bagaimana enkapsulasi digunakan untuk melindungi data (atribut dibuat
private/protected, akses lewat getter/setter). -
Menunjukkan contoh polimorfisme lewat pemanggilan method yang sama (
getInfo(),hitungBiaya()) pada objek-objekKendaraanyang berbeda jenis. -
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
Inheritance (pewarisan)
-
Mobil,Motor,Sepedamewarisi atribut umum dariKendaraan. -
Semua jenis kendaraan punya
merk,model,tahunProduksi, dan statustersedia.
-
-
Enkapsulasi
-
Atribut dibuat
private/protected. -
Akses data melalui method
getterdansetter.
-
-
Polimorfisme
-
List kendaraan bertipe
List<Kendaraan>, tapi isinya bisaMobil,Motor, atauSepeda. -
Saat dipanggil
kendaraan.getInfo()ataukendaraan.hitungBiaya(...), yang dipanggil adalah versi method dari kelas turunan masing-masing (dynamic dispatch).
-
-
Abstraksi
-
Kendaraandibuat abstract: tidak dibuat objeknya langsung. -
Method
getInfo()danhitungBiaya()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()danhitungBiaya(). -
Menyediakan method
isTersedia()dansetTersedia()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
Kendaraanyang 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
Kendaraanyang 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
Kendaraanyang 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
namadannoIdentitas(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
Penyewadengan satuKendaraan. -
Menyimpan lama sewa (hari) dan total biaya sewa.
-
Saat objek
Rentaldibuat, 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 saatRentaldibuat. -
Method yang dipanggil sama (
getInfo()danhitungBiaya()), tapi hasilnya berbeda tergantung jenis kendaraan → contoh polimorfisme.
Tidak ada komentar:
Posting Komentar