INHERITANCE Pelatihan Java – 2 Mei 2015 Fakultas Teknologi Informasi Program Studi Teknik Informatika Herika Hayurani –
[email protected], Nova Eka Diana –
[email protected], Nurmaya –
[email protected],
Topics • • • •
Hirarki Pewarisan Overriding Methods Constructor Subclass Konversi antar Tipe Subclass dan Superclass • Polimorfisme dan Pewarisan • Access Specifier protected
Algoritma & Pemrograman 2 TIF2202
2
Hirarki Pewarisan (1) • Kategorisasi konsep pewarisan dengan menggunakan struktur hirarki
Algoritma & Pemrograman 2 TIF2202
3
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
4
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
5
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
6
Latihan Mengapa kita tidak menempatkan method addInterest di dalam class BankAccount? Jawab: Tidak semua jenis rekening mendapatkan bunga.
Algoritma & Pemrograman 2 TIF2202
7
Hirarki Pewarisan (3) • Inheritance : mekanisme untuk memperluas class yang ada dengan menambah instance variable dan method, contoh: public class SavingsAccount extends BankAccount { // Tambahkan instance variables // Tambahkan method-method baru }
• Subclass mewarisi method dari superclass: // Rekening tabungan dengan rate bunga 10% SavingsAccount collegeFund = new SavingsAccount(10); // Menjalankan method BankAccount dengan object SavingsAccount collegeFund.deposit(500); Algoritma & Pemrograman 2 TIF2202
8
Hirarki Pewarisan (4) • Dalam subclass: – Tambahkan instance variable – Tambahkan method(-method) baru, dan – Ubah/override method public class SavingsAccount extends BankAccount { // Instance variable(s) private double interestRate; public SavingsAccount(double rate){ // Implementasi constructor } public void addInterest(){ // Implementasi method } Algoritma & Pemrograman 2 } TIF2202
9
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; // Menambahkan variabel balance 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; // Menambahkan variabel balance 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++; // Menambahkan amount ke balance balance = balance + amount; // Compile error } }
• 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++;
}
// Menambahkan amount ke balance deposit(amount); balance = balance // Terjadi infinite recursion, karena sama + amount; // dengan this.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++;
}
// Menambahkan amount ke balance 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++; // Mengurangi amount dari balance 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) { // Mengkonstruksikan superclass dengan memanggil // constructor superclass dengan 1 parameter super(initialBalance); // Inisialisasi transactionCount 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("Mom’s savings balance: " + momsSavings.getBalance()); System.out.println("Expected: 7035"); System.out.println("Harry’s checking balance: " + harrysChecking.getBalance()); System.out.println("Expected: 1116"); } }
Output program AccountTester: 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