PRAKTIKUM PEMROGRAMAN BERORIENTASI OBJEK
BAB : Polymorfisme
NAMA : Izzah Faiq Putri Madani
NIM : 235150201111039
ASISTEN : Abid Faiz Saladin
Muhammad Arsya Zain Yashifa
TGL PRAKTIKUM : 02/04/2024
TUGAS MODUL
Pertanyaan
1. Ketikkan kode ini.
MainEmployee.java
public class MainEmployee {
public static void main(String[] args) {
Employee employee = new Employee();
}
}
Screenshot
Jawaban
Terjadi error dimana class Employee tidak dapat membuat object atau di inisiasi seperti
biasanya. Hal ini terjadi karena class Employee adalah class abstract. Di class abstract
terdapat method paling minimal satu yang ketika dijalankan, java akan bingung harus
memasukkan data apa. Untuk bisa menjalankan program tersebut bisa gunakan child class
dari Employee.
Pertanyaan
2. Jalankan program dengan main sebagai berikut.
MainEmployee.java
public class MainEmployee {
public static void main(String[] args) {
SalariedEmployee salariedEmployee = new
SalariedEmployee("Daniel", "135", 800.00);
HourlyEmployee hourlyEmployee = new
HourlyEmployee("Karina", "234", 16.75, 40);
CommissionEmployee commissionEmployee = new
CommissionEmployee("Keanu", "145", 10000, .06);
BasePlusCommissionEmployee
basePlusCommissionEmployee = new
BasePlusCommissionEmployee("Bondan", "234", 5000, .04,
300);
System.out.println("Employees diproses secara
terpisah:\n ");
System.out.printf("%s\n%s: $%,.2f\n\n",
salariedEmployee, "pendapatan: ",
salariedEmployee.earnings());
System.out.printf("%s\n%s: $%,.2f\n\n",
hourlyEmployee, "pendapatan: ",
hourlyEmployee.earnings());
System.out.printf("%s\n%s: $%,.2f\n\n",
commissionEmployee, "pendapatan: ",
commissionEmployee.earnings());
System.out.printf("%s\n%s: $%,.2f\n\n",
basePlusCommissionEmployee, "earned",
basePlusCommissionEmployee.earnings());
Employee[] employees = new Employee[4];
employees[0] = salariedEmployee;
employees[1] = hourlyEmployee;
employees[2] = commissionEmployee;
employees[3] = basePlusCommissionEmployee;
System.out.println("Employees diproses secara
polimorfisme:\n ");
for (Employee currentEmployee : employees) {
System.out.println(currentEmployee);
if (currentEmployee instanceof
BasePlusCommissionEmployee) {
BasePlusCommissionEmployee employee =
(BasePlusCommissionEmployee) currentEmployee;
employee.setBaseSalary(1.10 *
employee.getBaseSalary());
System.out.printf("Gaji pokok setelah
dinaikkan 10%% : $%,.2f\n", employee.getBaseSalary());
}
System.out.printf("pendapatan: $%,.2f\n\n",
currentEmployee.earnings());
}
for (int j = 0; j < employees.length; j++) {
System.out.printf("Employee %d = %s\n", j,
employees[j].getClass().getName());
}
}
}
Analisis dan jelaskan output program (berdasarkan konsep polimorfisme)!
Screenshot
Sebelum Diproses Secara Polimorfisme Setelah Diproses Secara Polimorfisme
Jawaban
- Tanpa polymorphism : Pada tabel diatas, program di proses secara terpisah dengan
menggunakan instansiasi object secara langsung dari class masing-masing. Setiap
class memiliki parameternya sendiri-sendiri. Pendapatan masing-masing class
dihitung sesuai method earnings di masing-masing class
- Menggunakan polimorfism : Karyawan-karyawan ditangani dalam array Employee
menggunakan polimorfisme. Dalam loop for-each, setiap karyawan ditampilkan
informasinya menggunakan metode toString() dari kelas masing-masing, dan
pendapatannya dihitung dengan metode earnings() sesuai method masing-masing
class. Untuk BasePlusCommissionEmployee, gaji pokok dinaikkan 10% terlebih
dahulu sebelum menghitung pendapatannya.
Pertanyaan
3. Buat objek dari method Employee? Jelaskan hasil dari output program tersebut!
Syntax
public class MainEmployee {
public static void main(String[] args) {
Employee employee = new Employee("Putri",
"2345") {
@Override
public double earnings() {
return 2000;
}
};
System.out.println(employee);
System.out.println(employee.earnings());
}
}
Screenshot
Jawaban
Jika membuat object dari constructor secara langsung, maka output yang dihasilkan akan
sama dengan nomer satu. Tetapi jika memasukkan nama dan nomer KTP (sesuai constructor),
dan memanggil method abstract juga maka akan muncul output seperti diatas.
Pertanyaan
4. Tambahkan atribut tanggal lahir di Kelas Employee, serta tambahkan method
pendukungnya (accesor dan mutator). Modifikasi program agar sesuai. Asumsikan
gaji yang diterima adalah per bulan, buat kelas uji untuk menguji program yang sudah
anda modifikasi, kemudian buat objek dari semua class (salariedEmployee,
hourlyEmployee, commissionEmployee, basePlusCommissionEmployee dan hitung
gajinya secara polimorfisme, serta tambahkan gajinya sebesar 100.000 jika bulan ini
adalah bulan ulang tahunnya.
Syntax
MainEmployee.java
public class MainEmployee {
public static void main(String[] args) {
SalariedEmployee salariedEmployee = new
SalariedEmployee("Daniel", "135", 800.0, 25, 5, 2005);
HourlyEmployee hourlyEmployee = new
HourlyEmployee("Karina", "234", 16.75, 40, 26, 11,
2004);
CommissionEmployee commissionEmployee = new
CommissionEmployee("Keanu", "145", 10000, .06, 18, 5,
2016);
BasePlusCommissionEmployee
basePlusCommissionEmployee = new
BasePlusCommissionEmployee("Bondan", "234", 5000, .04,
300, 21, 9, 2007);
Employee[] employees = {salariedEmployee,
hourlyEmployee, commissionEmployee,
basePlusCommissionEmployee};
for (Employee currentEmployee : employees) {
double earnings =
currentEmployee.earnings();
if (currentEmployee.getBln() == 5) {
System.out.println("====================================
");
System.out.println("Nama: " +
currentEmployee.getName());
System.out.println("No. KTP: " +
currentEmployee.getNoKTP());
System.out.printf("Tanggal Lahir :
%d-%d-%d\n", currentEmployee.getTgl(),
currentEmployee.getBln(), currentEmployee.getThn());
System.out.println("Pendapatan sebelum
dapat bonus : " + currentEmployee.earnings());
System.out.println("Selamat! Anda
mendapat bonus ulang tahun sebesar $100,000");
earnings+=100000;
System.out.println("pendapatan: $" +
earnings);
System.out.println("====================================
");
System.out.println();
}
}
}
}
Employee.java
public abstract class Employee {
protected String name;
protected String noKTP;
protected int tgl, bln, thn;
public Employee(String name, String noKTP, int tgl,
int bln, int thn) {
this.name = name;
this.noKTP = noKTP;
this.tgl = tgl;
this.bln = bln;
this.thn=thn;
}
public int getTglLahir(){
return tgl + bln + thn;
}
public String getName() {
return name;
}
public String getNoKTP() {
return noKTP;
}
public int getTgl() {
return tgl;
}
public int getBln() {
return this.bln;
}
public int getThn() {
return thn;
}
public String toString() {
return String.format("Nama : "+getName() +
"\nNo. KTP : "+getNoKTP()+"\nTanggal Lahir : "+
getTglLahir());
}
public abstract double earnings();//pendapatan
}
SalariedEmployee.java
public class SalariedEmployee extends Employee{
private double weeklySalary; //gaji/minggu
public SalariedEmployee(String name, String noKTP,
double salary, int tgl, int bln, int thn) {
super(name, noKTP, tgl, bln, thn);
setWeeklySalary(salary);
}
public void setWeeklySalary(double salary) {
weeklySalary = salary;
}
public double getWeeklySalary() {
return weeklySalary;
}
@Override
public double earnings() {
return getWeeklySalary()*4;
}
public String toString() {
return String.format("Salaried employee: " +
super.toString() + "\nweekly salary:" +
getWeeklySalary());
}
}
HourlyEmployee.java
public class HourlyEmployee extends Employee{
private double wage; //upah per jam
private double hours; //jumlah jam tiap minggu
public HourlyEmployee(String name, String noKTP,
double hourlyWage, double hoursWorked, int tgl, int bln,
int thn) {
super(name, noKTP, tgl, bln, thn);
setWage(hourlyWage);
setHours(hoursWorked);
}
public void setWage(double hourlyWage) {
wage = hourlyWage;
}
public double getWage() {
return wage;
}
public void setHours(double hoursWorked) {
hours = hoursWorked;
}
public double getHours() {
return hours;
}
public double earnings() {
if (getHours() <= 40)
return getWage() * getHours()*30;
else
return (40 * getWage() + (getHours() - 40) *
getWage() * 1.5)*30;
}
public String toString() {
return String.format("Hourly employee:
"+super.toString() + "\nhourly wage" + getWage() +
"\nhours worked: "+getHours());
}
}
CommisionEmployee.java
public class CommissionEmployee extends Employee{
private double grossSales;//penjualan per minggu
private double commissionRate;//komisi
public CommissionEmployee (String name, String
noKTP, double sales, double rate, int tgl, int bln, int
thn) {
super(name, noKTP, tgl, bln, thn);
setGrossSales(sales);
setCommissionRate(rate);
}
public void setGrossSales(double sales) {
grossSales = sales;
}
public double getGrossSales() {
return grossSales;
}
public void setCommissionRate(double rate) {
commissionRate = rate;
}
public double getCommissionRate() {
return commissionRate;
}
public double earnings() {
return getCommissionRate() * getGrossSales() *4;
}
public String toString() {
return String.format("Commision employee:
"+super.toString()+"\ngross sales:
"+getGrossSales()+"\ncommission rate
"+getCommissionRate());
}
}
BasePlusCommision.java
public class BasePlusCommissionEmployee extends
CommissionEmployee {
private double baseSalary;//gaji pokok tiap
minggu
public BasePlusCommissionEmployee(String name,
String noKTP, double sales, double rate, double salary,
int tgl, int bln, int thn) {
super(name, noKTP, sales, rate, tgl, bln,
thn);
setBaseSalary(salary);
}
public void setBaseSalary(double salary) {
baseSalary = salary;
}
public double getBaseSalary() {
return baseSalary*4;
}
public double earnings() {
return (getBaseSalary() +
super.earnings())*4;
}
public String toString() {
return String.format("Base-Salaried " +
super.toString() + "\nbase salary "
+ getBaseSalary());
}
}
Screenshot
Jawaban
- Main : Saya membuat object untuk masing-masing class dan mengumpulkannya
menjadi satu array yang bernama employees. Dilakukan perulangan for-each yang
berfungsi untuk mengakses setiap objek Employee pada array employees. Pada setiap
iterasi, program akan melakukan pengecekan apakah bulan saat ini sama dengan
bulan ulang tahun dari karyawan yang bersangkutan. Jika sama, maka karyawan akan
menerima bonus sebesar 100.000 rupiah yang akan ditambahkan pada gaji mereka.
- Employee : menambahkan method setter dan getter sesuai kebutuhan
- SalariedEmployee : menyesuaikan constructor pada class super dan mengalikan 4 di
method earnings untuk menghasilkan pendapatan tiap bulan (sebelumnya pendapatan
tiap pekan).
- HourlyEmployee : menyesuaikan constructor pada class super dan mengalikan 30 di
method earnings untuk menghasilkan pendapatan tiap bulan (sebelumnya pendapatan
tiap hari).
- CommisionEmployee : menyesuaikan constructor pada class super dan mengalikan 4
di method earnings untuk menghasilkan pendapatan tiap bulan (sebelumnya
pendapatan tiap pekan).
- BasePlusCommisionEmployee : menyesuaikan constructor pada class super dan
mengalikan 4 di method earnings untuk menghasilkan pendapatan tiap bulan
(sebelumnya pendapatan tiap pekan).
Pertanyaan
5. Perusahaan yang mengaplikasikan program polimorfisme diatas ingin menambahkan
kriteria baru untuk penggajian karyawannya, yaitu penggajian berdasarkan banyaknya
barang yang diproduksi. Dengan ketentuan gaji karyawan tersebut adalah hasil dari
banyaknya barang yang dipoduksi per minggu dikalikan upah per barangnya.
a. Analisis dan jelaskan proses modifikasi program diatas (dimulai dari pemilihan
jenis class, perancangan class, dan penempatan class)
b. Implementasi hasil analisis tersebut ke dalam program dan buat kelas uji dengan
minimal 4 objek yang dibentuk.
Syntax
MainEmployee.java
public class MainEmployee {
public static void main(String[] args) {
Employee p1 = new GajiByProduk("Putri", "12345",
10);
Employee p2 = new GajiByProduk("Gladys",
"23456", 9);
Employee p3 = new GajiByProduk("Farah", "34567",
6);
Employee p4 = new GajiByProduk("Yuki", "45678",
14);
Employee p5 = new GajiByProduk("Caca", "567890",
20);
Employee[]employees=new Employee[5];
employees[0]=p1;
employees[1]=p2;
employees[2]=p3;
employees[3]=p4;
employees[4]=p5;
for (Employee currentEmployee : employees){
System.out.println(currentEmployee);
System.out.println("Pendapatan : Rp" +
currentEmployee.earnings());;
System.out.println();
}
}
}
GajiByProduk.java
public class GajiByProduk extends Employee {
protected double jumlahProduk;
protected double upah = 200;
GajiByProduk(String name, String noKTP, double
jumlahProduk) {
super(name, noKTP);
this.jumlahProduk = jumlahProduk;
}
public double getJumlahProduk() {
return jumlahProduk;
}
@Override
public double earnings() {
return getJumlahProduk() * upah * 4;
}
public String toString() {
return String.format(super.toString() +
"\njumlah produksi/pekan : " + getJumlahProduk());
}
}
Screenshot
Jawaban
Saya membuat satu class dengan nama GajiByProduk yang mana class ini akan menjadi
subclass dari Employee. Di class ini saya membuat 2 atribut baru yaitu jumlahProduk dan
upah dengan tipe data double. jumlahProduk adalah jumlah produksi barang selama satu
pekan. upah adalah harga per item. Lalu saya membuat constructor dengan 3 parameter, 2
dari parent class dan satu jumlahProduk. Setelah itu saya membuat method accessor dan
method abstract yang mana adalah bentuk override dari abstract class. Method abstract alias
earnings saya return ke jumlahProduk * upah * 4 agar memunculkan hasil yang didapat
selama satu bulan.
TUGAS PRAKTIKUM
Pertanyaan
1. Buatlah sebuah aplikasi perpustakaan sederhana yang memiliki beberapa jenis
media, seperti buku dan majalah. Setiap jenis media memiliki atribut judul dan tahun
terbit. Buku memiliki atribut tambahan penulis, sedangkan majalah memiliki atribut
tambahan nomor edisi. Implementasikan polimorfisme dengan membuat class
abstrak Media yang memiliki method abstrak info() untuk menampilkan informasi
media tersebut. Buatlah class turunan Buku dan Majalah yang mengimplementasikan
method info() untuk menampilkan informasi khusus dari masing-masing jenis media.
buat gaya outputnya sesuai kreativitas masing-masing.
Syntax
MainMedia.java
public class MainMedia {
public static void main(String[] args) {
Buku m1 = new Buku("KKPK", 2017, "Haru");
Majalah m2 = new Majalah("Bobo", 2010, 7);
m1.info();
System.out.println();
m2.info();
}
}
Media.java
public abstract class Media {
protected String judul;
protected int tahun;
Media (String judul, int tahun){
this.judul=judul;
this.tahun=tahun;
}
public abstract void info();
}
Buku.java
public class Buku extends Media{
protected String penulis;
Buku(String judul, int tahun, String penulis ){
super(judul, tahun);
setPenulis(penulis);
}
public void setPenulis(String penulis) {
this.penulis = penulis;
}
@Override
public void info() {
System.out.println("============= DATA BUKU
=============");
System.out.println("Judul buku : "+ judul);
System.out.println("Nama penulis : "+ penulis);
System.out.println("Tahun terbit : "+ tahun);
System.out.println("====================================
=");
}
}
Majalah.java
public class Majalah extends Media {
protected int noEdisi;
Majalah(String judul, int tahun, int noEdisi){
super(judul, tahun);
setNoEdisi(noEdisi);
}
public void setNoEdisi(int noEdisi) {
this.noEdisi = noEdisi;
}
@Override
public void info() {
System.out.println("============ DATA MAJALAH
===========");
System.out.println("Judul Majalah : "+ judul);
System.out.println("Tahun Rilis : "+ tahun);
System.out.println("Nomor Edisi : "+ noEdisi);
System.out.println("====================================
=");
}
}
Gambar Class Diagram
Screenshot
Penjelasan
- Main : Saya membuat 2 object dari 2 class yang berbeda yang disitu langsung saya
inisiasikan sesuai parameter pada constructor masing-masing. Lalu saya panggil
method abstract info untuk masing-masing object.
- Media : Saya class abstract yang memiliki 2 atribut utama yang nantinya akan
diturunkan ke child class nya, yaitu judul dengan tipe data String dan tahun dengan
tipe data int. Lalu membuat constructor dengan parameter judul dan tahun. terakhir,
saya membuat method abstract sebagai template untuk child classnya.
- Buku : Saya membuat class ini di extend ke class Media. Membuat satu atribut
tambahan yaitu penulis dengan tipe data String. Lalu membuat constructor dengan
parameter parent dan tambahan penulis. Membuat setPenulis untuk mengisikan
penulis sesuai yang diinginkan program yang telah diinisiasikan. Melengkapi method
abstract sesuai keinginan saya seperti pada output.
- Majalah: Saya membuat class ini di extend ke class Media. Membuat satu atribut
tambahan yaitu noEdisi dengan tipe data int. Lalu membuat constructor dengan
parameter parent dan tambahan noEdisi. Membuat setPenulis untuk mengisikan
penulis sesuai yang diinginkan program yang telah diinisiasikan. Melengkapi method
abstract sesuai keinginan saya seperti pada output.