Method - pbooop

advertisement
Inheritance dan Kata Kunci static
PEWARISAN (INHERITANCE)
 Salah satu fitur yang paling kuat dalam OOP adalah
penggunaan kode kembali (code reuse). Sekali sebuah
prosedur dibuat, maka kita bisa menggunakannya berulang
kali
 Dalam OOP, kemampuan yang dimiliki tidak hanya itu.
Kita juga bisa mendefinisikan hubungan antar kelas yang
tidak hanya dimanfaatkan untuk code reuse, tapi juga dari
segi pendesainannya yang jauh lebih baik, yaitu dengan
cara mengelola kelas-kelas dan faktor kemiripan di antara
kelas-kelas tersebut.
 Fitur pewarisan (inheritance) mengijinkan sebuah
kelas, yang disebut superclass, untuk menurunkan
atribut-atribut dan method-methodnya kepada kelas
lainnya yang disebut subclass (child)
 Terdapat beberapa karakteristik dari subclass:
- subclass adalah bentuk khusus dari sebuah
superclass
- dalam sebuah subclass terdapat atribut dan
method yang diturunkan dari superclass
- subclass bisa memiliki fitur tambahan yang
berbeda dari fitur-fitur yang diturunkan dari
superclass-nya
CONTOH PEWARISAN
JENIS-JENIS PEWARISAN
 Single inheritance, yaitu hanya terdapat satu
superclass
 Multiple inheritance, yaitu terdapat lebih dari satu
superclass. Bahasa Java tidak mengakomodasi
multiple inheritance
 Pewarisan adalah kemampuan sebuah kelas untuk
mewariskan seluruh atau sebagian atribut dan
methodnya ke kelas lain, sehingga atribut dan
method tersebut dikenal oleh kelas yang menerima
pewarisan tanpa harus menuliskannya. Pewarisan
ini merupakan implementasi dari hubungan antar
kelas generalisasi-spesialisasi.
 Kelas yang mewariskan disebut kelas induk, super
class, atau base class sedangkan kelas yang
menerima pewarisan disebut kelas anak, kelas
turunan, atau subclass.
 Pewarisan dapat dilakukan jika :
• Ada beberapa atribut dan method yang sama yang
digunakan oleh beberapa kelas berbeda (reduksi
penulisan kode)
• Ada satu atau beberapa kelas yang sudah pernah
dibuat yang dibutuhkan oleh aplikasi (reusability)
• Ada perubahan kebutuhan fungsional atau feature
aplikasi dimana sebagian atau seluruh perubahan
tersebut tercakup di satu atau beberapa kelas yang
sudah ada (extend)
Pewarisan di Java
 Pewarisan di Java hanya mengenal pewarisan
tunggal, artinya sebuah kelas hanya mewarisi atribut
dan method dari satu kelas induk. Untuk
menggunakan pewarisan di Java digunakan keyword
extends.
Contoh Pewarisan
//Employee.java
public class Employee {
public String name;
public Date birthDate;
public double salary;
public String getDetails() {...}
}
//Manager.java
public class Manager extends Employee {
public String department;
}
 Dari kode di atas, terlihat bahwa atribut name,
birthDate, dan salary serta method
getDetails() diturunkan ke kelas Manager
sehingga kelas Manager dapat menggunakan atribut
dan method tersebut.
 Konstruktor dari kelas induk tidak dapat diturunkan
kepada kelas turunannya.
 Untuk menggunakan method dan konstruktor dari
kelas induk pada kelas anak digunakan keyword
super
//Employee.java
public class Employee {
private String name;
private double gaji;
public Employee (String s, double g) {
name = s;
}
public double getgaji() {
return gaji;
}
}
//Manager.java
public class Manager extends Employee {
private String alamat;
private double tunjangan;
private double bonus;
public Manager(String nama, String s, double gaji)
{
super(nama, gaji);
alamat = s;
}
Public double getgaji() {
return (super.getgaji()+tunjangan+bonus);
}
}
Ketika kode dalam satu kelas (kelas A) memiliki akses
ke kelas yang lain (kelas B), hal tersebut berarti kelas A
dapat melakukan satu dari tiga hal berikut :
 Membuat instance kelas B;
 Meng-extends kelas B (dengan kata lain, menjadi
subclass dari kelas A);
 Mengakses atribut dan method tertentu dalam kelas B
