Anda di halaman 1dari 58

INHERITANCE

Pelatihan Java 2 Mei 2015


Fakultas Teknologi Informasi
Program Studi Teknik Informatika
Herika Hayurani herika.hayurani@yarsi.ac.id,
Nova Eka Diana nova.diana@yarsi.ac.id,
Nurmaya nurmaya@yarsi.ac.id,

Topics

Hirarki Pewarisan
Overriding Methods
Constructor Subclass
Konversi antar Tipe Subclass dan
Superclass
Polimorfisme dan Pewarisan
Access Specifier protected

Algoritma & Pemrograman 2 TIF2202

Hirarki
Pewarisan (1)
Kategorisasi konsep pewarisan dengan
menggunakan struktur hirarki

Algoritma & Pemrograman 2 TIF2202

Hirarki
Pewarisan (2)
Himpunan class-class dapat membentuk
sebuah hirarki pewarisan
Class-class merepresentasikan konsep paling
umum yang mendekati root, konsep lebih
khususnya mendekati cabang

Superclass: class yang


lebih umum
Subclass: class yang lebih
khusus dari superclassnya
Contoh:
JPanel adalah subclass dari
JComponent

Algoritma & Pemrograman 2 TIF2202

Hirarki
Pewarisan:
Contoh (1)

Contoh: tipe account yang berbeda:


1. Rekening Cek (CheckingAccount):

Tidak ada bunga (interest)


Sedikit transaksi per bulan
Kenakan biaya transaksi untuk transaksi tambahan

2. Rekening Tabungan (SavingsAccount):

Hasilkan bunga bulanan

. Superclass: BankAccount
. Subclasses: CheckingAccount & SavingsAccount

Algoritma & Pemrograman 2 TIF2202

Hirarki
Pewarisan:
Contoh (2)

Behavior/perlakuan dari class rekening


(BankAccount, CheckingAccount,
SavingsAccount):
Semua class mendukung method getBalance.
Semua class mendukung method deposit dan withdraw, tetapi
detil implementasi berbeda.
CheckingAccount perlu sebuah
method deductFees untuk
menghitung biaya bulanan dan
me-reset counter transaksi.
CheckingAccount harus
meng-override method deposit
dan withdraw untuk menghitung
jumlah transaksi.
Algoritma & Pemrograman 2 TIF2202

Latihan
Mengapa kita tidak menempatkan method
addInterest di dalam class BankAccount?
Jawab:
Tidak semua jenis rekening mendapatkan bunga.

Algoritma & Pemrograman 2 TIF2202

Hirarki
Pewarisan (3)
Inheritance : mekanisme untuk memperluas
class yang ada dengan menambah instance
variable dan method, contoh:
public classSavingsAccountextendsBankAccount {
//Tambahkaninstancevariables
//Tambahkanmethod-methodbaru
}

Subclass mewarisi method dari superclass:


//Rekeningtabungandenganratebunga10%
SavingsAccountcollegeFund=newSavingsAccount(10);
//MenjalankanmethodBankAccountdenganobjectSavingsAccount
collegeFund.deposit(500);
Algoritma & Pemrograman 2 TIF2202

Hirarki
Pewarisan (4)
Dalam subclass:
Tambahkan instance variable
Tambahkan method(-method) baru, dan
Ubah/override method
public class SavingsAccount extends BankAccount {
//Instancevariable(s)
private double interestRate;
public SavingsAccount(double rate){
//Implementasiconstructor
}
public void addInterest(){
//Implementasimethod
}
Algoritma & Pemrograman 2 }
TIF2202

Hirarki
Pewarisan (5)
Instance variable yang dideklarasikan dalam
superclass, hadir dalam object subclass.
Object SavingsAccount mewarisi instance
variable balance dari class BankAccount, dan
mendapat 1 instance variable tambahan, yaitu
interestRate.

Algoritma & Pemrograman 2 TIF2202

10

Hirarki
Pewarisan (6)
Implementasi constructor di subclass
Implementasi method baru
public class SavingsAccount extends BankAccount {
private double interestRate;
public SavingsAccount(double rate){
interestRate = rate;
}
public void addInterest() {
double interest = getBalance() * interestRate / 100;
deposit(interest);
}
}
Algoritma & Pemrograman 2 TIF2202

