PEMROGRAMAN LANJUT - hermantolle.com · OverridingMethod dalam Inheritans •“Anak kadang sedikit...

52
PEMROGRAMAN LANJUT Fakultas Ilmu Komputer, Universitas Brawijaya KONSEP OOP: PEWARISAN / INHERITANCE Dr. Eng. Herman Tolle Sistem Informasi FILKOM UB Semester Genap 2016/2017

Transcript of PEMROGRAMAN LANJUT - hermantolle.com · OverridingMethod dalam Inheritans •“Anak kadang sedikit...

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.

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 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

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 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, SUPER & KONSTRUKTOR

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, FINAL METHOD

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); } }

52

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 { ... }

Equivalent public class Circle extends Object { ... }