tergantung dari access control atribut dan methodnya.
 Access Specifier yang dapat diterapkan pada kelas
adalah akses default (friendly) dan public.
 Dalam deklarasinya, sebuah kelas dengan access
specifier default tidak memiliki specifier di depan nama
kelasnya. Kelas yang memiliki akses default berarti kelas
ini hanya dapat diakses oleh kelas yang berada di dalam
package yang sama. Contoh, jika kelas A dan B terletak di
dalam package yang berbeda, dan kelas A memiliki akses
default, maka kelas B tidak dapat membuat instance dari
kelas A atau bahkan tidak dapat mendeklarasikan
variabel yang bertipe kelas A. Perhatikan contoh berikut
ini:
 Contoh
package packageOne;
class Animal { }
package packageTwo;
import packageOne.Animal;
class Dog extends Animal { }
Superclass Animal berada di dalam package yang berbeda dengan subclassnya, yaitu
Dog. Pernyataan import di dalam kelas Dog berusaha mengimpor kelas Animal. Ketika
proses kompilasi dijalankan, kelas Animal dapat dikompilasi, tetapi tidak dengan kelas
Dog. Hal ini disebabkan karena superclass Animal mempunyai akses default dan terletak
di dalam package yang berbeda. Kelas yang dideklarasikan public dapat diakses oleh
kelas yang berada di manapun, termasuk oleh kelas yang berada di package yang
berbeda. Jika contoh kode di atas dimodifikasi dengan menjadikan kelas Animal
memiliki access specifier public, maka kedua kelas tersebut dapat dikompilasi.
Access Specifier
Tabel di bawah ini merupakan rangkuman
aksesibilitas dari access specifier pada class member
(atribut dan method).
Specifier
Kelas
yang
sama
Package
yang Sama
Subclass
private
Ya
default
Ya
Ya
protected
Ya
Ya
Ya
public
Ya
Ya
Ya
Semua
Kelas
Ya
package1
Class2
OK
OK +
OK #
NO -
a
b
c
d
:
:
:
:
Class1
int
int
int
int
SubClass1
OK
OK
OK
NO
Class2
package2
package1
package3
NO
OK
NO
NO
a
+ b
# c
- d
:
:
:
:
Class1
int
int
int
int
SubClass1
NO
OK
OK
NO
Latihan
 Buatlah kode Java untuk diagram UML berikut
Keyword Final
 Kata Kunci final dapat digunakan untuk deklarasi
kelas, method, dan variabel.
 Bahasa pemrograman Java memungkinkan
penggunaan kata kunci final pada kelas. Jika kelas
dideklarasikan final, maka kelas tersebut tidak dapat
diturunkan. Salah satu contoh dari kelas final adalah
kelas java.lang.String. Kelas ini dibuat final untuk
alasan keamanan.
 Method dapat dideklarasikan dengan kata kunci
final. Method yang dideklarasikan final tidak dapat
di-override. Sebuah method sebaiknya
didelkarasikan final jika method yang bersangkutan
mempunyai implementasi yang tidak boleh diubah
dan penting untuk menjaga konsistensi perilaku
sebuah obyek.
 Jika variabel dideklarasikan dengan kata kunci final,
maka variabel tersebut dijadikan sebagai sebuah
konstanta. Apabila program berusaha mengubah
nilai dari variabel final, maka akan muncul
kesalahan compiler. Kode program berikut ini
menggambarkan penggunaan variabel final :
public class Bank {
private static final double DEFAULT_INTEREST_RATE=3.2;
}
 Untuk kasus variabel referensi, jika menandai variabel
tersebut dengan final, maka variabel tersebut tidak dapat
merujuk ke obyek lainnya. Tetapi, isi variabel dari obyek
tersebut dapat diubah.
 Variabel final kosong adalah sebuah variabel final yang
tidak diinisialisasi ketika dideklarasikan. Biasanya
variable ini merupakan variabel instance yang nilainya
diberikan di dalam konstruktor. Variabel final kosong
yang dideklarasikan sebagai variabel obyek dapat diberi
nilai di bagian manapun di dalam method, tetapi hanya
dapat diberi nila satu kali saja. Kode program berikut
menunjukkan penggunaan variabel final dengan nilai
awal kosong.
public class Customer {
private final long customerID;
public Customer(){
customerID = 10238L;
}
public long getID() {
return customerID;
}
}
Keyword static
 Pada saat tertentu, terkadang dibutuhkan variabel
