OOP Java 06 Polymorphism
Materi yang akan dibahas : Overriding methods Polymorphism Heterogeneous Array Polymorphic arguments Operator instance of Type Casting objek
Overriding Methods (1) Overriding : memodifikasi kelakuan (behavior) dari kelas induk (parent class). Jika method pada kelas anak memiliki nama, return type & argument yg sama dengan method pd kelas induknya maka method tsb meng-override method induknya.
Overriding Methods (2) Contoh Penggunaan //Overriding methods : Employee.java public class Employee { protected String name = “Rudy”; protected double salary = 1000000; public String getDetails() { return "Name " + name + "\n" + "Salary : " + salary; } //Overriding methods : Manager.java public class Manager extends Employee { protected String department = “IT”; private String getDetails() { //illegal return "Name " + name + “\n“ + "Salary : " + salary + “\n” + "Manager of : " + department; getDetails() di manager meng-override getDetails() di Employee Method peng-override tidak bisa lebih terbatas aksesnya daripada method yang di override //Overriding methods : TestOverride.java public class TestOverride { public static void main(String[] args) { Employee p1 = new Employee(); Manager p2 = new Manager(); System.out.println("p1 : " + p1.getDetails()); System.out.println("p2 : " + p2.getDetails()); }
Overriding Methods (3) Memanggil method yg di override //Overriding methods : Employee.java public class Employee { protected String name; protected double salary; public String getDetails() { return "Name " + name + "\n" + "Salary : " + salary; } //Overriding methods : Manager.java public class Manager extends Employee { protected String department; return super.getDetails() + “\n” + "Manager of : " + department; super.getDetails() memanggil method getDetails() di Employee super digunakan utk mengakses member dari kelas induk
Polymorphism (1) Sebuah objek hanya bisa mempunyai satu bentuk, yaitu yg diberikan waktu objek dibuat. Tetapi variabel bersifat polymorphic karena dapat menunjuk ke objek2 dengan bentuk yg berbeda2. Kita dapat menunjuk (refer) ke sebuah objek dengan menggunakan variabel yg bertipe kelas induknya : Employee e = new Manager(); //legal Tetapi hanya dapat mengakses member dari objek yang juga merupakan member dari Employee, member yg hanya ada di Manager menjadi tersembunyi e.department = “accounting”; //illegal
e.getDetails(); Polymorphism (2) Aspek lain dari polymorphism adalah virtual method invocation. Apa yg terjadi ketika kita melakukan : Employee e = new Manager(); e.getDetails(); Statement e.getDetails(); pada saat kompilasi dicek terhadap kelas Employee, tetapi pada saat dijalankan kita akan mendapatkan behavior dari objek yg di refer, yaitu dari kelas Manager.
Polymorphism (3) //Polymorphism : TestPolymorph.java public class TestPolymorph { public static void main(String[ ] args) { Employee p1 = new Employee(); Employee p2 = new Manager(); Manager p3 = new Employee(); System.out.println("p1 : " + p1.getDetails()); System.out.println("p2 : " + p2.getDetails()); System.out.println("p3 : " + p3.getDetails()); }
Heterogeneous Array (1) Objek-objek dari kelas yg sama dapat disimpan didalam array. Ini disebut homogeneous array, contohnya sbb : Mahasiswa[] mhs = new Mahasiswa[3]; mhs[0] = new Mahasiswa(“0572123”, “Anton”); mhs[1] = new Mahasiswa(“0572070”, “Renny”); mhs[2] = new Mahasiswa(“0572237”, “Benny”);
Heterogeneous Array (2) Semua kelas di java adalah turunan dari kelas Object. Hal ini menyebabkan dapat dibuatnya array dari objek2 yg berasal dari kelas yg berbeda2, sehingga disebut heterogenous array. Employee[] staff = new Employee[3]; staff[0] = new Employee(); staff[1] = new Manager(); staff[2] = new Engineer();
Polymorphic Arguments (1) Dengan menggunakan Polymorphic Arguments, kita dapat membuat method yang dapat menerima generic object (parent objek) dan tetap dapat bekerja dengan baik menggunakan objek2 dari kelas turunannya :
Polymorphic Arguments (2) //Polymorphic Arguments : Hitung.java public class Hitung { public double hitungSalary(Employee e) { return e.salary; } //Polymorphic Arguments : TestPolyArg.java public class TestPolyArg { public static void main(String[ ] args) { Employee p1 = new Employee(); Manager p2 = new Manager(); Hitung p3 = new Hitung(); System.out.println("Salary p1 : " + p3.hitungSalary(p1)); System.out.println("Salary p2 : " + p3.hitungSalary(p2));
Operator instanceof (1) Untuk mengetahui objek yang sebenarnya, dapat digunakan operator instanceof : //Polymorphic Arguments : Hitung2.java public class Hitung2 { public double hitungSalary(Employee e) { if (e instanceof Manager) { return e.salary*2; } else { return e.salary; }
Typecasting (1) Casting objek dapat dilakukan dengan cara : Emloyee e = new Manager(); Manager m; String s; if (e instanceof Manager) { s = ((Manager) e). department; //atau m = (Manager) e; s = m.department; }
Typecasting (2) Untuk mengetahui objek yang sebenarnya, dapat digunakan operator instanceof : //Casting Object : Hitung3.java public class Hitung3 { public double hitungSalary(Employee e) { if (e instanceof Manager) { System.out.println(e.department); //error System.out.println(((Manager)e).department); //ok return e.salary*2; } else { return e.salary; }