INHERITANCE. Pelatihan Java 2 Mei 2015 Fakultas Teknologi Informasi Program Studi Teknik Informatika

dokumen-dokumen yang mirip
Konsep Inheritance. Praktikum 8 Pemrograman Berbasis Obyek

Overriding. Subclass yang berusaha memodifikasi tingkah laku yang diwarisi dari superclass. Tujuan: subclass memiliki tingkah laku yang lebih

Inheritance dan Kata Kunci static

Modul 2. [access specifier] [tipe data] [nama variabel];

Bahasa Pemrograman :: Polimorfism and Abstraction

INHERITANCE AND POLIMORPHISM PUTU INDAH CIPTAYANI JURUSAN SISTEM INFORMASI STMIK AMIKOM

Pemrograman Berorientasi. Inheritance

KARAKTERISTIK PEMROGRAMAN BERORIENTASI OBJEK (OOP) Pemrograman berorientasi Objek mempunyai karakterisitik sebagai berikut:

E-Book PEMROGRAMAN BERORIENTASI OBJEK. Disusun Oleh: Arfian Hidayat, S.Kom

Overriding, Overloading, Polymorphism. Pertemuan 10 Pemrograman Berbasis Obyek Dr. Rodiah

PEWARISAN. Disusun Oleh: Reza Budiawan. Untuk: Tim Dosen Algoritma & Pemrograman Lanjut

Apa yang menjadi output potongan kode diatas? Error karena tidak ada String yang di-passing kedalam konstruktor Bapak

Inheritance (Pewarisan) Pengertian dasar inheritance

1. Manakah jawaban yang benar,pada saat Anda mengcompile dan menjalankan class berikut ini:

Konsep Dasar Pemrograman Berorientasi Objek

ABSTRACTION, ENCAPSULATION, INHERITANCE & POLYMORPHISM

Pemrograman Lanjut. Class : Deeper Look 2

KONSEP OOP: POLYMORPHISM

Gambar 1: Hirarki class

Membuat dan Menggunakan Class

Polymorphism. Materi ke-8 Pemrograman Berbasis Objek

Overriding Overloading Polymorphism

1. Keyword mana yang memiliki fungsi sama dengan keyword this dan menyediakan reference ke atribut turunan dari objek? super

5/23/12. Inheritance. Pengertian inheritance Deklarasi inheritance Single inheritance Multilevel inheritance Access Control super keyword

Pemrograman Berorientasi Objek / Object Oriented Programming / (OOP) Nur Hasanah, M.Cs

Pewarisan, Polimorfisme, dan Interface

1.Tujuan. 2. Latar Belakang. Mendefinisikan superclasses dan subclasses Override method dari superclasses Membuat method final dan class final

Inheritance. Pertemuan 8 Pemrograman Berbasis Obyek

Pemrograman Berbasis Objek Inheritance

2015 BAHASA PEMROGRAMAN I. Pertemuan VI Inheritance (Pewarisan)

Abstract Class dan Interface. Viska Mutiawani, M.Sc

KONSEP OOP: POLYMORPHISM

LAPORAN RESMI INHERITANCE

Inheritance. Topik 5/17/2013

IKG2I4 / Software Project I

Pertemuan 4 Halaman 1/1. Class Inheritance

PERTEMUAN III OBJEK DAN CLASS TUJUAN PRAKTIKUM

MODUL 3. Inheritance, Abstract Class, Interface TUJUAN PRAKTIKUM LANDASAN TEORI. A. Inheritance

Polymorphism (Polimorfisme)

Praktikum 4 Konsep Inheritance, Polymorphism, dan Encapsulation

Jelaskan tentang konsep Cohesion & Coupling!

(INHERITANCE) Nurochman

Pewarisan Sifat Objek. Nur Hasanah, M.Cs

Bahasa Pemrograman :: Inheritance

BAB 1 PEMROGRAMAN BERORIENTASI OBJEK

INHERITANCE. Gambar 1. Kelas Hierarki Java

Encapsulation (Encapsulasi) Minggu 5 Pemrograman Berorientasi Objek Alfa Faridh Suni

Pemrograman Berorientasi. Abstract & Interface

KONSEP OOP: PEWARISAN / INHERITANCE

Bahasa Pemrograman 2.

Pemrograman Lanjut Tipe Data dan Constructor PTIIK

Jobsheet 09. Overloading and Overriding Method

Object Oriented Programming (OOP) --Inheritance- Saniati STMIK Teknokrat, Bandar Lampung

