4 Inheritance
4 Inheritance
Topics
Hirarki Pewarisan
Overriding Methods
Constructor Subclass
Konversi antar Tipe Subclass dan
Superclass
Polimorfisme dan Pewarisan
Access Specifier protected
Hirarki
Pewarisan (1)
Kategorisasi konsep pewarisan dengan
menggunakan struktur hirarki
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
Hirarki
Pewarisan:
Contoh (1)
. Superclass: BankAccount
. Subclasses: CheckingAccount & SavingsAccount
Hirarki
Pewarisan:
Contoh (2)
Latihan
Mengapa kita tidak menempatkan method
addInterest di dalam class BankAccount?
Jawab:
Tidak semua jenis rekening mendapatkan bunga.
Hirarki
Pewarisan (3)
Inheritance : mekanisme untuk memperluas
class yang ada dengan menambah instance
variable dan method, contoh:
public classSavingsAccountextendsBankAccount {
//Tambahkaninstancevariables
//Tambahkanmethod-methodbaru
}
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.
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
/**
*/
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
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
/**
*/
public class BankAccount {
private double balance;
/**
*/
public BankAccount() {
balance = 0;
}
/**
*/
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
/**
*/
public void deposit(double amount) {
balance = balance + amount;
}
/**
*/
public void withdraw(double amount) {
balance = balance - amount;
}
/**
*/
public double getBalance() {
return balance;
Algoritma & Pemrograman 2 }
}
TIF2202
15
15
Mewarisi Class:
Sintaks
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.
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
}
}
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;
}
}
21
Kesalahan Umum:
Membayangi Variabel
(2)
Method addInterest berhasil di-compile,
tetapi tidak meng-update balance (saldo)
yang tepat!
22
Solusi dari
Membayangi
Variabel
23
OVERRIDING METHOD
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);
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
29
Memanggil Method
Superclass: Sintaks
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.
34
Latihan
Mengapa method deductFees menge-set
transactionCount ke nilai 0?
Jawab:
Karena transactionCount merefleksikan jumlah
transaksi dari bulan yang berjalan.
35
CONSTRUCTOR SUBCLASS
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;
}
}
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.
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 deductFees() {
if (transactionCount > FREE_TRANSACTIONS) {
double fees = TRANSACTION_FEE *
(transactionCount - FREE_TRANSACTIONS);
super.withdraw(fees);
}
transactionCount = 0;
}
}
40
Memanggil
Constructor
Superclass: Sintaks
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
43
Konversi Tipe
Subclass
ke Superclass
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
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;
...
}
46
Operator
instanceOf:
Sintaks
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);
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);
}
50
Polimorfisme
dan
Pewarisan (3)
sama dengan :
this.withdraw(amount);
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);
52
Class
AccountTester
(2)
20
21
22
23
24
25
26
27
28
29
30
31
32
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)