Download Pertemuan-07(Interface dan Package)

Survey
yes no Was this document useful for you?
   Thank you for your participation!

* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project

Document related concepts
no text concepts found
Transcript
INTERFACE
Interface adalah kumpulan method yang memuad deklarasi dan struktur method, juga field-field tanpa
detail implementasinya. Interface digunakan bila ingin mengaplikasikan suatu method yang spesifik (bukan dari
pewarisan kelas), interface bersifat disisipkan (embedded) pada program, dan programmer diberikan
keleluasaan untuk merancang dan mendefinisikan sendiri detail prosesnya. Kelas dan Interface fundamental
yang dijadikan library referential dikenal dengan istilah API (Application Programming Interface). Secara umum
sebuah interface dideklarasikan dengan perintah :
interface namaInterface [extends parentInterface] {
[deklarasi field-dield(konstanta)]
[deklarasi method-method]
}
Mendeklarasikan method dalam interface mirip dengan mendeklarasikan method abstract, dimana deklarasi
method tidak diakhiri pasangan kurung kurawal, melainkan tanda titik koma (;)
return-type namaMethod ([daftar parameter])
Field-field yang didefinisikan pada interface secara otomatis bersifat static dan final, yang berarti mereka hanya
bertindak sebagai konstanta. Sedangkan secara umum, suatu class dibuat agar mengimplementasi suatu
interface dengan cara sebagai berikut :
class namaClass [extends parentClass] [implements interface1, interface2,...]{
[deklarasi field-field]
[deklarasi method-method milik class ini]
[deklarasi method-method yang terdefinisi pada interface-interface yang di implementasi oleh
class tersebut]
}
Contoh :
import java.awt.*;
import java.awt.event.*;
import java.awt.event.MouseListener;
public class AustinPower extends Frame implements MouseListener {
Button behave;
public static void main (String args[]) {
AustinPower spyWhoShaggedMe = new AustinPower();
spyWhoShaggedMe.setSize(100,100);
spyWhoShaggedMe.setVisible(true);
}
public AustinPower() {
behave = new Button ("I Am a Button");
behave.addMouseListener(this);
add(behave);
}
public void mouseEntered(MouseEvent me) {
behave.setLabel ("Click me...!!!");
}
public void mouseExited(MouseEvent me) {
behave.setLabel ("Bye...Bye...!!!");
}
public void mousePressed(MouseEvent me){}
public void mouseReleased(MouseEvent me){}
public void mouseClicked(MouseEvent me){}
}
Gambar 1. Deklarasi Interface MouseListener
PBO/Ayuliana/Revisi 2009
1
package java.awt.event;
import java.util.EventListener;
/**
* The listener interface for receiving mouse event on a component.
* @version 1.7 07/01/98
* @author Carl Quinn
*/
public interface MouseListener extends EventListener {
public void mouseClicked (MouseEvent e);
public void mousePressed (MouseEvent e);
public void mouseReleased (MouseEvent e);
public void mouseEntered (MouseEvent e);
public void mouseExited (MouseEvent e);
}
Gambar 2. Penggunaan Interface MouseListener
Output :
Pada contoh diatas, dengan mengimplementasikan MouseListener, class AustinPower dikatakan
menandatangani kontrak yang menyatakan bahwa ia mampu menunjukkan kelakuan-kelakuan seorang
MouseListener (yaitu bereaksi terhadap event-event yang berhubungan dengan mouse)
Semua method yang terdefininisi pada interface bersifat abstrak, tidak ada implementasinya. Salah satu
konsekuensi dari totalitas abstraksi pada interface adalah semua method yang tertera pada interface harus
diimplementasikan oleh implementor.
Perbedaan antara interface dengan abstract class, yaitu interface merupakan solusi atas prinsip multiple
inheritance. Misalkan Terdapat class MouseDropper yang memiliki method-method abstract seperti pada
MouseListener. Apa bedanya AustinPower extends MouseDropper dengan AustinPower implements
MouseListener ? Pada perintah extends menyiratkan adanya garis keturunan sedangkan perintah implements
tidak. Perhatikan contoh deklarasi berikut :
class Raka extends Manusia implements Dosen, Snipper {
........
}
tetapi tidak berlaku untuk deklarasi berikut :
class Raka extends Manusia, Sapi {
........
}
POLYMORPHISM
Polymorphism didefinisikan sebagai kemampuan beberapa objek bertipe sama bereaksi secara berbeda
terhadap message yang sama, perhatikan contoh berikut :
1
2
3
4
5
6
7
8
9
public class KattParty {
public static void main (String args[]) {
Katt[] kandangKatt = new Katt[3];
kandangKatt[0] = new Anggora();
kandangKatt[1]
= new Siam();
kandangKatt[2] = new Katt();
for (int I = 0 ; I < 3 ; I++) {
kandangKatt[I].speak();
}
}
}
Gambar 3. Pesta Kucing
PBO/Ayuliana/Revisi 2009
2
Output :
Katt Constructor
Katt Constructor
Siam Constructor
Katt Constructor
Miaww….
Mmurrr….Mmurrr….
Miaww….
Disetiap iterasi pada loop diatas, pada dasarnya dikirimkan pesan yang sama ke objek-objek yang bertipe sama
(yaitu Katt, sesuai dengan definisi array pada baris 3), speak(). Walaupun begitu, ternyata masing-masing bereaksi dengan
caranya sendiri-sendiri.
Contoh lain dari polymorphism yaitu, misalkan dibuat aplikasi client/server, dimana client mengirimkan objek-objek
Katt (dan tentunya bisa juga apapun turunan Katt) ke server. Pada kasus tersebut, server bersedia menerima Kat-Kat itu
tanpa terlalu mempermasalahkan perbedaan spesifikasinya. Untuk itu kode diserver bisa jadi seperti berikut:
…
Katt k = null;
while (true) {
k = receive();
}…
Tentunya untuk kasus ini, tidaklah tepat jika secara static mengasosiasikan k dengan class Siam (misal dengan
pendeklarasian Siam k = null). Pada kode diatas, pengasosiasian k dengan class spesifik (Anggora, Siam atau lainnya)
dilakukan pada saat run-time, yaitu ketika return Value dari pemanggilan receive() di-assign ke k. Itulah yang disebut
dynamic/late binding.
Operator Instanceof
Bagaimana seandainya pihak server ingin mengetahui type spesifik dari objek Katt yang diterimanya ? lihat contoh
KattParty yang dimodifikasi berikut :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class KattParty2 {
public static void main (String args[]) {
Katt[] kandangKatt = new Katt[3];
kandangKatt[0] = new Anggora();
kandangKatt[1]
= new Siam();
kandangKatt[2] = new Katt();
for (int I = 0 ; I < 3 ; I++) {
kandangKatt[I].speak();
if (kandangKatt[I] instanceof Siam) {
System.out.println("Wow,It's a Siam...!");}
else if (kandangKatt[I] instanceof Anggora) {
System.out.println("Look,they sent us Anggora...!");
}
else {
System.out.println("Well...It could be Lucifer, or Alleys,"+ " or Regular Katt");
System.out.println("But one thing for sure...it's Katt," + " Praise the Lord");
}
}
}
Gambar 4. To know more about Katt
}
Output :
Katt Constructor
Katt Constructor
Siam Constructor
Katt Constructor
Miaww….
Look, they sent us Anggora…!
Mmurrr….Mmurrr….
Wow, I’s a Siam…!
Miaww….
Well…it could be Lucifer, or Alleys, or Regular Katt
But one thing for sure… it’s Katt, Praise the Lord
Operator yang dipakai adalah instanceof. A instanceof B, mengevaluai apakah objek A bertipe B (B adalah nama
class). Evaluasi itu menghasilkan nilai true jika nama class dari objek A adalah B atau nama
parent/grandparent/greatgrandparent /seterusnya dari class dari objek A adalah B.
PBO/Ayuliana/Revisi 2009
3
Evaluasi juga akan bernilai benar jika B adalah nama interface dan A mengimplementasikan B. Begitu pula jika
parent/grandparent/greatgrandparent/seterusnya dari class objek A mengimplementasi B. Singkat kata. jika A instanceof B
menghasilkan true, berarti objek A dapat menunjukkan behavior yang di syaratkan oleh class atau interface B.
PACKAGE
Dalam penyimpanan file biasanya dengan mengelompokkan class-class (dan juga interface-interface)
yang terkait (karena jenisnya/fungsinya/alasan lain) dalam sebuah package. Misalkan class-class geometris berikut
dikumpulkan dalam sebuah package bernama com.raka.geoms
/*simpan sebagai Graphic.java */
package com.raka.geoms;
public abstract class Shape {
…….
}
Gambar 5. Package---1
/* Simpan sebagai Rectangle java */
package com.raka.geoms;
public class Rectangle extends Shape {
……………
}
Gambar 6. Package---2
/* Simpan sebagai Triangle.java */
package com.raka.geoms;
public class Triangle extends Shape {
……………
}
Gambar 7. Package---3
Beberapa keuntungan mengorganisasi class-class buatan kita dalam sebuah package adalah
:
1. Terhindar dari konflik penamaan. Mungkin saja ada orang lain, dibelahan dunia lain, membuat class yang bernama
Rectangle juga. Yang membedakan antara Rectangle kita dengan yang lain adalah fully qualified name. Fully
qualified name dari class Rectangle kita adalah com.raka.geoms.Rectangle.
2. Teratur. Mendapatkan suatu class tertentu akan mudah dengan mengetahui nama package-nya.
Pada contoh diatas, masing-masing anggota dari package com.raka.geoms disimpan di file terpisah, dan
dideklarasikan sebagai public. dengan demikian class/program lain (yang bukan anggota com.raka.geoms) dapat
mengimport clas-class kita diatas. Kita juga dapat mendefinisikan beberapa class sekaligus dalam sebuah file java, seperti
contoh berikut
:
/* Simpan sebagai NuclearWarHead.java */
package com.raka.lethal;
public class NuclearWarHead {
……………
}
class Sarin
{
………………….
}
class Uzi
{
………………….
}
Gambar 8. All in Life
Jika dikompilasi NuclearWarHead.java diatas, maka akan didapatkan tiga file class, yaitu
NuclearWarHead.class,Sarin.class, Uzi.class. Kesemuanya akan menjadi anggota dari package com.raka.lethal. Akan tetapi
hanya NuclearWarHead yang bisa digunakan secara langsung dari luar package com.raka.lethal, karena hanya
NuclearWarHead yang dideklarasikan sebagai public, selebihnya dideklarasikan sebagai protected (defaultnya), sehingga
hanya dapat digunakan oleh class-class yang tergabung didalam com.raka.lethal.
Sekarang untuk menggunakan class-class yang terdapat pada com.raka.geoms dari luar com.raka.geoms, dengan
menggunakan kata kunci import. Seperti contoh dibawah ini :
PBO/Ayuliana/Revisi 2009
4
package com.drawworks.threedee;
import com.raka.geoms.*;
……
public class Cube {
……
Rectangle r = new Rectangle ();
…..
}
…..
Gambar 9. Mengimpor class.
Jika pemrogram com.drawworks.threedee bermaksud menggunakan class-class yang terdapat pada java.awt juga
dimana terdapat juga class Rectangle, maka saat inilah digunakan fully qualified name. seperti contoh dibawah ini
:
package com.drawworks.threedee;
import com.raka.geoms.*;
import java.awt.*;
……
public class ThreeWorld extends Canvas {
……
com.raka.geoms.Rectangle r = new com.raka.geoms.Rectangle ();
…..
}
…..
Gambar 10. Fully Qualified Name
Package-package didalam harddisk dapat diorganisasikan dalam suatu struktur direktori. File-file class anggota
com.raka.geoms terkumpul dalam struktur direktori. Dapat diambil kesimpulan bahwa tiap-tiap suku kata pada nama
package adalah nama sebuah direktori.
PBO/Ayuliana/Revisi 2009
5