UNIVERSITAS GUNADARMA

Slide 6: Writing Classes

Pemrograman Lanjut Review Class dan Object PTIIK

Modul Bahasa Pemrograman 1

PRAKTIKUM 6 EXCEPTION

Employee employee=new Manager();

Pemrograman Berorientasi Objek

Pemrograman Berbasis Objek (Polimorfisme)

Bahasa Pemrograman 2.

SILABUS MATA KULIAH PEMROGRAMAN JAVA

3/31/2011. Tujuan. Inheritance, Polymorphism,& Interfaces. Inheritance / pewarisan. Inheritance / pewarisan. Inheritance / pewarisan

Chapter 10 Polimorphism

PERTEMUAN 13 PERANCANGAN BERORIENTASI OBJEK UNTUK MULTI KELAS

Pemograman Berorientasi Objek. Week 3 Abstrak dan Interface dalam suatu kelas

06/03/2018. Tidak memiliki parameter. Melakukan inisialisasi semua variabel private dengan nilai awal.

Bahasa Pemrograman 2.

KONSEP OOP: PEWARISAN / INHERITANCE

FAKULTAS TEKNIK UNIVERSITAS NEGERI YOGYAKARTA LAB SHEET PEMROGRAMAN JAVA 2

8 - Overriding dan Overloading

Pemrograman Berorientasi. Class dan Obyek 2

9/26/2011. Tujuan. Bekerja dengan Java Class Library. Pengenalan OOP. Pengenalan OOP. Class dan Object. Enkapsulasi

BAB II TEORI DAN KONSEP PEMROGRAMAN BERBASIS OBJECT

Composition dan Inheritance

C#, Programming, Object-oriented. Pengenalan C# Erick Pranata. Edisi I

BAHASA PEMROGRAMAN JAVA

PEMROGRAMAN BERORIENTASI OBJEK

Pemrograman Berorientasi Objek Danu Wira Pangestu

BAB 7 OVERLOADING DAN OVERRIDING

Dasar Pemrograman Java

Konsep Pemrograman Berbasis Obyek

KONSEP OBJEK ORIENTASI PROGRAM

MINGGU V : PBO (PEWARISAN)

Praktikum 6 Abstract, Interface, Overloading, Overriding, dan Package

MODUL PRAKTIKUM PEMROGRAMAN BERORIENTASI OBJEK

Bahasa Pemrograman 2.

Pemrograman Berorientasi. Polimorfisme dan Binding

Pewarisan atau Inheritance

Praktikum 3 Konsep Class, Attribute dan Method

JOBSHEET POLIMORFISME

Percobaan 6 Exception

PERCOBAAN 6 EXCEPTION

E-Book PEMROGRAMAN BERORIENTASI OBJEK. Disusun Oleh: Arfian Hidayat, S.Kom

Modul Pelatihan : Pembuatan Game Animasi Menggunakan Greenfoot

IKG2I4 / Software Project I

Bab 8. Dasar-Dasar OOP

Algoritma Pemrograman [BS204]

LAB PEMROGRAMAN I (JAVA FUNDAMENTAL) PERTEMUAN 3 Dosen : Bella Hardiyana S. Kom

Transkripsi:

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 2

Hirarki Pewarisan (1) Kategorisasi konsep pewarisan dengan menggunakan struktur hirarki 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 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 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. 6

Latihan Mengapa kita tidak menempatkan method addinterest di dalam class BankAccount? Jawab: Tidak semua jenis rekening mendapatkan bunga. 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); 8

Dalam subclass: Hirarki Tambahkan instance variable Pewarisan (4) 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 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. 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); 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 12

