pemrograman lanjut - hermantolle.com · overridingmethod dalam inheritans •“anak kadang sedikit...
TRANSCRIPT
PEMROGRAMAN LANJUT
Fakultas Ilmu Komputer, Universitas Brawijaya
KONSEP OOP:PEWARISAN / INHERITANCE
Dr.Eng.HermanTolle
Sistem Informasi FILKOM UBSemester Genap 2016/2017
Outline Keyword
• Inheritance• Superclass• Subclass• Extends• Reusability• Override• This & super• Final Class, Final Method
Inheritance (Pewarisan)
• Pewarisan suatu class pada class lainnya• Seorang ayah dapat mewariskan beberapa sifat yang
sama pada anak-anaknya, Namun setiap anak dapatmemiliki sifat yang berbeda dan tidak dimiliki olehayah maupun saudara-saudaranya
• Suatu class dapat mewariskan class member (atribut dan method) kepada class lain, konsep tersebutdikenal dengan istilah inheritance
Inheritance (Pewarisan)
• Inheritance | Inheritans | Pewarisan• Suatu class dapat mewariskan atribut dan method
kepada class lain (subclass), serta membentuk class hierarchy
• Penting untuk Reusability• Java Keyword:
extends
Syntax Inheritance
class subClass extends superClass {
// definisi class
}
• subClass à nama class turunan yang kitabuat, merupakan sub-class dari sebuah class lain
• superClass à class yang kita ingin wariskansifat-sifatnya ke class baru yang kita buat
Ilustrasi Inheritance
subClasssuperClass<< extends >>
• Hasil dari inheritance adalah class member padasuperClass akan diwariskan kepada subClass
• Sehingga subClass juga memiliki class member yang sama dengan superclass
• Merupakan hubungan Generaliasasi (is-A) (tanda panah dengan segitiga full)
Contoh inheritanceclass Kendaraan{boolean mesin;int kapasitas;
void jalan(){}
void berhenti(){}
}
class MobilBeraksi{public static void main(String args[]){Mobil sedan = new Mobil();sedan.mesin = true;sedan.kapasitas = 5;sedan.Tahun = 2014;sedan.jalan();
}}
class Mobil extends Kendaraan{
int Tahun;
String JenisMobil;
String Produsen;
}
• Class Mobil merupakan turunan dari class Kendaraan, sehingga class member dari Kendaraanotomatis diwariskan kepada Mobil
• Class Mobil tidak perlu mendefinisikan ulangseluruh class member tersebut, cukup menambahkan class member baru yg hanya ada pada Class Mobil saja.
class Kendaraan
mesin
kapasitas
jalan( )
berhenti( )
<< extends >>
class Mobil
mesin
kapasitas
jalan( )
berhenti( )
Manfaat Inheritance
• Pewarisan Sifat: Superclass ke Subclass• Menyusun Hirarki • Reusability: (Penggunaan kembali code) kode
method bisa ditulis sekali saja dan dapat digunakanoleh semua subclass.
• Object Complexity: Subclass hanya perlumengimplementasikan perbedaannya sendiri daninduknya. Objek yang kompleks dapat dibangun dari kumpulan objek lain yang lebih sederhana
Semua Class adalah turunan Kelas Object
• Dalam Java, semua class, termasuk class yang membangunJava API, adalah subclassesdari superclass Object.
LATIHAN
• Buat contoh kelas induk dan kelas turunan:– Person à Student– MahasiswaUB à MahasiswaFilkom
Access level pada class member
Modifier Class Package Sub-class Class lain
public Ya Ya Ya Ya
protected Ya Ya Ya Tidaktanpa modifier Ya Ya Tidak Tidak
private Ya Tidak Tidak Tidak
Access level pada class member
• Class member yang memiliki modifier public dapat diaksesoleh semua class dimanapun class itu berada
• Class member yang memiliki modifier protected: dapatdiakses hanya oleh class-class yang berada dalam package yang sama dan sub-class pada package yang lain
• Class member tanpa modifier hanya dapat diakses olehclass-class dalam package yang sama
• Class member yang memiliki modifier private hanya dapatdiakses dari dalam class tersebut saja
Ilustrasi kode program
package prog
class Saja
class Coba
varA
varB
varC
varD
objek akses
varA
varB
varC
class Lagi
objek baca
varA
class Turunan
objek sifat
varA
varB
<< extends >>
<< import >>
//program 9.3a. Nama file:Coba.javapackage prog;
public class Coba{public int varA;protected int varB;int varC;private int varD;
public static void main(String args[]){Coba buat = new Coba();
buat.varA = 1; //suksesbuat.varB = 3; //suksesbuat.varC = 5; //suksesbuat.varD = 7; //sukses
}}
//program 9.3b. Nama file:Saja.javapackage prog;
class Saja{public static void main(String args[]){Coba akses = new Coba();
akses.varA = 1; //akses.varB = 3; //akses.varC = 5; //akses.varD = 7; //
}}
//program 9.3c. Nama file:Turunan.javaimport prog.Coba;
class Turunan extends Coba{public static void main(String args[]){Turunan sifat = new Turunan();
sifat.varA = 1; //sifat.varB = 3; //sifat.varC = 5; //sifat.varD = 7; //
}}
//program 9.3d. Nama file:Lagi.javaimport prog.Coba;
class Lagi{public static void main(String args[]){Coba baca = new Coba();
baca.varA = 1; //baca.varB = 3; //baca.varC = 5; //baca.varD = 7; //
}}
• Class Saja, Turunan, dan Lagi tidak dapatmengakses varD karena varD bersifat privatesehingga hanya bisa diakses dari dalam class Coba
• Class Turunan dan Lagi tidak dapat mengaksesvarC karena varC bersifat package-private sehinggahanya bisa diakses dari dalam package prog
• Class Lagi tidak dapat mengakses varB karena varBbersifat protected sehingga hanya bisa diakses daridalam package prog atau dari class yang merupakan sub-class Coba
Overriding Method dalam Inheritans
• “Anak kadang sedikit berbeda dari bapaknya”• Overriding adalah membuat method yang menggantikan
method induknya. • Jadi method yang sudah diturunkan dari kelas induk kita
(superclass), kita buat lagi dengan nama yang sama tapi dengan isi yang berbeda pada kelas turunan (subclass).
• Dalam java dikenal dengan penambahan kata kunci @override .
• Teknik ini digunakan untuk mengubah definisi dari functionagar lebih spesifik dan sesuai dengan sub-class yang dirancang
// program 9.4. contoh overriding
class Kendaraan{
boolean mesin;
int kapasitas;
void jalan(){
System.out.println("kendaraan dijalankan");
}
void berhenti(){}
}
class Mobil extends Kendaraan{
@Overridevoid jalan(){
System.out.println("masukkan kunci");
System.out.println("putar kunci");
System.out.println("injak gas");
}
public Class MobilBeraksi
{
public static void main(String args[]){
Mobil sedan = new Mobil();
sedan.jalan();
}
}
• Kelas Mobil dan Kelas Kendaraan sama-sama memiliki fungsi jalan()
• Fungsi jalan() pada kelas Mobile meng-override fungsi jalan()dari kelas induknya
• Pemanggilan fungsi jalan() dari objek Mobil akan mengeksekusi fungsi jalan() dari kelas Mobil (subclass) bukan fungsi jalan yang ada pada kelas Kendaraan (superclass)
this vs super
• Keyword this mengacu pada atribut danmethod yang terdapat pada class itu sendiriContoh:
this.cetak()
• Keyword super mengacu pada atribut danmethod yang terdapat pada class parentnya.Contoh:
super.cetak()
Contoh this & superclass Parent{public int x = 5;
}
class Child extends Parent {public int x = 10;
public void Info(int x) {System.out.println("Nilai x sebagai parameter = " + x);System.out.println("Data member x di class Child = " + this.x);System.out.println("Data member x di class Parent = " + super.x);
}}
public class NilaiX {public static void main(String[] args) {Child tes = new Child();tes.Info(20); // Tuliskan output dari perintah ini!}
}
Latihan
• Buat 2 buah kelas berikut• Kelas Induk: Persegi
– Atribut: panjang, lebar– Method: HitungLuas, set-get
• Kelas Turunan: Kotak– Atribut: tinggi– Method: HitungLuas (override), HitungVolume
• Gunakan kata kunci Super utk memanggil konstruktor dan fungsi yang ada di di kelas induk
class Persegi{
private int panjang;private int lebar;
public Persegi(int P, int L){ this.panjang = P;this.lebar = L;} public int hitungLuas() {return panjang*lebar; }
public void CetakLuas(){ System.out.printf(“Persegi dengan panjang = %d, dan Lebar =
%d, Luas = %d”, panjang, lebar, this.hitungLuas()); }
}
public int getPanjang(){
return panjang; }
public int getLebar(){
return lebar; }
class Kotak extends Persegi{
private int tinggi;public Kotak(int P, int L, int T) { super(P, L);this.tinggi = T;}
public int hitungVolume(){ return super.hitungLuas()*tinggi; }
@overridepublic int hitungLuas()
{int Luas = (2 * super.hitungLuas()) +
(2 * getPanjang()* tinggi) + (2 * getLebar() * tinggi);
return Luas; }
@overridepublic void CetakLuas() {}
class KotakBeraksi{
public static void main(String[] arg){
Persegi Box1 = new Persegi(5, 10);Box1.CetakLuas(); Kotak Box2 = new Kotak(5, 10, 8);Box2.CetakLuas();
} }
Konstruktor dalam Inheritance
• Subclass mewarisi semua member (fields, methods, dan nested classes) dari superclass-nya.
• Konstruktor tidak termasuk member class, jadikonstruktor tidak diturunkan ke subclass,
• Tetapi, konstruktor dari superclass dapat dipanggildari subclass dengan kata kunci super.
• Konstruktor superclass Otomatis dipanggilsebelum kode pada konstruktor subclass dijalankan
33
CAUTION
You must use the keyword super to call the superclass constructor. Invoking a superclass constructor’s name in a subclass causes a syntax error. Java requires that the statement that uses the keyword superappear first in the constructor.
34
Constructor Chaining
public class Faculty extends Employee {public static void main(String[] args) {new Faculty();
}
public Faculty() {System.out.println("(4) Faculty's no-arg constructor is invoked");
}}
class Employee extends Person {public Employee() {this("(2) Invoke Employee’s overloaded constructor");System.out.println("(3) Employee's no-arg constructor is invoked");
}
public Employee(String s) {System.out.println(s);
}}
class Person {public Person() {System.out.println("(1) Person's no-arg constructor is invoked");
}}
Constructing an instance of a class invokes all the superclasses’ constructors along the inheritance chain. This is known as constructor chaining.
35
Trace Executionpublic class Faculty extends Employee {public static void main(String[] args) {new Faculty();
}
public Faculty() {System.out.println("(4) Faculty's no-arg constructor is invoked");
}}
class Employee extends Person {public Employee() {this("(2) Invoke Employee’s overloaded constructor");System.out.println("(3) Employee's no-arg constructor is invoked");
}
public Employee(String s) {System.out.println(s);
}}
class Person {public Person() {System.out.println("(1) Person's no-arg constructor is invoked");
}}
1. Start from the main method
animation
36
Trace Executionpublic class Faculty extends Employee {public static void main(String[] args) {new Faculty();
}
public Faculty() {System.out.println("(4) Faculty's no-arg constructor is invoked");
}}
class Employee extends Person {public Employee() {this("(2) Invoke Employee’s overloaded constructor");System.out.println("(3) Employee's no-arg constructor is invoked");
}
public Employee(String s) {System.out.println(s);
}}
class Person {public Person() {System.out.println("(1) Person's no-arg constructor is invoked");
}}
2. Invoke Faculty constructor
animation
37
Trace Executionpublic class Faculty extends Employee {public static void main(String[] args) {new Faculty();
}
public Faculty() {System.out.println("(4) Faculty's no-arg constructor is invoked");
}}
class Employee extends Person {public Employee() {this("(2) Invoke Employee’s overloaded constructor");System.out.println("(3) Employee's no-arg constructor is invoked");
}
public Employee(String s) {System.out.println(s);
}}
class Person {public Person() {System.out.println("(1) Person's no-arg constructor is invoked");
}}
3. Invoke Employee’s no-arg constructor
animation
38
Trace Executionpublic class Faculty extends Employee {public static void main(String[] args) {new Faculty();
}
public Faculty() {System.out.println("(4) Faculty's no-arg constructor is invoked");
}}
class Employee extends Person {public Employee() {this("(2) Invoke Employee’s overloaded constructor");System.out.println("(3) Employee's no-arg constructor is invoked");
}
public Employee(String s) {System.out.println(s);
}}
class Person {public Person() {System.out.println("(1) Person's no-arg constructor is invoked");
}}
4. Invoke Employee(String) constructor
animation
39
Trace Executionpublic class Faculty extends Employee {public static void main(String[] args) {new Faculty();
}
public Faculty() {System.out.println("(4) Faculty's no-arg constructor is invoked");
}}
class Employee extends Person {public Employee() {this("(2) Invoke Employee’s overloaded constructor");System.out.println("(3) Employee's no-arg constructor is invoked");
}
public Employee(String s) {System.out.println(s);
}}
class Person {public Person() {System.out.println("(1) Person's no-arg constructor is invoked");
}}
5. Invoke Person() constructor
animation
40
Trace Executionpublic class Faculty extends Employee {public static void main(String[] args) {new Faculty();
}
public Faculty() {System.out.println("(4) Faculty's no-arg constructor is invoked");
}}
class Employee extends Person {public Employee() {this("(2) Invoke Employee’s overloaded constructor");System.out.println("(3) Employee's no-arg constructor is invoked");
}
public Employee(String s) {System.out.println(s);
}}
class Person {public Person() {System.out.println("(1) Person's no-arg constructor is invoked");
}}
6. Execute println
animation
41
Trace Executionpublic class Faculty extends Employee {public static void main(String[] args) {new Faculty();
}
public Faculty() {System.out.println("(4) Faculty's no-arg constructor is invoked");
}}
class Employee extends Person {public Employee() {this("(2) Invoke Employee’s overloaded constructor");System.out.println("(3) Employee's no-arg constructor is invoked");
}
public Employee(String s) {System.out.println(s);
}}
class Person {public Person() {System.out.println("(1) Person's no-arg constructor is invoked");
}}
7. Execute println
animation
42
Trace Executionpublic class Faculty extends Employee {public static void main(String[] args) {new Faculty();
}
public Faculty() {System.out.println("(4) Faculty's no-arg constructor is invoked");
}}
class Employee extends Person {public Employee() {this("(2) Invoke Employee’s overloaded constructor");System.out.println("(3) Employee's no-arg constructor is invoked");
}
public Employee(String s) {System.out.println(s);
}}
class Person {public Person() {System.out.println("(1) Person's no-arg constructor is invoked");
}}
8. Execute println
animation
43
Trace Executionpublic class Faculty extends Employee {public static void main(String[] args) {new Faculty();
}
public Faculty() {System.out.println("(4) Faculty's no-arg constructor is invoked");
}}
class Employee extends Person {public Employee() {this("(2) Invoke Employee’s overloaded constructor");System.out.println("(3) Employee's no-arg constructor is invoked");
}
public Employee(String s) {System.out.println(s);
}}
class Person {public Person() {System.out.println("(1) Person's no-arg constructor is invoked");
}}
9. Execute println
animation
Final Class
• Class yang tidak boleh di extends lagi dapatdibuat dengan menambahkan keyword finalContoh:
public final class KelasFinal {...}
• Contoh final class dalam java package:– java.lang.System– java.lang.String
Final Method
• Method yang tidak dapat di override olehsub classContoh deklarasi:
public final void contohFinalMethod() {...}
Contoh Final Method
class ChessAlgorithm {enum ChessPlayer { WHITE, BLACK }...final ChessPlayer getFirstPlayer() {
return ChessPlayer.WHITE;}...
}
Final Variabel
• Variabel Final adalah variabel yang hanyadapat diinisialisasi satu kali saja.Contoh deklarasi:
public final double nilaiEuler;
Relasi Antar Kelas
• Suatu class dapat dibangun dari ataupun memiliki keterkaitan dengan kelas yang lain
• Secara umum relasi antar class adalah:– Depedensi (“uses-a”); (relasi menggunakan)– Agregasi (“has-a”); (relasi mempunyai )– Inheritance (“is-a”); (relasi adalah)
IS-A
• IS-A is a way of saying : This object is a type of that object.
public class Animal {}public class Mammal extends Animal{}public class Reptile extends Animal{}public class Dog extends Mammal{}
Now, if we consider the IS-A relationship, we can say −• Mammal IS-A Animal• Reptile IS-A Animal• Dog IS-A Mammal• Hence : Dog IS-A Animal as well
51
Overriding vs. Overloading
public class Test { publ ic stat ic void main( String[ ] args) { A a = new A(); a. p(10); a. p(10.0) ; } } class B { publ ic void p(doub le i) { Sy stem.ou t.print ln(i * 2); } } class A exten ds B { // T his met hod ove rrides the me thod in B publ ic void p(doub le i) { Sy stem.ou t.print ln(i); } }
public class T est { publi c stati c void main(St ring[] args) { A a = new A(); a.p (10); a.p (10.0); } } class B { publi c void p(doubl e i) { Sys tem.out .printl n(i * 2 ); } } class A extend s B { // Th is meth od over loads t he meth od in B publi c void p(int i ) { Sys tem.out .printl n(i); } }