PEMROGRAMAN LANJUT Sistem Informasi FILKOM UB Semester Genap 2016/2017
KONSEP OOP: PEWARISAN / INHERITANCE Dr. Eng. Herman Tolle Fakultas Ilmu Komputer, Universitas Brawijaya
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 dapat memiliki sifat yang berbeda dan tidak dimiliki oleh ayah maupun saudara-saudaranya • Suatu class dapat mewariskan class member (atribut dan method) kepada class lain, konsep tersebut dikenal 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 kita buat, merupakan sub-class dari sebuah class lain • superClass à class yang kita ingin wariskan sifat-sifatnya ke class baru yang kita buat
Ilustrasi Inheritance superClass
<< extends >>
subClass
• Hasil dari inheritance adalah class member pada superClass 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 inheritance class Kendaraan{ boolean mesin; int kapasitas; void jalan(){ } void berhenti(){ }
class Mobil extends Kendaraan { int Tahun; String JenisMobil; String Produsen; }
} class MobilBeraksi{ public static void main(String args[]){ Mobil sedan = new Mobil(); sedan.mesin = true; sedan.kapasitas = 5; sedan.Tahun = 2014; sedan.jalan(); } }
class Kendaraan
class Mobil
mesin
mesin
kapasitas
kapasitas
jalan( ) berhenti( )
<< extends >>
jalan( ) berhenti( )
• Class Mobil merupakan turunan dari class Kendaraan, sehingga class member dari Kendaraan otomatis diwariskan kepada Mobil • Class Mobil tidak perlu mendefinisikan ulang seluruh class member tersebut, cukup menambahkan class member baru yg hanya ada pada Class Mobil saja.
Manfaat Inheritance • Pewarisan Sifat: Superclass ke Subclass • Menyusun Hirarki • Reusability: (Penggunaan kembali code) kode method bisa ditulis sekali saja dan dapat digunakan oleh semua subclass. • Object Complexity: Subclass hanya perlu mengimplementasikan perbedaannya sendiri dan induknya. 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 membangun Java API, adalah subclassesdari superclass Object.
Tipe Inheritans
• Catatan: java hanya mengenal single superclass tidak ada multiple superclass
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
Tidak
tanpa modifier
Ya
Ya
Tidak
Tidak
private
Ya
Tidak
Tidak
Tidak
Access level pada class member • Class member yang memiliki modifier public dapat diakses oleh semua class dimanapun class itu berada • Class member yang memiliki modifier protected: dapat diakses hanya oleh class-class yang berada dalam package yang sama dan sub-class pada package yang lain • Class member tanpa modifier hanya dapat diakses oleh class-class dalam package yang sama • Class member yang memiliki modifier private hanya dapat diakses dari dalam class tersebut saja
Ilustrasi kode program package prog class Lagi
class Coba
<< import >> varA varB varC
varA << extends >>
varD
class Saja
class Turunan objek sifat
objek akses varA
varA
varB
varB
varC
objek baca
//program 9.3a. Nama file:Coba.java package 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 buat.varB buat.varC buat.varD } }
= = = =
1; 3; 5; 7;
//sukses //sukses //sukses //sukses
//program 9.3b. Nama file:Saja.java package prog; class Saja{ public static void main(String args[]){ Coba akses = new Coba(); akses.varA akses.varB akses.varC akses.varD } }
= = = =
1; 3; 5; 7;
// // // //
//program 9.3c. Nama file:Turunan.java import prog.Coba; class Turunan extends Coba{ public static void main(String args[]){ Turunan sifat = new Turunan(); sifat.varA sifat.varB sifat.varC sifat.varD } }
= = = =
1; 3; 5; 7;
// // // //
//program 9.3d. Nama file:Lagi.java import prog.Coba; class Lagi{ public static void main(String args[]){ Coba baca = new Coba(); baca.varA baca.varB baca.varC baca.varD } }
= = = =
1; 3; 5; 7;
// // // //
• Class Saja, Turunan, dan Lagi tidak dapat mengakses varD karena varD bersifat private sehingga hanya bisa diakses dari dalam class Coba • Class Turunan dan Lagi tidak dapat mengakses varC karena varC bersifat package-private sehingga hanya bisa diakses dari dalam package prog • Class Lagi tidak dapat mengakses varB karena varB bersifat protected sehingga hanya bisa diakses dari dalam package prog atau dari class yang merupakan sub-class Coba
OVERLOADING METHOD IN INHERITANCE
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 function agar 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{ @Override void 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, SUPER & KONSTRUKTOR
this vs super • Keyword this mengacu pada atribut dan method yang terdapat pada class itu sendiri Contoh: this.cetak()
• Keyword super mengacu pada atribut dan method yang terdapat pada class parentnya. Contoh: super.cetak()
class Parent{ public int x = 5; }
Contoh this & super
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 int getPanjang() { return panjang; } public int getLebar() { return lebar; }
public void CetakLuas() { System.out.printf(“Persegi dengan panjang = %d, dan Lebar = %d, Luas = %d”, panjang, lebar, this.hitungLuas()); } }
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;
}
@override public int hitungLuas() { int Luas = (2 * super.hitungLuas()) + (2 * getPanjang()* tinggi) + (2 * getLebar() * tinggi); return Luas; } @override public 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, jadi konstruktor tidak diturunkan ke subclass, • Tetapi, konstruktor dari superclass dapat dipanggil dari subclass dengan kata kunci super. • Konstruktor superclass Otomatis dipanggil sebelum kode pada konstruktor subclass dijalankan
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 super appear first in the constructor.
33
Constructor Chaining Constructing an instance of a class invokes all the superclasses’ constructors along the inheritance chain. This is known as 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"); } 34 }
animation
Trace Execution
public class Faculty extends Employee { public static void main(String[] args) { new Faculty(); }
1. Start from the main method
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"); } } 35
animation
Trace Execution
public class Faculty extends Employee { public static void main(String[] args) { new Faculty(); }
2. Invoke Faculty constructor
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"); } } 36
animation
Trace Execution
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"); }
3. Invoke Employee’s noarg constructor
}
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"); } } 37
animation
Trace Execution
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"); } }
4. Invoke Employee(String) constructor
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"); } } 38
animation
Trace Execution
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); } }
5. Invoke Person() constructor
class Person { public Person() { System.out.println("(1) Person's no-arg constructor is invoked"); } } 39
animation
Trace Execution
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); } }
6. Execute println
class Person { public Person() { System.out.println("(1) Person's no-arg constructor is invoked"); } } 40
animation
Trace Execution
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); } }
7. Execute println
class Person { public Person() { System.out.println("(1) Person's no-arg constructor is invoked"); } } 41
animation
Trace Execution
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); } }
8. Execute println
class Person { public Person() { System.out.println("(1) Person's no-arg constructor is invoked"); } } 42
animation
Trace Execution
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"); } }
9. Execute println
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"); } } 43
FINAL CLASS, FINAL METHOD
Final Class • Class yang tidak boleh di extends lagi dapat dibuat dengan menambahkan keyword final Contoh: public final class KelasFinal {...}
• Contoh final class dalam java package: – java.lang.System – java.lang.String
Final Method • Method yang tidak dapat di override oleh sub class Contoh 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 hanya dapat 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 public public public
class class class class
Animal {} Mammal extends Animal{} Reptile extends Animal{} 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
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) ; } }
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 { publ ic void p(doub le i) { Sy stem.ou t.print ln(i * 2); } }
class B { publi c void p(doubl e i) { Sys tem.out .printl n(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); } }
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); } }
51
The Object Class and Its Methods Every class in Java is descended from the java.lang.Object class. If no inheritance is specified when a class is defined, the superclass of the class is Object. public class Circle { ... }
public class Circle extends Object { ... }
Equivalent
52