yang di-share/dibagi untuk semua instance/obyek
suatu kelas. Sebagai contoh, variabel yang
digunakkan sebagai basis untuk komunikasi antar
instance atau menghitung jumlah instance yang
telah dibuat. Untuk melakukan hal ini, tandai
sebuah variabel dengan kata kunci static. Variabel
tersebut seringkali disebut sebagai variabel kelas
untuk membedakannya dari member variable atau
variabel instance yang tidak di-share oleh semua
instance. Perhatikan contoh kode program berikut.
public class Count{
private int serialNumber;
public static int counter = 0;
public Count() {
counter++;
serialNumber = counter;
}
}
 Pada contoh tersebut, diberikan SerialNumber yang
unik untuk setiap obyek yang dibuat, dimulai dengan
angka 1 untuk obyek pertama, angka 2 untuk obyek
kedua, dan seterusnya. Variable counter dishare/dibagi untuk semua instance. Ketika
membuat sebuah obyek Count, konstruktor akan
dipanggil. Pemanggilan konstruktor ini akan meincrement (menambahkan dengan 1) nilai dari
variabel counter dan nilai ini diberikan kepada
variabel serialNumber.
 Gambar berikut ini menunjukkan visualisasi dari
pembentukan instance/obyek tersebut.
 Variabel statik memiliki konsep yang serupa dengan
variabel global di dalam bahasa pemrograman
lainnya. Bahasa Java tidak mengenal variabel global,
tetapi variabel statik adalah sebuah variabel yang
dapat diakses oleh setiap instance dari sebuah kelas.
 Untuk mengkasesnya tidak diperlukan instance dari
kelasnya, tetapi menggunakan nama kelasnya
sebagaimana ditunjukkan pada contoh kode
program berikut ini.
public class OtherClass {
public void incrementNumber() {
Count1.counter++;
}
}
 Terkadang perlu juga mengakses kode program yang
tidak memiliki instance dari sebuah kelas. Hal
tersebut dapat dilakukan dengan menggunakan
method yang dideklarasikan static. method demikian
seringkali disebut sebagai method kelas sebagaimana
ditunjukkan pada kode program berikut.
public class Count2 {
private int serialNumber;
private static int counter = 0;
public static int getTotalCount() {
return counter;
}
public Count2() {
counter++;
serialNumber = counter;
}
}
 Untuk menggunakan method yang dideklarasikan static, tidak perlu
menggunakan referensi obyeknya melainkan nama kelas seperti
ditunjukkan pada kode program berikut ini :
public class TestCounter {
public static void main(String[] args) {
System.out.println("number of counter is “+
Count2.getTotalCount());
Count2 count2 = new Count2();
System.out.println("number of counter is "+
Count2.getTotalCount());
}
}
 Karena method statik dipanggil tanpa menggunakan
variabel instance dari kelas yang bersangkutan, maka
tidak dapat diterapkan variabel referensi this.
Akibatnya, method statik tidak dapat mengakses variabel
selain daripada variabel lokal, atribut static, dan
parameternya. Apabila berusaha mengakses atribut
bukan statik dari method statik, hal itu akan
menyebabkan compiler error.
 Atribut bukan statik terkait dengan satu instance
tertentu dan ia hanya bisa diakses melalui referensi
instance. Berikut contoh kode program yang mencoba
mengakses variabel bukan statik dari method statik.
public class Count3 {
private int serialNumber;
private static int counter = 0;
public static int getSerialNumber() {
return serialNumber; //COMPILER ERROR
}
}
 Hal yang harus diperhatikan ketika menggunakan
method statik antara lain :
Method statik tidak dapat di-override
 Method main() merupakan sebuah method statik karena
JVM tidak perlu membuat sebuah instance dari kelas
yang bersangkutan ketika method main() dieksekusi. Jika
mempunyai data member, hendaknya dibuatkan sebuah
obyek untuk mengaksesnya.

 Method atau variabel statik dideklarasikan
sebaiknya ketika :
tidak diperlukan operasi pada obyek individual;
 tidak diperlukan asosiasi suatu variabel kepada sebuah
obyek;
 diperlukan akses variabel atau method sebelum
instanstiasi obyek;
 Method atau variabel secara logika bukan milik dari
sebuah obyek, tetapi milik sebuah kelas utilitas.
Contohnya kelas Math pada Java API.

Download