11

Hirarki
Pewarisan (7)
Subclass tidak memiliki akses ke instance variable superclass
yang bersifat private.
Encapsulation: method addInterest memanggil getBalance
daripada meng-update variabel balance dari superclass (variabel
tsb private)
Catatan: method addInterest memanggil getBalance tanpa
mengspesifikasikan parameter implisit (pemanggilan tsb
diterapkan ke object yang sama)
Terakhir, tambahkan komentar javadoc dalam program.
Komentar javadoc berada di awal class/method/constructor, diapit
dengan simbol /** dan */
Di atas deklarasi class: deskripsi, @author, @version
Di atas deklarasi constructor/method: deskripsi, @param, @return
Algoritma & Pemrograman 2 TIF2202

12

Class
SavingsAccount
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

/**

An account that earns interest at a fixed rate.

*/
public class SavingsAccount extends BankAccount {
private double interestRate;
/**

Constructs a bank account with a given interest rate.


@param rate the interest rate

*/
public SavingsAccount(double rate) {
interestRate = rate;
}
/**

Adds the earned interest to the account balance.

*/
public void addInterest() {
double interest = getBalance() * interestRate / 100;
deposit(interest);
}
Algoritma & Pemrograman 2 TIF2202

13

Class
BankAccount (1)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

/**

A bank account has a balance that can be changed by


deposits and withdrawals.

*/
public class BankAccount {
private double balance;
/**

Constructs a bank account with a zero balance.

*/
public BankAccount() {
balance = 0;
}
/**

Constructs a bank account with a given balance.


@param initialBalance the initial balance

*/
public BankAccount(double initialBalance) {
balance = initialBalance;
}
Algoritma & Pemrograman 2 TIF2202

14

Class
BankAccount (2)
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46

/**

Deposits money into the bank account.


@param amount the amount to deposit

*/
public void deposit(double amount) {
balance = balance + amount;
}
/**

Withdraws money from the bank account.


@param amount the amount to withdraw

*/
public void withdraw(double amount) {
balance = balance - amount;
}
/**

Gets the current balance of the bank account.


@return the current balance

*/
public double getBalance() {
return balance;
Algoritma & Pemrograman 2 }
}

TIF2202

15

15

Mewarisi Class:
Sintaks

Algoritma & Pemrograman 2 TIF2202

16

Hirarki
BankAccount SavingsAccount

Class BankAccount

Properties:
- double balance
Constructor:
- BankAccount()
- BankAccount(double initialBalance)
Methods:
- void deposit(double amount)
- void withdraw(double amount)
- double getBalance()

Class SavingsAccount
Properties:
- double interestRate
Constructor:
- SavingsAccount(double rate)
Methods:
Algoritma & Pemrograman 2 - void
addInterest()
TIF2202

17

Latihan
Perhatikan hirarki class BankAccount
SavingsAccount.
1.Instance variable apa yang dimiliki object class
SavingsAccount?
2.Sebutkan method yang dapat dijalankan oleh
object SavingsAccount!
Jawab:
3.Dua instance variable: balance dan interestRate.
4.Empat method: deposit, withdraw, getBalance,
dan addInterest.
Algoritma & Pemrograman 2 TIF2202

18

Latihan
Jika class Manager meng-extends class Employee,
class mana yang menjadi superclass dan class
mana yang menjadi subclass?
Jawab:
. Class Manager adalah subclass;
class Employee adalah superclass.

Algoritma & Pemrograman 2 TIF2202

19

Kesalahan Umum:
Mengakses Variabel
Private
Ingat access specifier private!
Subclass tidak memiliki akses ke instance
variable yang bersifat private.
public class SavingsAccount extends BankAccount {
private double interestRate;
public void addInterest() {
double interest = getBalance() * interestRate / 100;
balance = balance + interest; //Error
}
}

Variable balance di class


BankAccount bersifat private

Apa solusinya?

20

Kesalahan Umum:
Membayangi Variabel
(1)
Apakah dengan menambahkan variabel balance di
class SavingsAccount?
public class SavingsAccount extends BankAccount {
private double interestRate;
private double balance; //Menambahkanvariabelbalance
public void addInterest() {
double interest = getBalance() * interestRate / 100;
balance = balance + interest;
}
}

Apa yang terjadi?


Apa solusinya?

Tidak terjadi compile error,


namun tidak akan meng-update
saldo dengan tepat

Algoritma & Pemrograman 2 TIF2202

21

Kesalahan Umum:
Membayangi Variabel
(2)
Method addInterest berhasil di-compile,
tetapi tidak meng-update balance (saldo)
yang tepat!

Algoritma & Pemrograman 2 TIF2202

22

Solusi dari
Membayangi
Variabel

Perhatikan statement berikut:


balance = balance + interest

Statement di atas mirip dengan statement di mana?


Ingat method void deposit(double amount)?
Gunakan/panggil method deposit, namun parameternya
diganti dengan interest.
public class SavingsAccount extends BankAccount {
private double interestRate;
private double balance; //Menambahkanvariabelbalance
public void addInterest() {
double interest = getBalance() * interestRate / 100;
deposit(interest);
balance
= balance + interest;
}
}

Algoritma & Pemrograman 2 TIF2202

23

OVERRIDING METHOD

Algoritma & Pemrograman 2 TIF2202

24

Overriding
Method (1)
Method subclass meng-override
(menimpa) method superclass hanya jika
memiliki nama dan tipe parameter
yang sama seperti pada method
superclass.
Ketika method X ada di superclass dan
subclass-nya, maka overriding method yang
dieksekusi.
Overriding method (method yang menimpa)
adalah method di subclass
Overriden method (method yang ditimpa)
& Pemrograman 2 adalah methodAlgoritma
di superclass
25
TIF2202

Overriding
Method (2)
Method deposit dan withdraw dari class
CheckingAccount override method deposit
dan withdraw dari class BankAccount untuk
menangani biaya transaksi di rekening Cek.
public class BankAccount {
. . .
public void deposit(double amount) { . . . }
public void withdraw(double amount) { . . . }
public double getBalance() { . . . }
}
public class CheckingAccount extends BankAccount {
. . .
public void deposit(double amount) { . . . }
public void withdraw(double amount) { . . . }
public void deductFees() { . . . }
Algoritma & Pemrograman 2 }
TIF2202

26

Overriding
Method (3)
Problem: Override method deposit tidak dapat
menambahkan variabel amount ke balance.
public class CheckingAccount extends BankAccount {
...
public void deposit(double amount) {
transactionCount++;
//Menambahkanamountkebalance
balance = balance + amount; //Compileerror
}
}

Apa solusinya?
Gunakan method public di superclass untuk
memodifikasi private instance variable superclass.
Algoritma & Pemrograman 2 TIF2202

27

Memanggil Method
di Superclass (1)
Method deposit dari class CheckingAccount
harus menjalankan method deposit dari
BankAccount.
Apakah seperti ini?
public class CheckingAccount extends BankAccount {
...
public void deposit(double amount) {
transactionCount++;

//Menambahkanamountkebalance
deposit(amount);
balance
= balance //Terjadiinfiniterecursion,karenasama
+ amount;
//denganthis.deposit(amount);

this menunjukkan bahwa method yang


Catt: Recursion adalah proses
dipanggil
adalah
Algoritma
& Pemrograman
2 -method yang sekarang
pemanggilan method diri sendiri
TIF2202
sedang
diakses (di CheckingAccount)

28

Memanggil Method
di Superclass (2)
Untuk memanggil method-method dari
superclass-nya, suatu subclass harus
memanggilnya dengan keyword super.
public class CheckingAccount extends BankAccount {
...
public void deposit(double amount) {
transactionCount++;

//Menambahkanamountkebalance
deposit(amount);
super.deposit(amount); //OK

Algoritma & Pemrograman 2 TIF2202

29

Memanggil Method
Superclass: Sintaks

Algoritma & Pemrograman 2 TIF2202

30

Memanggil Method
di Superclass (3)
public class CheckingAccount extends BankAccount {
private static final int FREE_TRANSACTIONS = 3;
private static final double TRANSACTION_FEE = 2.0;
private int transactionCount;
. . .
public void withdraw(double amount) {
transactionCount++;
//Mengurangiamountdaribalance
super.withdraw(amount);
}
public void deductFees() {
if (transactionCount > FREE_TRANSACTIONS){
double fees = TRANSACTION_FEE *
(transactionCount - FREE_TRANSACTIONS);
super.withdraw(fees);
}
transactionCount = 0;
}
. . .
}
Algoritma & Pemrograman 2 TIF2202

31

Hirarki
BankAccount SavingsAccount CheckingAccount

Class BankAccount

Properties:
- double balance
Constructors:
- BankAccount()
- BankAccount(double initialBalance)
Methods:
- void deposit(double amount)
- void withdraw(double amount)
- double getBalance()

Class SavingsAccount
Properties:
- double interestRate
Constructors:
- SavingsAccount(double rate)
Methods:
- void addInterest()

Class CheckingAccount
Properties:
- static final int FREE_TRANSACTIONS
- static final double TRANSACTION_FEE
- int transactionCount
Constructors:
- SavingsAccount(double initialBalance)

Methods:
- void deposit(double amount)
- void withdraw(double amount)
Algoritma & Pemrograman 2 - void deductFees()
TIF2202

32

Latihan
Perhatikan hirarki class BankAccount SavingsAccount CheckingAccount.
Kategorikan method-method dari class SavingsAccount dan
CheckingAccount, apakah termasuk method yang inherited
(diwarisi), new (baru), atau overriding (menimpa)?
Jawab:
1.Class SavingsAccount:
Inherited (diwarisi) : deposit, withdraw, getBalance
New (baru): addInterest
2.Class CheckingAccount:
Overriding (menimpa) : deposit, withdraw
Inherited (diwarisi) : getBalance
New (baru): deductFees
Algoritma & Pemrograman 2 TIF2202

33

Latihan
Mengapa method withdraw dari class
CheckingAccount memanggil super.withdraw?
Jawab:
. Karena perlu mereduksi balance, dan tidak dapat
mengakses variabel balance di class BankAccount
secara langsung.

Algoritma & Pemrograman 2 TIF2202

34

Latihan
Mengapa method deductFees menge-set
transactionCount ke nilai 0?
Jawab:
Karena transactionCount merefleksikan jumlah
transaksi dari bulan yang berjalan.

Algoritma & Pemrograman 2 TIF2202

35

CONSTRUCTOR SUBCLASS

Algoritma & Pemrograman 2 TIF2202

36

Constructor
Subclass (1)
Untuk memanggil constructor dari superclassnya, suatu subclass harus memanggilnya
dengan keyword super yang diletakkan pada
statement pertama di constructor subclass.
public class CheckingAccount extends BankAccount {
...
public CheckingAccount(double initialBalance) {
//Mengkonstruksikansuperclassdenganmemanggil
//constructorsuperclassdengan1parameter
super(initialBalance);
//InisialisasitransactionCount
transactionCount = 0;
}
}

Algoritma & Pemrograman 2 TIF2202

37

Constructor
Subclass (2)
Ketika constructor subclass tidak
memanggil constructor superclass,
superclass harus memiliki constructor
tanpa parameter
Jika superclass tidak memiliki constructor tanpa
parameter, maka terjadi compile error.

Algoritma & Pemrograman 2 TIF2202

38

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26

Class
CheckingAccount
(1)

/**
A checking account that charges transaction fees.
*/
public class CheckingAccount extends BankAccount {
private static final int FREE_TRANSACTIONS = 3;
private static final double TRANSACTION_FEE = 2.0;
private int transactionCount;

/**
Constructs a checking account with a given balance.
@param initialBalance the initial balance
*/
public CheckingAccount(double initialBalance) {
// Construct superclass
super(initialBalance);
// Initialize transaction count
transactionCount = 0;
}
public void deposit(double amount) {
transactionCount++;
// Now add amount to balance
Algoritma & Pemrograman 2 super.deposit(amount);
TIF2202
}

39

Class
CheckingAccount
(2)
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46

public void withdraw(double amount) {


transactionCount++;
// Now subtract amount from balance
super.withdraw(amount);
}
/**

Deducts the accumulated fees and resets the


transaction count.

*/
public void deductFees() {
if (transactionCount > FREE_TRANSACTIONS) {
double fees = TRANSACTION_FEE *
(transactionCount - FREE_TRANSACTIONS);
super.withdraw(fees);
}
transactionCount = 0;
}
}

Algoritma & Pemrograman 2 TIF2202

40

Memanggil
Constructor
Superclass: Sintaks

Algoritma & Pemrograman 2 TIF2202

41

Latihan
1. Mengapa constructor SavingsAccount tidak memanggil
constructor superclass?
2. Kapan menjalankan method superclass dengan keyword
super, apakah pemanggilan tsb harus statement pertama dari
method subclass?
Jawab:
1. Karena constructor SavingsAccount menggunakan default
constructor superclass, dimana menge-set saldo (balance) 0.
2. Tidak hal ini persyaratan hanya untuk constructor.
Contohya, method SavingsAccount.deposit pertamanya
meng-increment jumlah transaksi, lalu memanggil method
superclass.
Algoritma & Pemrograman 2 TIF2202

42

KONVERSI ANTARA TIPE


SUBCLASS DAN
SUPERCLASS
Algoritma & Pemrograman 2 TIF2202

43

Konversi Tipe
Subclass
ke Superclass

Konversi dari reference subclass ke


reference superclass:

SavingsAccount danaKuliah = new SavingsAccount(10);


BankAccount rek = danaKuliah; // OK, konversi subclass ke superclass
Object obj = rek; // OK, konversi subclass ke superclass

Semua variabel reference menunjuk ke tipe object SavingsAccount.


Catatan: Class Object adalah superclass dari semua class.
danaKuliah
=
rek =
obj =

Algoritma & Pemrograman 2 TIF2202

44

Konversi Tipe
Superclass ke
Subclass (1)
SavingsAccount danaKuliah = new SavingsAccount(10);
BankAccount rek = danaKuliah;
rek.deposit(1000); // OK
rek.addInterest(); // Error, karena addInterest bukan di class BankAccount

Terkadang perlu mengkonversi dari reference


superclass ke reference subclass:
BankAccount rek = (BankAccount) obj;

Casting berbahaya, jika salah bisa melempar


exception
Solusi: Gunakan operator instanceof
sebelum konversi
ke subclass.
Algoritma superclass
& Pemrograman 2 TIF2202

45

Konversi Tipe
Superclass
ke Subclass (2)
Operator instanceof untuk menguji apakah
sebuah object benar bertipe tertentu.
if (obj instanceof BankAccount) {
BankAccount rek = (BankAccount) obj;
...
}

Algoritma & Pemrograman 2 TIF2202

46

Operator
instanceOf:
Sintaks

Algoritma & Pemrograman 2 TIF2202

47

POLIMORFISME DAN
PEWARISAN
Algoritma & Pemrograman 2 TIF2202

48

Polimorfisme
dan
Pewarisan (1)
Perhatikan source code berikut ini:
// rekTabungan1 menyimpan reference ke SavingsAccount
BankAccount rekTabungan1 = new SavingsAccount(1000);
// rekCek1 menyimpan reference ke CheckingAccount
BankAccount rekCek1 = new CheckingAccount(500);
rekCek1.deposit(1000);
// rekCek2 menyimpan reference ke CheckingAccount
BankAccount rekCek2 = new CheckingAccount(1500);

Method deposit manakah yang dipanggil?

Dynamic method lookup: mekanisme


untuk memanggil overridden method yang
dilakukan saat run time
Algoritma & Pemrograman 2 TIF2202

49

Polimorfisme
dan
Pewarisan (2)
Perhatikan source code di class
CheckingAccount berikut ini:
public void transfer(double amount, BankAccount other){
withdraw(amount);
other.deposit(amount);
}

Ketika Anda memanggil:


rekCek1.transfer(1000, rekCek2);

Terjadi pemanggilan 2 method berikut:


rekCek1.withdraw(1000);
rekCek2.deposit(1000);

Algoritma & Pemrograman 2 TIF2202

50

Polimorfisme
dan
Pewarisan (3)

Polymorphism: kemampuan untuk


memperlakukan object yang memiliki
behavior yang berbeda, dengan cara yang
seragam
Pemanggilan method di method transfer
withdraw(amount);

sama dengan :
this.withdraw(amount);

this dapat menunjuk ke BankAccount


atau sebuah object
subclass-nya.
Algoritma & Pemrograman 2 TIF2202

51

Class
AccountTester
(1)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

/**
This program tests the BankAccount class and
its subclasses.
*/
public class AccountTester {
public static void main(String[] args) {
SavingsAccount momsSavings = new SavingsAccount(0.5);
CheckingAccount harrysChecking = new CheckingAccount(100);
momsSavings.deposit(10000);
momsSavings.transfer(2000, harrysChecking);
harrysChecking.withdraw(1500);
harrysChecking.withdraw(80);
momsSavings.transfer(1000, harrysChecking);
harrysChecking.withdraw(400);

Algoritma & Pemrograman 2 TIF2202

52

Class
AccountTester
(2)
20
21
22
23
24
25
26
27
28
29
30
31
32

// Simulate end of month


momsSavings.addInterest();
harrysChecking.deductFees();
System.out.println("Moms savings balance: "
+ momsSavings.getBalance());
System.out.println("Expected: 7035");
System.out.println("Harrys checking balance: "
+ harrysChecking.getBalance());
System.out.println("Expected: 1116");
}
}

OutputprogramAccountTester:
Mom's savings balance: 7035.0
Expected: 7035
Harry's checking balance: 1116.0
Expected: 1116
Algoritma & Pemrograman 2 TIF2202

53

Latihan
1. Mengapa parameter kedua dari method transfer harus
bertipe BankAccount dan tidak, sebagai contoh,
SavingsAccount?
2. Mengapa kita tidak dapat mengubah parameter kedua dari
method transfer menjadi tipe Object?
Jawab:
1. Kita ingin menggunakan method untuk semua jenis bank
account. Jika kita menggunakan tipe parameter
SavingsAccount, kita tidak dapat memanggil method
dengan object CheckingAccount.
2. Kita tidak dapat menjalankan method deposit pada
variabel bertipe Object.
Algoritma & Pemrograman 2 TIF2202

54

Latihan
1. Jika a adalah variabel bertipe BankAccount yang
menyimpan non-null reference, apa yang Anda tahu
tentang object yang a tunjuk?
2. Jika a menunjuk ke checking account, apa efek dari
pemanggilan a.transfer(1000, a)?
Jawab:
1. Object adalah sebuah instan dari BankAccount atau
satu dari subclass-nya.
2. Saldo dari a tidak berubah, dan transaction diincrement 2x.
Algoritma & Pemrograman 2 TIF2202

55

ACCESS SPECIFIER
PROTECTED
Algoritma & Pemrograman 2 TIF2202

56

Akses protected
(1)
Fitur protected dapat diakses oleh
seluruh subclass dan oleh class dalam
package yang sama.
Menyelesaikan problem dimana method di
class CheckingAccount membutuhkan
akses ke instance variable balance dari
superclass BankAccount:
public class BankAccount {
protected double balance;
. . .
}
Algoritma & Pemrograman 2 TIF2202

57

Akses protected
(2)

Perancang superclass tidak memiliki


kontrol terhadap pembuat subclass:

Sembarang method subclass dapat mengkorupsi data


superclass
Class-class dengan instance variable protected sulit
dimodifikasi variabel bertipe protected tidak dapat
diubah, karena seseorang di luar sana mungkin telah
menulis subclass yang mana code bergantung terhadap
variabel tsb

Data protected dapat diakses oleh seluruh


method dari class dalam package yang sama.
Pilihan yang terbaik untuk meninggalkan seluruh
data dalam kondisi private dan menyediakan
Algoritma & Pemrograman 2 58
method accessor
untuk
mengakses data
TIF2202

Anda mungkin juga menyukai