Class SavingsAccount 1 /** 2 An account that earns interest at a fixed rate. 3 */ 4 public class SavingsAccount extends BankAccount { 5 private double interestrate; 6 7 /** 8 Constructs a bank account with a given interest rate. 9 @param rate the interest rate 10 */ 11 public SavingsAccount(double rate) { 12 interestrate = rate; 13 14 15 /** 16 Adds the earned interest to the account balance. 17 */ 18 public void addinterest() { 19 double interest = getbalance() * interestrate / 100; 20 deposit(interest); 21 22 13

Class BankAccount (1) 1 /** 2 A bank account has a balance that can be changed by 3 deposits and withdrawals. 4 */ 5 public class BankAccount { 6 private double balance; 7 8 /** 9 Constructs a bank account with a zero balance. 10 */ 11 public BankAccount() { 12 balance = 0; 13 14 15 /** 16 Constructs a bank account with a given balance. 17 @param initialbalance the initial balance 18 */ 19 public BankAccount(double initialbalance) { 20 balance = initialbalance; 21 22 14

Class BankAccount (2) 23 /** 24 Deposits money into the bank account. 25 @param amount the amount to deposit 26 */ 27 public void deposit(double amount) { 28 balance = balance + amount; 29 30 31 /** 32 Withdraws money from the bank account. 33 @param amount the amount to withdraw 34 */ 35 public void withdraw(double amount) { 36 balance = balance - amount; 37 38 39 /** 40 Gets the current balance of the bank account. 41 @return the current balance 42 */ 43 public double getbalance() { 44 return balance; 45 46 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: - void addinterest() 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. 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 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 21

Kesalahan Umum: Membayangi Variabel (2) Method addinterest berhasil di-compile, tetapi tidak meng-update balance (saldo) yang tepat! 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; balance deposit(interest); = balance + interest; 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) adalah method Algoritma di superclass & Pemrograman 2-25

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() {... 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. 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 balance deposit(amount); = balance // + Terjadi amount; infinite recursion, karena sama // dengan this.deposit(amount); Catt: Recursion adalah proses pemanggilan method diri sendiri this menunjukkan bahwa method yang dipanggil adalah method yang sekarang 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 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++; // 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;... 31

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() Hirarki BankAccount - SavingsAccount - CheckingAccount 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) - void deductfees() 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 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) { // Mengkonstruksikan superclass dengan memanggil // constructor superclass dengan 1 parameter super(initialbalance); // Inisialisasi transactioncount 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

Class CheckingAccount (1) 1 /** 2 A checking account that charges transaction fees. 3 */ 4 public class CheckingAccount extends BankAccount { 5 private static final int FREE_TRANSACTIONS = 3; 6 private static final double TRANSACTION_FEE = 2.0; 7 8 private int transactioncount; 9 10 /** 11 Constructs a checking account with a given balance. 12 @param initialbalance the initial balance 13 */ 14 public CheckingAccount(double initialbalance) { 15 // Construct superclass 16 super(initialbalance); 17 18 // Initialize transaction count 19 transactioncount = 0; 20 21 22 public void deposit(double amount) { 23 transactioncount++; 24 // Now add amount to balance 25 super.deposit(amount); 26 39

Class CheckingAccount (2) 27 28 public void withdraw(double amount) { 29 transactioncount++; 30 // Now subtract amount from balance 31 super.withdraw(amount); 32 33 34 /** 35 Deducts the accumulated fees and resets the 36 transaction count. 37 */ 38 public void deductfees() { 39 if (transactioncount > FREE_TRANSACTIONS) { 40 double fees = TRANSACTION_FEE * 41 (transactioncount - FREE_TRANSACTIONS); 42 super.withdraw(fees); 43 44 transactioncount = 0; 45 46 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. 42

KONVERSI ANTARA TIPE SUBCLASS DAN SUPERCLASS 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 = 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 superclass ke subclass. 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 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 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); 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. 51

Class AccountTester (1) 1 /** 2 This program tests the BankAccount class and 3 its subclasses. 4 */ 5 public class AccountTester { 6 public static void main(string[] args) { 7 SavingsAccount momssavings = new SavingsAccount(0.5); 8 9 CheckingAccount harryschecking = new CheckingAccount(100); 10 11 momssavings.deposit(10000); 12 13 momssavings.transfer(2000, harryschecking); 14 harryschecking.withdraw(1500); 15 harryschecking.withdraw(80); 16 17 momssavings.transfer(1000, harryschecking); 18 harryschecking.withdraw(400); 19 52

Class AccountTester (2) 20 // Simulate end of month 21 momssavings.addinterest(); 22 harryschecking.deductfees(); 23 24 System.out.println("Mom s savings balance: " 25 + momssavings.getbalance()); 26 System.out.println("Expected: 7035"); 27 28 System.out.println("Harry s checking balance: " 29 + harryschecking.getbalance()); 30 System.out.println("Expected: 1116"); 31 32 Output program AccountTester: Mom's savings balance: 7035.0 Expected: 7035 Harry's checking balance: 1116.0 Expected: 1116 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. 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. 55

ACCESS SPECIFIER PROTECTED 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;... 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 method accessor untuk mengakses data 58