PEMROGRAMAN LANJUT
Fakultas Ilmu Komputer, Universitas Brawijaya
KONSEP OOP:
PEWARISAN / INHERITANCE
Dr. Eng. Herman Tolle
Sistem Informasi FILKOM UB
Semester Genap 2016/2017
Outline Keyword
• Inheritance
• Superclass
• Subclass
• Extends
• Reusability
• Override
• This & super
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
subClass
superClass
<< extends >>
• 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 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 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.
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 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
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
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 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.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 = 1; //
sukses
buat.varB = 3; //
sukses
buat.varC = 5; //
sukses
buat.varD = 7; //
sukses
}
}
//program 9.3b. Nama file:Saja.java
package 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.java
import 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.java
import 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 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
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 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:
Contoh this & super
class 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; }
@override
public int hitungLuas()
{
int Luas = (2 * super.hitungLuas()) +
(2 * getPanjang()* tinggi) +
(2 * getLebar() * tinggi);
return Luas;
}
@override
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
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 super
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 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); } } class Person { public Person() {
System.out.println("(1) Person's no-arg constructor is invoked"); }
}
1. Start from the
main method
36
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); } } class Person { public Person() {
System.out.println("(1) Person's no-arg constructor is invoked"); }
}
2. Invoke Faculty
constructor
37
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); } } class Person { public Person() {
System.out.println("(1) Person's no-arg constructor is invoked"); }
}
3. Invoke Employee’s
no-arg constructor
38
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); } } class Person { public Person() {
System.out.println("(1) Person's no-arg constructor is invoked"); }
}
4. Invoke Employee(String)
constructor
39
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); } } class Person { public Person() {
System.out.println("(1) Person's no-arg constructor is invoked"); }
}
5. Invoke Person() constructor
40
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); } } class Person { public Person() {
System.out.println("(1) Person's no-arg constructor is invoked"); }
}
6. Execute println
41
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); } } class Person { public Person() {
System.out.println("(1) Person's no-arg constructor is invoked"); }
}
7. Execute println
42
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); } } class Person { public Person() {
System.out.println("(1) Person's no-arg constructor is invoked"); }
}
8. Execute println
43
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); } } class Person { public Person() {
System.out.println("(1) Person's no-arg constructor is invoked"); }
}
9. Execute println
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
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:
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 )
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
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