MODUL 7 - 225150201111008 - Anisa Putri Maharani
MODUL 7 - 225150201111008 - Anisa Putri Maharani
BAB : POLIMORFISME
NAMA : ANISA PUTRI MAHARANI
NIM : 225150201111008
ASISTEN : Tengku Muhammad Rafi Rahardiansyah
Muhammad Bin Djafar Almasyhur
TGL PRAKTIKUM : 29 Maret 2023
Pertanyaan
1. Ketikkan kode ini. Jalankan Main.java untuk polymorfisme Employee, analisis dan
jelaskan keluaran program tersebut!
Main.java
1. package Laprak7aPBO;
2. public class Main {
3. public static void main(String[] args) {
4. Employee employee = new Employee();
5. }
6. }
Source Code
Employee.java
1. package Laprak7aPBO;
2. public abstract class Employee {
3. private String name;
4. private String noKTP;
5. public Employee(String name, String noKTP){
6. this.name = name;
7. this.noKTP = noKTP;
8. }
9. public String getName(){
10. return name;
11. }
12. public String getNoKTP(){
13. return noKTP;
14. }
15. public String toString(){
16. return String.format(" "+getName()+"\nNo. KTP :
" + getNoKTP());
17. }
18. public abstract double earnings();//pendapatan
19. }
SalariedEmployee.java
1. package Laprak7aPBO;
2. public class SalariedEmployee extends Employee {
3. private double weeklySalary; //gaji/minggu
4. public SalariedEmployee(String name, String noKTP,
double salary){
5. super(name, noKTP);
6. setWeeklySalary(salary);
7. }
8. public void setWeeklySalary(double salary){
9. weeklySalary = salary;
10. }
11. public double getWeeklySalary(){
12. return weeklySalary;
13. }
14. public double earnings(){
15. return getWeeklySalary();
16. }
17. public String toString(){
18. return String.format("Salaried emplyee : " +
super.toString() + "\nweekly salary : " +
getWeeklySalary());
19. }
20. }
HourlyEmployee.java
1. package Laprak7aPBO;
2. public class HourlyEmployee extends Employee {
3. private double wage; //upah per jam
4. private double hours; //jumlah jam tiap minggu
5. public HourlyEmployee(String name, String noKTP,
double hourlyWage, double hoursWorked){
6. super(name, noKTP);
7. setWage(hourlyWage);
8. setHours(hoursWorked);
9. }
10. public void setWage(double hourlyWage){
11. wage = hourlyWage;
12. }
13. public double getWage(){
14. return wage;
15. }
16. public void setHours(double hoursWorked){
17. hours = hoursWorked;
18. }
19. public double getHours(){
20. return hours;
21. }
22. public double earnings(){
23. if(getHours() <= 40){
24. return getWage()*getHours();
25. }else{
26. return 40*getWage() + (getHours()-
40)*getWage()*1.5;
27. }
28. }
29. public String toString(){
30. return String.format("Hourly employee : " +
super.toString() + "\nhourly wage" + getWage() +
"\nhours worked : " + getHours());
31. }
32. }
CommissionEmployee.java
1. package Laprak7aPBO;
2. public class CommissionEmployee extends Employee{
3. private double grossSales; //penjualan per minggu
4. private double commissionRate; //komisi
5. public CommissionEmployee(String name, String noKTP,
double sales, double rate){
6. super(name, noKTP);
7. setGrossSales(sales);
8. setCommissionRate(rate);
9. }
10. public void setGrossSales(double sales){
11. grossSales = sales;
12. }
13. public double getGrossSales(){
14. return grossSales;
15. }
16. public void setCommissionRate(double rate){
17. commissionRate = rate;
18. }
19. public double getCommissionRate(){
20. return commissionRate;
21. }
22. public double earnings(){
23. return getCommissionRate()*getGrossSales();
24. }
25. public String toString(){
26. return String.format("Commission employee : " +
super.toString() + "\ngross sales : " + getGrossSales()
+ "\ncommission rate : " + getCommissionRate());
27. }
28. }
BasePlusCommissionEmployee.java
1. package Laprak7aPBO;
2. public class BasePlusCommissionEmployee extends
CommissionEmployee {
3. private double baseSalary; //gaji pokok tiap minggu
4. public BasePlusCommissionEmployee(String name,
String noKTP, double sales, double rate, double salary){
5. super(name, noKTP, sales, rate);
6. setBaseSalary(salary);
7. }
8. public void setBaseSalary(double salary){
9. baseSalary = salary;
10. }
11. public double getBaseSalary(){
12. return baseSalary;
13. }
14. public double earnings(){
15. return getBaseSalary() + super.earnings();
16. }
17. public String toString(){
18. return String.format("Base-Salaried " +
super.toString() + "\nbase salary " + getBaseSalary());
19. }
20. }
Output
Penjelasan
Program tersebut tidak dapat dijalankan karena terdapat kesalahan pada baris ke-4 di
file Main.java. Pada baris tersebut, objek dari kelas Employee dibuat namun karena kelas
Employee merupakan kelas abstrak, maka tidak dapat dibuat objek secara langsung.
Seharusnya objek dibuat menggunakan salah satu subkelas dari Employee seperti
SalariedEmployee, HourlyEmployee, CommissionEmployee atau BasePlusCommission-
Employee.
Pertanyaan
2. Jalankan program dengan main sebagai berikut.
Main.java
1. package Laprak7aPBO;
2. public class Main {
3. public static void main(String[] args) {
4. SalariedEmployee salariedEmployee = new
SalariedEmployee("Daniel", "135", 800.00);
5. HourlyEmployee hourlyEmployee = new
HourlyEmployee("Karina", "234", 16.75, 40);
6. CommissionEmployee commissionEmployee = new
CommissionEmployee("Keanu", "145", 10000, .06);
7. BasePlusCommissionEmployee
basePlusCommissionEmployee = new
BasePlusCommissionEmployee("Bondan", "234", 5000, .04,
300);
8.
9. System.out.println("Employees diproses secara
terpisah : \n");
10. System.out.printf("%s\n%s: $%,.2f\n\n",
salariedEmployee, "pendapatan : ",
salariedEmployee.earnings());
11. System.out.printf("%s\n%s: $%,.2f\n\n",
hourlyEmployee, "pendapatan : ",
hourlyEmployee.earnings());
12. System.out.printf("%s\n%s: $%,.2f\n\n",
commissionEmployee, "pendapatan : ",
commissionEmployee.earnings());
13. System.out.printf("%s\n%s: $%,.2f\n\n",
basePlusCommissionEmployee, "earned : ",
basePlusCommissionEmployee.earnings());
14.
15. Employee[] employees = new Employee[4];
16. employees[0] = salariedEmployee;
17. employees[1] = hourlyEmployee;
18. employees[2] = commissionEmployee;
19. employees[3] = basePlusCommissionEmployee;
20.
21. System.out.println("Employees diproses secara
polimorfisme:\n");
22. for (Employee currentEmployee : employees){
23. System.out.println(currentEmployee);
24. if(currentEmployee instanceof
BasePlusCommissionEmployee){
25. BasePlusCommissionEmployee employee =
(BasePlusCommissionEmployee) currentEmployee;
26.
employee.setBaseSalary(1.10*employee.getBaseSalary());
27. System.out.printf("Gaji pokok setelah
dinaikkan 10%% : $%,.2f\n", employee.getBaseSalary());
28. }
29. System.out.printf("pendapatan : $%,.2f\n\n",
currentEmployee.earnings());
30. }
31. for (int j = 0; j < employees.length; j++) {
32. System.out.printf("Employee %d = %s\n", j,
employees[j].getClass().getName());
33. }
34. }
35. }
Source Code
Output
Penjelasan
Program ini akan menghasilkan output yang menampilkan informasi tentang karyawan
yang diproses terpisah dan juga menggunakan polimorfisme. Bagian pertama output akan
mencetak informasi tentang setiap karyawan secara terpisah, termasuk nama karyawan, nomor
KTP, dan pendapatan yang diperoleh oleh masing-masing karyawan.
Bagian kedua output akan menggunakan polimorfisme untuk mengiterasi objek-objek
karyawan yang berbeda (salariedEmployee, hourlyEmployee, commissionEmployee, dan
basePlusCommissionEmployee) menggunakan variabel currentEmployee. Objek-objek ini
dianggap sebagai objek Employee dalam penggunaan variabel currentEmployee, yang
menunjukkan polimorfisme. Jika objek yang sedang diiterasi adalah objek dari kelas
BasePlusCommissionEmployee, maka gaji pokok dari objek tersebut akan dinaikkan sebesar
10%, dan program akan mencetak informasi tentang nama karyawan, pendapatan yang
diperoleh, dan gaji pokok yang telah dinaikkan.
Terakhir, program akan mencetak informasi tentang tipe data kelas dari setiap objek
karyawan dalam array employees menggunakan metode getClass().getName(). Output ini akan
menampilkan nama kelas dari masing-masing objek, yang akan menjadi bukti bahwa objek-
objek tersebut dianggap sebagai objek Employee dalam penggunaan variabel currentEmployee
meskipun sebenarnya merupakan objek dari kelas yang berbeda-beda.
Pertanyaan
3. Buat objek dari method Employee? Jelaskan hasil dari output program tersebut!
Source Code
Employee2.java
1. package Laprak7aPBO;
2. public class Employee2 extends Employee{
3. private double monthlySalary;
4.
5. public Employee2(String name, String noKTP, double
monthlySalary){
6. super(name, noKTP);
7. this.monthlySalary = monthlySalary;
8. }
9. public double earnings(){
10. return monthlySalary;
11. }
12. }
Main.java
1. package Laprak7aPBO;
2. public class Main {
3. public static void main(String[] args) {
4. Employee2 employee2 = new Employee2("Anisa",
"123", 50000);
5. System.out.println(employee2.toString());
6. System.out.println("Earnings : $" +
employee2.earnings());
7. }
8. }
Output
Penjelasan
Class Employee2 adalah subclass dari abstract class Employee. Dalam class
Employee2, terdapat atribut monthlySalary yang menyimpan gaji bulanan karyawan dan
terdapat method earnings() yang mengembalikan nilai dari gaji bulanan karyawan tersebut.
Pada file Main.java, sebuah objek Employee2 dengan nama employee2 dibuat dan
diinisialisasi dengan nilai parameter "Anisa" untuk nama karyawan, "123" untuk nomor KTP,
dan 50000 untuk gaji bulanan. Kemudian, objek tersebut dicetak ke layar menggunakan
method toString() dari superclass Employee dan gaji bulanannya dicetak menggunakan method
earnings() dari subclass Employee2.
Dalam penjelasan di atas, dijelaskan bahwa class Employee2 merupakan subclass dari
abstract class Employee dan objek Employee2 harus diinstansiasi secara langsung karena class
Employee merupakan class abstrak. Hal ini berarti bahwa tidak mungkin untuk membuat objek
langsung dari class Employee, namun harus membuat objek dari subclassnya.s
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.
Source Code
Employee.java
1. package Laprak7aPBO;
2. import java.time.LocalDate;
3. public abstract class Employee {
4. private String name;
5. private String noKTP;
6. private LocalDate tanggalLahir;
7. public Employee(String name, String noKTP, LocalDate
tanggalLahir){
8. this.name = name;
9. this.noKTP = noKTP;
10. this.tanggalLahir = tanggalLahir;
11. }
12. public LocalDate getTanggalLahir(){
13. return tanggalLahir;
14. }
15. public void setTanggalLahir(LocalDate tanggalLahir){
16. this.tanggalLahir = tanggalLahir;
17. }
18. public String getName(){
19. return name;
20. }
21. public String getNoKTP(){
22. return noKTP;
23. }
24. public String toString(){
25. return String.format(" " + getName() + "\nNo.
KTP: " + getNoKTP());
26. }
27. public abstract double earnings();
28. }
SalariedEmployee.java
1. package Laprak7aPBO;
2. import java.time.LocalDate;
3. public class SalariedEmployee extends Employee {
4. private double weeklySalary;
5. public SalariedEmployee(String name, String noKTP,
double salary, LocalDate tanggalLahir){
6. super(name, noKTP, tanggalLahir);
7. setWeeklySalary(salary);
8. }
9. public void setWeeklySalary(double salary){
10. weeklySalary = salary;
11. }
12. public double getWeeklySalary(){
13. return weeklySalary;
14. }
15. public double earnings(){
16. return getWeeklySalary();
17. }
18. public String toString(){
19. return String.format("Salaried employee : " +
super.toString() + "\nweekly salary : " +
getWeeklySalary());
20. }
21. }
HourlyEmployee.java
1. package Laprak7aPBO;
2. import java.time.LocalDate;
3. public class HourlyEmployee extends Employee {
4. private double wage;
5. private double hours;
6. public HourlyEmployee(String name, String noKTP,
double hourlyWage, double hoursWorked, LocalDate
tanggalLahir){
7. super(name, noKTP, tanggalLahir);
8. setWage(hourlyWage);
9. setHours(hoursWorked);
10. }
11. public void setWage(double hourlyWage){
12. wage = hourlyWage;
13. }
14. public double getWage(){
15. return wage;
16. }
17. public void setHours(double hoursWorked){
18. hours = hoursWorked;
19. }
20. public double getHours(){
21. return hours;
22. }
23. public double earnings(){
24. if(getHours() <= 40){
25. return getWage()*getHours();
26. }else{
27. return 40*getWage() + (getHours()-
40)*getWage()*1.5;
28. }
29. }
30. public String toString(){
31. return String.format("Hourly employee : " +
super.toString() + "\nhourly wage : " + getWage() +
"\nhours worked : " + getHours());
32. }
33. }
CommissionEmployee.java
1. package Laprak7aPBO;
2. import java.time.LocalDate;
3. public class CommissionEmployee extends Employee{
4. private double grossSales;
5. private double commissionRate;
6. public CommissionEmployee(String name, String noKTP,
double sales, double rate, LocalDate tanggalLahir){
7. super(name, noKTP, tanggalLahir);
8. setGrossSales(sales);
9. setCommissionRate(rate);
10. }
11. public void setGrossSales(double sales){
12. grossSales = sales;
13. }
14. public double getGrossSales(){
15. return grossSales;
16. }
17. public void setCommissionRate(double rate){
18. commissionRate = rate;
19. }
20. public double getCommissionRate(){
21. return commissionRate;
22. }
23. public double earnings(){
24. return getCommissionRate()*getGrossSales();
25. }
26. public String toString(){
27. return String.format("Commission employee : " +
super.toString() + "\ngross sales : " + getGrossSales()
+ "\ncommission rate : " + getCommissionRate());
28. }
29. }
BasePlusCommissionEmployee.java
1. package Laprak7aPBO;
2. import java.time.LocalDate;
3. public class BasePlusCommissionEmployee extends
CommissionEmployee {
4. private double baseSalary;
5. public BasePlusCommissionEmployee(String name,
String noKTP, double sales, double rate, double salary,
LocalDate tanggalLahir){
6. super(name, noKTP, sales, rate, tanggalLahir);
7. setBaseSalary(salary);
8. }
9. public void setBaseSalary(double salary){
10. baseSalary = salary;
11. }
12. public double getBaseSalary(){
13. return baseSalary;
14. }
15. public double earnings(){
16. return getBaseSalary() + super.earnings();
17. }
18. public String toString(){
19. return String.format("Base-Salaried " +
super.toString() + "\nbase salary : " +
getBaseSalary());
20. }
21. }
Main.java
1. package Laprak7aPBO;
2. import java.time.LocalDate;
3.
4. public class Main {
5. public static void main(String[] args) {
6. Employee employ = new
Employee("Anisa","178",LocalDate.of(2003,4,2)) {
7. @Override
8. public double earnings() {
9. return 0;
10. }
11. };
12. System.out.println(employ.getName());
13.
14. SalariedEmployee salariedEmployee = new
SalariedEmployee("Daniel",
"135",800.00,LocalDate.of(1998,4,2));
15. HourlyEmployee hourlyEmployee = new
HourlyEmployee("Karina", "234", 16.75, 40,
LocalDate.of(1999,2,1));
16. CommissionEmployee commissionEmployee = new
CommissionEmployee("Keanu", "145", 10000, .06,
LocalDate.of(1999,4,2));
17. BasePlusCommissionEmployee
basePlusCommissionEmployee = new
BasePlusCommissionEmployee("Bondan", "234", 5000, .04,
300, LocalDate.of(1999,4,2));
18.
19. System.out.println("Employees diproses secara
terpisah:\n");
20. System.out.printf("%s\n%s: $%,.2f\n\n",
salariedEmployee, "pendapatan : ",
salariedEmployee.earnings());
21. System.out.printf("%s\n%s: $%,.2f\n\n",
hourlyEmployee, "pendapatan : ",
hourlyEmployee.earnings());
22. System.out.printf("%s\n%s: $%,.2f\n\n",
commissionEmployee, "pendapatan : ",
commissionEmployee.earnings());
23. System.out.printf("%s\n%s: $%,.2f\n\n",
basePlusCommissionEmployee, "earned : ",
basePlusCommissionEmployee.earnings());
24.
25. Employee[] employees = new Employee[4];
26. employees[0] = salariedEmployee;
27. employees[1] = hourlyEmployee;
28. employees[2] = commissionEmployee;
29. employees[3] = basePlusCommissionEmployee;
30.
31. System.out.println("Employees diproses secara
polimorfisme:\n");
32.
33. for (Employee currentEmployee : employees){
34. System.out.println(currentEmployee);
35. if(currentEmployee instanceof
BasePlusCommissionEmployee){
36. BasePlusCommissionEmployee employee =
(BasePlusCommissionEmployee) currentEmployee;
37.
employee.setBaseSalary(1.10*employee.getBaseSalary());
38. System.out.printf("Gaji pokok setelah
dinaikkan 10%% : $%,.2f\n", employee.getBaseSalary());
39. }
40.
41. if
(currentEmployee.getTanggalLahir().getMonth()==LocalDate
.now().getMonth()){
42. System.out.printf("%s:
$%,.2f\n%s:$%,.2f\n\n","Bonus Ulang Tahun", 100.00,
"pendapatan ",(currentEmployee.earnings()+100));
43. } else {
44. System.out.printf("pendapatan:$%,.2f\n\n",
45. currentEmployee.earnings());
46. }
47. }
48. for (int j = 0; j < employees.length; j++) {
49. System.out.printf("Employee %d = %s\n", j,
employees[j].getClass().getName());
50. }
51. System.out.println();
52. }
53. }
Output
Penjelasan
Program di atas mendefinisikan beberapa kelas, yaitu Employee, HourlyEmployee,
SalariedEmployee, CommissionEmployee, dan BasePlusCommissionEmployee. Kelas
Employee berfungsi sebagai superclass atau induk dari kelas-kelas lainnya. Kelas ini memiliki
beberapa variabel instance dan metode-metode, termasuk metode abstrak yang akan
diimplementasikan oleh subclassnya.
Konsep polimorfisme terlihat dalam implementasi kelas-kelas tersebut. Polimorfisme
adalah konsep pemrograman berorientasi objek yang memungkinkan objek dari kelas yang
berbeda untuk merespons permintaan dengan cara yang sama, bahkan jika objek tersebut
memiliki implementasi yang berbeda untuk permintaan tersebut.
Dalam program ini, contoh polimorfisme dapat dilihat pada implementasi metode
earnings di kelas Employee dan diimplementasikan ulang di subclassnya HourlyEmployee,
SalariedEmployee, CommissionEmployee, dan BasePlusCommissionEmployee. Meskipun
implementasinya berbeda di setiap subclass, namun karena metode tersebut berasal dari
superclass, pemanggilannya dapat dilakukan dengan cara yang sama tanpa memerlukan
informasi tambahan tentang jenis objek yang dipanggil.
Dalam program di atas, konsep polimorfisme diimplementasikan melalui penggunaan
metode abstrak yang diwarisi dari kelas abstrak Employee. Setiap kelas turunan dari Employee,
yaitu HourlyEmployee, SalariedEmployee, CommissionEmployee, dan BasePlusCommission-
Employee, memiliki implementasi yang berbeda untuk metode earnings() yang diwarisi dari
Employee, tetapi semua kelas ini dapat diakses melalui referensi yang sama dengan tipe
Employee. Dengan cara ini, dapat menggunakan polimorfisme untuk mempermudah
pemrograman dan meningkatkan fleksibilitas dalam mengembangkan aplikasi. Misalnya, dapat
memanggil metode earnings() dari objek HourlyEmployee, SalariedEmployee,
CommissionEmployee, atau BasePlusCommissionEmployee dengan menggunakan referensi
tipe Employee, dan metode yang sesuai dengan kelas objek akan dipanggil secara otomatis. Ini
memungkinkan untuk mengelola objek dengan cara yang lebih generik dan mudah diubah nanti
jika ada perubahan kebutuhan.
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)
Source Code
BasePlusCommissionEmployee.java
1. package Laprak7aPBO;
2. import java.time.LocalDate;
3. public class BasePlusCommissionEmployee extends
CommissionEmployee {
4. private double baseSalary;
5. public BasePlusCommissionEmployee(String name,
String noKTP, double sales, double rate, double salary,
LocalDate tanggalLahir){
6. super(name, noKTP, sales, rate, tanggalLahir);
7. setBaseSalary(salary);
8. }
9. public void setBaseSalary(double salary){
10. baseSalary = salary;
11. }
12. public double getBaseSalary(){
13. return baseSalary;
14. }
15. public double earnings(){
16. return getBaseSalary() + super.earnings();
17. }
18. public double getGajiBaru(){
19. return getBaseSalary()*super.getGrossSales();
20. }
21. public String toString(){
22. return String.format("Base-Salaried " +
super.toString() + "\nbase salary : " +
getBaseSalary());
23. }
24. }
Main.java
1. package Laprak7aPBO;
2. import java.time.LocalDate;
3. public class Main {
4. public static void main(String[] args) {
5. Employee employ = new
Employee("Anisa","178",LocalDate.of(2003,4,2)) {
6. @Override
7. public double earnings() {
8. return 0;
9. }
10. };
11. System.out.println(employ.getName());
12.
13. SalariedEmployee salariedEmployee = new
SalariedEmployee("Daniel",
"135",800.00,LocalDate.of(1998,4,2));
14. HourlyEmployee hourlyEmployee = new
HourlyEmployee("Karina", "234", 16.75, 40,
LocalDate.of(1999,2,1));
15. CommissionEmployee commissionEmployee = new
CommissionEmployee("Keanu", "145", 10000, .06,
LocalDate.of(1999,4,2));
16. BasePlusCommissionEmployee
basePlusCommissionEmployee = new
BasePlusCommissionEmployee("Bondan", "234",
5000,.04,300,LocalDate.of(1999,4,2));
17. BasePlusCommissionEmployee
basePlusCommissionEmployee2 = new
BasePlusCommissionEmployee("Lala", "201",
4000,.05,200,LocalDate.of(1999,5,1));
18. BasePlusCommissionEmployee
basePlusCommissionEmployee3 = new
BasePlusCommissionEmployee("Bondan", "334",
3000,.04,100,LocalDate.of(1999,12,20));
19.
20. System.out.println("Employees diproses secara
terpisah:\n");
21. System.out.printf("%s\n%s: $%,.2f\n\n",
salariedEmployee, "pendapatan : ",
salariedEmployee.earnings());
22. System.out.printf("%s\n%s: $%,.2f\n\n",
hourlyEmployee, "pendapatan : ",
hourlyEmployee.earnings());
23. System.out.printf("%s\n%s: $%,.2f\n\n",
commissionEmployee, "pendapatan : ",
commissionEmployee.earnings());
24. System.out.printf("%s\n%s: $%,.2f\n\n",
basePlusCommissionEmployee, "earned : ",
basePlusCommissionEmployee.earnings());
25.
26. Employee[] employees = new Employee[6];
27. employees[0] = salariedEmployee;
28. employees[1] = hourlyEmployee;
29. employees[2] = commissionEmployee;
30. employees[3] = basePlusCommissionEmployee;
31. employees[4] = basePlusCommissionEmployee2;
32. employees[5] = basePlusCommissionEmployee3;
33.
34. System.out.println("Employees diproses secara
polimorfisme:\n");
35.
36. for (Employee currentEmployee : employees){
37. System.out.println(currentEmployee);
38. if(currentEmployee instanceof
BasePlusCommissionEmployee){
39. BasePlusCommissionEmployee employee =
(BasePlusCommissionEmployee) currentEmployee;
40.
employee.setBaseSalary(1.10*employee.getBaseSalary());
41. System.out.printf("Gaji pokok setelah
dinaikkan 10%% : $%,.2f\n", employee.getBaseSalary());
42. }
43.
44. if
(currentEmployee.getTanggalLahir().getMonth()==LocalDate
.now().getMonth()){
45. System.out.printf("%s:
$%,.2f\n%s:$%,.2f\n\n","Bonus Ulang Tahun", 100.00,
"pendapatan ",(currentEmployee.earnings()+100));
46. } else {
47. System.out.printf("pendapatan:$%,.2f\n\n",
48. currentEmployee.earnings());
49. }
50. }
51. for (int j = 0; j < employees.length; j++) {
52. System.out.printf("Employee %d = %s\n", j,
employees[j].getClass().getName());
53. }
54. System.out.println();
55. }
56. }
Output
Penjelasan
Perusahaan ingin menambahkan kriteria penggajian karyawan berdasarkan banyaknya
barang yang diproduksi, sehingga perlu melakukan modifikasi pada kelas
BasePlusCommissionEmployee dengan menambahkan variabel dan method baru. Variabel
baru ini menyimpan upah per barang, dan method baru ini dapat menghitung gaji karyawan
berdasarkan banyaknya barang yang diproduksi dan diberi nama getGajiBaru(). Setelah
dilakukan modifikasi, perusahaan harus memperbarui pemanggilan kelas tersebut pada kelas
Main dengan menambahkan parameter upahPerBarang pada constructor kelas
BasePlusCommissionEmployee.
Pertanyaan
b) Implementasi hasil analisis tersebut ke dalam program dan buat kelas uji dengan
minimal 4 objek yang dibentuk.
Penjelasan
Program yang diimplementasikan dapat menghitung gaji karyawan berdasarkan jenis
pekerjaan yang mereka lakukan. Program ini menggunakan empat kelas yang berbeda, yaitu
SalariedEmployee, HourlyEmployee, CommissionEmployee, dan BasePlusCommission-
Employee, untuk membentuk empat objek karyawan yang memiliki informasi yang berbeda
seperti nama, nomor identifikasi, gaji, dan tanggal lahir.
Setiap objek karyawan kemudian digunakan untuk menghitung gaji karyawan
berdasarkan jenis pekerjaan yang mereka lakukan. Misalnya, objek karyawan dengan jenis
pekerjaan SalariedEmployee akan memiliki gaji yang tetap, sedangkan objek karyawan dengan
jenis pekerjaan HourlyEmployee akan menerima gaji yang berbeda tergantung pada jam kerja
mereka.
Program ini dilengkapi dengan kelas uji yang digunakan untuk menguji program dan
memastikan bahwa program berfungsi dengan benar. Dalam kelas uji tersebut, terdapat sebuah
array Employee[] yang berisi 6 objek karyawan yang telah didefinisikan sebelumnya
menggunakan kelas-kelas yang telah disebutkan sebelumnya.
Dengan menggunakan program ini, perusahaan dapat menghitung gaji karyawan
mereka dengan mudah dan akurat. Hal ini dapat membantu perusahaan dalam mengelola
keuangan mereka dengan lebih efektif, karena perusahaan dapat menentukan anggaran gaji
yang lebih akurat dan dapat mengurangi risiko kesalahan penghitungan gaji yang mungkin
terjadi jika dilakukan secara manual.
Tugas Praktikum
Pertanyaan
I. Buatlah sebuah klas abstract Kue yang memiliki attribut dan method sebagai berikut
- nama : String
- harga : double
+ hitungHarga()** : double
+ toString : String (menampilkan nama kue dan harga)
** abstract
b. KueJadi
- jumlah : double
+ hitungHarga() : double
Hitung harga berdasarkan harga x jumlah x 2
Source Code
Kue.java
1. package Laprak7bPBO;
2. public abstract class Kue {
3. private String nama;
4. private double harga;
5. public Kue(String nama, double harga) {
6. this.nama = nama;
7. this.harga = harga;
8. }
9. public void setNama(String nama) {
10. this.nama = nama;
11. }
12. public String getNama() {
13. return nama;
14. }
15. public void setHarga(double harga) {
16. this.harga = harga;
17. }
18. public double getHarga() {
19. return harga;
20. }
21. public abstract double hitungHarga();
22. public String toString() {
23. return "Nama kue : " + getNama() + "\nHarga kue
: Rp" + getHarga();
24. }
25. }
KuePesanan.java
1. package Laprak7bPBO;
2. public class KuePesanan extends Kue {
3. private double berat;
4. public KuePesanan(String nama, double harga, double
berat) {
5. super(nama, harga);
6. this.berat = berat;
7. }
8. public void setBerat(double berat) {
9. this.berat = berat;
10. }
11. public double getBerat() {
12. return berat;
13. }
14. public double hitungHarga() {
15. return getBerat() * getHarga();
16. }
17. public String toString() {
18. return super.toString() + "\nBerat :
" + getBerat() + " ons" + "\nJenis kue : Kue Pesanan"
+ "\nTotal Harga : Rp" + hitungHarga() + "\n";
19. }
20. }
KuePesanan.java
1. package Laprak7bPBO;
2. public class KuePesanan extends Kue {
3. private double berat;
4. public KuePesanan(String nama, double harga, double
berat) {
5. super(nama, harga);
6. this.berat = berat;
7. }
8. public void setBerat(double berat) {
9. this.berat = berat;
10. }
11. public double getBerat() {
12. return berat;
13. }
14. public double hitungHarga() {
15. return getBerat() * getHarga();
16. }
17. public String toString() {
18. return super.toString() + "\nBerat :
" + getBerat() + " ons" + "\nJenis kue : Kue Pesanan"
+ "\nTotal Harga : Rp" + hitungHarga() + "\n";
19. }
20. }
MainKue.java
1. package Laprak7bPBO;
2. public class MainKue {
3. public static void main(String[] args) {
4. Kue[] kue = new Kue[20];
5.
6. int i = 0;
7. int kueLength = kue.length;
8.
9. while (i < kueLength) {
10. int harga;
11. if ((i + 1) % 5 == 0 || (i + 1) % 3 == 0) {
12. harga = 3000;
13. } else {
14. harga = 5000;
15. }
16.
17. Kue kueObj;
18.
19. if ((i + 1) % 5 == 0 || (i + 1) % 3 == 0) {
20. kueObj = new KueJadi("Kue " + (i + 1),
harga, i + 1);
21. } else {
22. kueObj = new KuePesanan("Kue " + (i +
1), harga, i + 1);
23. }
24.
25. kue[i] = kueObj;
26. System.out.println(kue[i]);
27. i++;
28. }
29.
30. int j = 0;
31. double totalHargaSemuaJenis = 0.0;
32. double hargaTerbesar = 0.0;
33. double totalHargaJadi = 0.0;
34. int totalJumlah = 0;
35. double totalHargaPesanan = 0.0;
36. int totalBerat = 0;
37.
38. while (j < kueLength) {
39. totalHargaSemuaJenis +=
kue[j].hitungHarga();
40. hargaTerbesar = Math.max(hargaTerbesar,
kue[j].hitungHarga());
41. if (kue[j] instanceof KueJadi) {
42. totalHargaJadi += kue[j].hitungHarga();
43. totalJumlah += ((KueJadi)
kue[j]).getJumlah();
44. }
45. if (kue[j] instanceof KuePesanan) {
46. totalHargaPesanan +=
kue[j].hitungHarga();
47. totalBerat += ((KuePesanan)
kue[j]).getBerat();
48. }
49. j++;
50. }
51.
52. System.out.println();
53. System.out.println("=============" + " Hasil
pesanan " + "=============");
54. System.out.println("Total harga kue jadi : Rp"
+ totalHargaJadi);
55. System.out.println("Total jumlah kue jadi : " +
totalJumlah + " kotak");
56.
System.out.println("===================================
======");
57. System.out.println("Total harga kue pesanan
: Rp" + totalHargaPesanan);
58. System.out.println("Total berat kue pesanan
: " + totalBerat + " ons");
59.
System.out.println("===================================
======");
60. System.out.println("Total harga semua jenis kue
: Rp" + totalHargaSemuaJenis);
61.
System.out.println("===================================
======");
62. }
63. }
Output
Penjelasan
a) Kelas Kue
Kode program di atas adalah implementasi dari sebuah kelas abstrak bernama Kue. Kelas
ini memiliki dua atribut private, yaitu nama dan harga yang merepresentasikan nama dan harga
dari kue. Kelas Kue memiliki sebuah constructor Kue(String nama, double harga) yang akan
dipanggil ketika sebuah objek Kue dibuat. Constructor ini akan menginisialisasi atribut nama
dan harga dengan nilai yang diberikan pada saat objek dibuat. Selain constructor, kelas Kue
memiliki empat method public lainnya, yaitu:
• setNama(String nama): Method ini digunakan untuk mengubah nilai atribut nama
dengan nilai yang diberikan sebagai argumen.
• getNama(): Method ini digunakan untuk mengambil nilai atribut nama.
• setHarga(double harga): Method ini digunakan untuk mengubah nilai atribut harga
dengan nilai yang diberikan sebagai argumen.
• getHarga(): Method ini digunakan untuk mengambil nilai atribut harga.
Kelas Kue juga memiliki sebuah method abstrak hitungHarga() yang tidak
diimplementasikan di kelas Kue, melainkan akan diimplementasikan di kelas turunan dari Kue.
Method hitungHarga() digunakan untuk menghitung harga dari sebuah kue. Terakhir, kelas
Kue memiliki sebuah method toString() yang mengembalikan sebuah string yang berisi
informasi tentang nama dan harga kue yang direpresentasikan oleh objek Kue. Method ini akan
dipanggil ketika objek Kue di-print ke konsol.
b) Kelas KueJadi
Kode program di atas adalah implementasi dari sebuah kelas KueJadi yang merupakan
turunan dari kelas abstrak Kue. Kelas KueJadi memiliki tiga atribut, yaitu nama, harga, dan
jumlah. Kelas KueJadi memiliki constructor KueJadi(String nama, double harga, double
jumlah) yang akan dipanggil ketika objek KueJadi dibuat. Constructor ini memanggil
constructor dari kelas Kue menggunakan super(nama, harga) untuk menginisialisasi atribut
nama dan harga pada kelas Kue. Atribut jumlah diinisialisasi dengan nilai yang diberikan
sebagai argumen.
Kelas KueJadi memiliki dua method untuk mengakses atribut jumlah, yaitu
setJumlah(double jumlah) dan getJumlah(). Method setJumlah(double jumlah) digunakan
untuk mengubah nilai atribut jumlah, sedangkan getJumlah() digunakan untuk mengambil nilai
atribut jumlah. Kelas KueJadi juga memiliki sebuah method hitungHarga() yang
mengimplementasikan method hitungHarga() yang diwarisi dari kelas Kue. Method
hitungHarga() digunakan untuk menghitung harga dari kue jadi. Harga dihitung dengan
mengalikan harga satuan kue dengan jumlah kotak dan dengan faktor 2. Terakhir, kelas
KueJadi memiliki sebuah method toString() yang mengembalikan sebuah string yang berisi
informasi tentang nama, harga, jumlah kotak, jenis kue, dan total harga dari kue jadi. Method
ini akan dipanggil ketika objek KueJadi di-print ke konsol.
c) Kelas KuePesanan
Kode program tersebut merupakan implementasi dari class KuePesanan yang merupakan
subclass dari class Kue. Class KuePesanan memiliki atribut private berat dengan tipe data
double, dan constructor untuk menginisialisasi objek KuePesanan dengan parameter nama,
harga, dan berat. Terdapat juga setter dan getter untuk mengubah atau mengambil nilai dari
atribut berat.
Method hitungHarga() pada class KuePesanan digunakan untuk menghitung harga dari kue
pesanan dengan cara mengalikan berat kue dengan harga per ons. Method toString() pada class
KuePesanan digunakan untuk mengembalikan informasi lengkap mengenai objek KuePesanan
berupa nama, harga, berat, jenis kue, dan total harga dalam bentuk String.
d) Kelas MainKue
Program di atas menggunakan kelas MainKue untuk menjalankan program. Pada kelas
MainKue, terdapat array kue yang berisi 20 objek dari kelas Kue. Kemudian, program akan
melakukan perulangan sebanyak 20 kali dan akan membuat objek Kue. Jika indeks objek
adalah kelipatan 5 atau kelipatan 3, maka harga objek akan ditetapkan menjadi 3000,
sedangkan jika tidak maka harga objek akan ditetapkan menjadi 5000. Jika indeks objek adalah
kelipatan 5 atau kelipatan 3, maka objek yang dibuat adalah objek dari kelas KueJadi,
sedangkan jika tidak maka objek yang dibuat adalah objek dari kelas KuePesanan. Objek yang
telah dibuat akan ditambahkan ke dalam array kue.
Setelah itu, program akan melakukan perulangan sebanyak 20 kali dan akan menghitung
total harga semua jenis kue, harga terbesar dari semua jenis kue, total harga kue jadi, total
jumlah kue jadi, total harga kue pesanan, dan total berat kue pesanan. Total harga semua jenis
kue dihitung dengan menjumlahkan semua harga kue, harga terbesar dihitung dengan mencari
harga tertinggi dari semua kue, total harga kue jadi dihitung dengan menjumlahkan harga kue
jadi saja, total jumlah kue jadi dihitung dengan menjumlahkan jumlah kue jadi saja, total harga
kue pesanan dihitung dengan menjumlahkan harga kue pesanan saja, dan total berat kue
pesanan dihitung dengan menjumlahkan berat kue pesanan saja. Setelah perulangan selesai,
program akan mencetak hasil perhitungan tersebut.