Senin, 04 Januari 2010

abtrak kelas, interface kelas

1
:: abstract class + interface
:: abstract class
Saat kita membuat sebuah superclass, kita tahu bahwa kita dapat memakai semua metode yang
dimilikinya pada class anaknya. Atau kalau kita butuh metode tersebut diperbarui, kita tinggal
melakukan override pada metode tersebut.
Tapi, pada suatu kasus, kita ingin membuat superclass yang bernama LivingThing(makhluk hidup).
Class ini punya beberapa method yang sudah kita kenal seperti makan, bernafas, tidur, dan
berjalan. Ada satu metode yang tidak dapat kita generalisasi. Contohnya adalah method berjalan.
Human sebagai subclass dari makhluk hidup berjalan dengan 2 kaki, sedangkan Dog berjalan
dengan 4 kaki. Untuk membuat superclass yang umum, kita bisa membuat suatu superclass yang
memiliki beberapa metode dengan implementasi dan beberapa tidak. Class ini disebut abstract
class.
Secara umum, abstract class adalah class yang tak dapat diinstansiasi. Biasanya abstract class
berada dalam hierarki tertinggi dalam PBO (pemrograman berorientasi objek).
Metode di dalam abstract class yang tidak berisi kode program adalah abstract method (metode
abstract). Nantinya, method ini harus di-override oleh subclass-nya. Jadi, kita hanya menulis
deklarasi method tanpa tubuh metode dan memakai keyword abstract. Contohnya:
public abstract void iniMetode();
Deklarasi Method ini disebut sebagai prototype method.
Sekarang, kita coba buat abstract class pertama kita:
2
Suatu metode yang sudah dideklarasikan abstract harus diakhiri tanpa memakai tubuh program.
Jika ditulis seperti ini:
maka akan terjadi error seperti berikut:
Ketika sebuah class dibuat sebagai subclass dari class LivingThing, class itu harus meng-override
metode abstract walk(). Jika tidak, class tersebut tidak akan dapat dikompilasi dan akan terjadi
error.
Contoh pembuatan subclass yang benar:
Jika class Human tidak meng-override metode walk(), maka akan muncul pesan error seperti
berikut:
3
Tapi, walau class Human tidak meng-override metode yang lain seperti breath() dan eat() (yang
tidak abstract) tidak akan terjadi error.
Jadi, fungsi abstract class tak lain adalah untuk membuat prototype bagi class di tingkatan paling
atas dalam hierarki class dan subclass-nya yang menyediakan detail implementasi dari abstract
class tersebut.
Question
• Apakah sebuah class biasa bisa memiliki abstract method? Apakah abstract class boleh tidak
memiliki abstract method? Silahkan analisis secara mandiri.
• Bagaimana jika class LivingThing memiliki sebuah constructor? (Mengingat bahwa abstract
class tidak bisa diinstansiasi) Bisakah? Jika bisa, apakah fungsi dan penggunaannya sama
dengan class yang lain?
4
:: interface
interface adalah sebuah blok yang berisi deklarasi metode saja untuk diimplementasikan pada
class lain. Jadi, metode yang ada di dalam interface tidak memiliki kode program (bersifat
abstract). Contoh interface:
Interface ini nantinya berguna untuk membuat satu subclass memiliki lebih dari satu superclass.
Tapi bukan secara extends (inheritance), tapi implements (implementasi).
Coba kita buat class line yang mengimplementasikan interface Relation di atas.
Jika salah satu dari method isGreater(), isLess() atau isEqual() dihilangkan dari class Line ini,
maka akan terjadi error yang mengharuskan kita meng-override semua metode tersebut
(benarkah?). Ini disebabkan karena semua metode yang dideklarasikan di interface harus dioverride
oleh class yang mengimplementasikannya. Kenapa serepot itu? Ini sesuai dengan salah
5
satu fungsi interface 􀃆 membuat suatu class yang bisa diimplementasikan oleh berbagai class
lain yang tidak berelasi sama sekali.
Untuk latihan, misalkan kita mengimplementasikan interface Radio dan Kamera pada class
Handphone seperti di bawah ini:
Fungsi interface sebetulnya cukup jelas adalah untuk membuat satu template untuk class yang
ingin mengimplementasikannya supaya sama dengan template. Atau dengan kata lain, ada
standarisasi dalam mengimplementasikan suatu interface.
Question
- Nah interface hanya dapat diisi dengan deklarasi method saja… Benarkah? Silahkan
lakukan analisis mandiri.
- Semua method di interface adalah abstract. Apakah bisa ditambahi dengan keyword
abstract pada setiap method-nya? Sama saja atau jadi berbeda?
6
:: interface vs abstract class
Perbedaan interface dan abstract class cukup terlihat dari pemakaiannya. interface itu
diimplementasikan dan abstract class itu diturunkan (diwariskan).
Keduanya dapat dipakai bersamaan dalam satu class. Misalkan seperti contoh di bawah ini:
Tambahkan abstract class di atas ke class HandPhone yang sudah kita buat, sehingga class
HandPhone menjadi:
Question
• Apakah kita bisa membuat class baru yang extends dari class HandPhone? Apakah perlu
untuk meng-override semua metodenya juga?
7
Exercise
Buat suatu class Compo yang mengimplementasikan interface Radio dan Tape seperti Class
Diagram di bawah ini. Kemudian buatlah sebuah launcher class untuk mencobanya.
Buatlah abstract class AlatMusik dan diturunkan ke dua class, yaitu class MusikTiup serta class
MusikGesek seperti class diagram di bawah ini.
AlatMusik (abstract)
+setNamaAlat(nama: String)
+setBunyi(bunyi: String)
+getInfo()
MusikGesek
-bunyi: String
-namaAlat: String
-jumDawai: Integer
+MusikGesek()
MusikTiup
-bunyi: String
-namaAlat: String
+MusikTiup()
Tulislah juga suatu launcher class yang membuat sebuah objek terompet yang merupakan
instance dari class MusikTiup yang memiliki atribut bunyi “toet-toet”. Buatlah pula sebuah objek
biola yang merupakan instance dari class MusikGesek yang memiliki atribut bunyi “ngik-ngok” dan
jumlah dawai 4 buah. Setiap kali membuat objek baru

Rabu, 21 Oktober 2009

overriding

Berbeda dengan overloading. Kalo overloading, kita boleh menuliskan method yang sama namun dengan jumlah parameter yang berbeda dan nilai kembalian harus sama. Nah, kalau overriding konsepnya sama dengan overloading yaitu menulis kembali method. Namun, caranya overriding menulis kembali method sama persis. Sama mulai dari nama method dan isinya dan mengimplementasi kembali di sub classnya. Overriding dipakai saat kita menggunakan method yang sama tapi berbeda implementasinya. Jadi overriding method mempunyai nama method yang sama, jumlah parameter dan tipe parameter serta nilai kembalian (return) method yang di override. Jika method memiliki modifier akses public, method overridenya juga harus public.

Contoh:

class Kendaraan {
..............
public String getJenis() {
System.out.println(“Harga BBM turun”);
}
}
class Motor extends Kendaraan {
..............
public String getJenis() {
System.out.println(“Harga BBM premium 4000 rupiah”);
}
}

NB:

* class motor mengextends class kendaraan
* class motor melakukan override method di kendaraan namun berbeda implementasi

Kesimpulan:

* Override method merupakan method yang sama persis dengan method yang sudah ada di super kelasnya, biasanya perbedaannya adalah pada implementasi (program body)
* Overidding tidak bisa dilakukan dalam kelas itu sendiri
* Jadi Overidding kerat kaitannya dengan inheritance (pewarisan)

Contoh lain:

class Lingkaran {
double r;

Lingkaran(double r) {
this.r = r;
}
double Luas() {
return Math.PI*this.r*this.r;
}
double Luas(double r) {
this.r = r;
return Math.PI*this.r*this.r;
}
}
class Tabung extends Lingkaran {
double h;

Tabung() {
//konstruktor kelas turunan, ada super() dan diisi nilai awal
super(0);
}
double Luas(double r) {
//overriding (method and parameter sama)
this.r = r;
return Math.PI * this.r * this.r * this.h;
}
}

NB:

* Class lingkaran melakukan overloading method Luas (beda signature)
* Class tabung mengextends class lingkaran
* Class tabung meng-override method Luas hasil dari overload. Jadi kita juga biosa mengoverride method hasil overloading juga

Keyword Abstract

Kelas abstract hanya berisi deklarasi method tapi tanpa mendefinisikan. Definisi method didefinisikan di sub classnya dan class abstract tidak bisa digunakan untuk membuat objek. Jadi class abstract mendefinisikan method-method atau variabel yang akan dibutuhkan sub-sub classnya (lebih dari 1 sub class).

Contoh

abstract class Bangun {
//class abstract
public abstract double Luas();//method abstract
}

Kesimpulan:

* Kelas abstract adalah kelas yang memakai modifier abstract
* Di dalam kelas abstract bisa berisi variabel anggota maupun method abstract maupun kongkrit
* Jika di dalam suatu kelas terdapat minimal 1 saja method abstract, maka kelas tersebut harus atau pasti abstract
* Kelas abstract tidak bisa diinstansiasi, hanya bisa diextends

Contoh lain (dengam implementasinya):

// KotaWisata.java
public abstract class KotaWisata {
String objekWisata;
public abstract Jalan();
}

//Liburan.java
class Jogja extends KotaWisata {
public Jogja (String objekWisata) {
this. objekWisata = objekWisata;
}
public void Jalan() {
System.out.println(“di jogja objek wisatanya itu candi ” + this.objekWisata)
}
}
class Jakarta extends KotaWisata {
public Jakarta (String objekWisata) {
this. objekWisata = objekWisata;
}
public void Jalan() {
System.out.println(“di jakarta objek wisata yang terkenal itu ” + this.objekWisata)
}
}
class Liburan {
public static void main(String [] args) {
Jogja jgj = new Jogja(“Prambanan”);
jgj.Jalan();
Jakarta jkt = new Jakarta(“Monas”);
Jkt.Jalan();
}
}

Outputnya:
di jogja objek wisatanya itu candi Prambanan
di jakarta objek wisata yang terkenal itu Monas

Interface

About interface:

* Interface adalah kumpulan method-method tanpa implementasi bahkan tidak boleh mempunyai body >> {} >> abstract
* Tujuan dibuat interface adalah untuk memaksa kelas-kelas yang mengimplementasikan interface tersebut melakukan overide method abstrak milik interface
* Interface adalah semacam kelas abstract tetapi hanya boleh mempunyai anggota method abstract dan variabel konstan
* Walaupun tidak dideklarasikan sebagai public abstract, interface selalu public abstract
* Interface hanya dapat mendeinisikan konstanta
* Interface biasa digunakan untuk standarasiasi method atau konstanta
* Class yang mengextends interface dipaksa untuk mengoverride semua method dan definisi konstanta pada interface
* Modifier yang digunakan hanya public atau tidak sama sekali. Jika tidak menggunakan modifier maka interface tersebut hanya dapat diakses dalam package yang sama
* Semua method yang diimplemetasikan harus public
* Jika kita tidak mengimplementasikan semua method yang ada pada interface, maka class tersebut harus dideklarasikan sebagai abstract class

Bentuk umum pendeklarasian interface:

interface {
// method tanpa definisi
// definisi konstanta
}

Contoh:

interface Motor {
int BBM = 4500;
void starting();
void stopping();
}

NB:

* Secara eksplisit tanpa menuliskannya sebenarnya int BBM sudah mempunyai penentu public static final. Jadi tidak usah dituliskan
* Secara eksplisit tanpa menuliskannya sebenarnya method strating dan stopinh sudah mempunyai penentu public abstract. Jadi tidak usah dituliskan

Interfacepun juga bisa diwariskan

Contoh:

interface Motor {
int BBM = 4500;
public void starting();
public void stopping();
}
interface motorGede extends Motor{
int harga = 20000000;
public void service();
}

Penggunaan interface dengan keyword implements.

// Testing.java
interface HargaBBM {
int harga = 4500;
public void cetak();
}
class Berita implements hargaBBM() {
private int hargaNOW = 5000;
public void cetak() {
if (this.hargaNOW == harga) {
System.out.println(“Harga tetap”);
}
else {
System.out.println(“Harga naik, DEMO!!!”);
}
}
}
class Testing {
public static void main (String [] args) {
Berita news = new Berita();
News.cetak();
}
}

Polimorfisme

Polimorfisme bias diartikan seperti kemampuan suatu variable untuk mengubah perangai sesuai dengan objek hasil instansiasi yang digunakan. Polimorfisme membiarkan lebih dari 1 objek dari sub class – sub class dan diperlakukan sebagai objek dari super class tunggal

Contoh:

Mahasiswa cowok = new anakSI();
cowok.methodKU(“Bernaz”);

Mahasiswa cewek = new anakTI();
cewek.mothodKU(“Amelia”);

Outputnya:

* Methodku dengan parameter dengan nilai Bernaz di class anakSI telah dipanggil
* Methodku dengan parameter dengan nilai Amelia di class anakTI telah dipanggil

Masih terasa membingungkan. Prinsipnya hampir sama dengan interface, yaitu memaksa sub classnya untuk mengoverride method-methodnya. Polimorfisme juga bias dijabarkan sifat khusus dari JAVA dimana kita dapat secara otomatis memakai method yang tetap untuk semua objek tanpa memerhatikan asal dari objek sub class. Dan dengan polimorfisme kita dapat menggunakan objek dalam banyak operasi namun prosesnya bias jadi berbeda-beda

Contoh lain:

class SepakBola {
public void showoff() {
System.out.println(“Menangkan pertandingan”)
}
}
class Penyerang extends SepakBola {
public void showoff() {
System.out.println(“Cetak GOL”);
}
}
class Bek extends SepakBola {
public void showoff() {
System.out.println(“Jangan sampai GOL”);
}
}
class Kiper extends SepakBola {
public void showoff() {
System.out.println(“Jaga gawang”);
}
}
public class Tendangan {
public static void main (String[] args) {
SepakBola SB = new SepakBola();
Penyerang P = new Penyerang();
Bek B = new Bek();
Kiper K = new Kiper()

SB.showoff();

SB = P;
SB.showoff();
SB = B;
SB.showoff();
SB = K;
SB.showoff();
}
}

Package and import

Package yang artinya paket biasa digunakan dalam pengorganisasian data. Memang itulah fungsi utamanya, yaitu mengorganisasikan class-class agar mudah diakses dan terorganisir. Biasa disebut juga dengan grouping.

Keuntungan membuat package atau grouping (from JEDI):

* Kamu dan programmer lainnya dapat dengan mudah menentukan class-class dan interface-interface yang berelasi
* Kamu dan programmer lainnya dapat mengetahui dimana untuk mencari class-class dan interface-interface yang dapat menyediakan fungsi grafis yang direlasikan
* Nama class dan interfacemu tidak akan mengalami konflik dengan nama-nama di paket lainnya, karena paket membuat tempat nama yang baru
* Kamu dapat membiarkan class-class di dalam paket untuk mempunyai akses tak terlarang untuk salah satu yang lain selama larangan akses untuk tipe-tipe diluar paket

Dalam penulisan paket. Harus dituliskan di baris program yang pertama.

Agar bisa diakses dari tempat lain caranya:

* class yang akan digunakan ditempat lain harus dibuat package dibaris pertama diberi deklarasi package

package ;

contoh:

package ProgramJAVAku;

* program atau class yang akan memakai class tersebut harus melakukan import dibaris ke-2 klo ada package, pertama klo ga ada package diberi deklarasi import

import .;

contoh:

import ProgramJAVAku.Mahasiswa;

NB: class Mahasiswa (programnya) disimpan di folder bernama ProgamJAVAku

atau

*

import .*;

contoh:

import ProgramJAVAku.*;

* OS diberi tahu dengan cara mengisi variabel lingkungan classpath dengan alamat folder tempat paket-paket yang akan diimport

Contoh penggunaan package (dengan implementasinya):

class main di drive D:\Programku
class yang diakses ada di C:\Javaku\Bernaz

Bilangan.java di simpan di di C:\Javaku\Bernaz

package Bernaz;
public class Bilangan {
private int desimal;
public void setDesimal(int desimal) {
if(desimal>=0) {
this.desimal = desimal;
}
else {
this.desimal = -desimal;
}
}
public int getDesimal() {
return this.desimal;
}
public String biner() {
String hasil="";
int sisa = this.desimal;
do {
hasil = sisa % 2 == 1 ? "1" + hasil : "0" + hasil ;
sisa /= 2;
}
while (sisa > 0);
return hasil;
}
}

Utama.java disimpan di D:\Programku

import Bernaz.Bilangan;
class Utama {
public static void main(String[] args) {
Bilangan x = new Bilangan();
x.setDesimal(-44);
System.out.println("Bilangan biner dari "+ x.getDesimal() + " adalah "+ x.biner());
}
}

Jangan lupa set variabel pathna. Buat new classPath addresna diisi class yang akan diakses (C:\Javaku;.). Jangan lupa konstruktor dan methods pada class yang akan diakses harus public. Semua konstruktor dan methods pada class yang akan diakses harus public. Public baru terasa jika ada komunikasi pada paket yang berbeda-beda.

Try Catch

Try Catch ini adalah salah satu fitur dari Java untuk menangkap eksepsi atau kesalahan. Ya mungkin kita sering melakukan kesalahan dalam membuat program. Nah, dengan menggunakan Try Catch ini kita bisa menangkap kesalahan itu.

Eksespsi bisa berupa kesalahan penulisan kode, kesalahan saat menjalankan method dan sebagainya.

Bentuk umum Try Catch

try {
;
}
catch() {
;
}
finally {
;
}

Di blok program di dalam Try itu adalah program yang akan dijalankan dan akan ditangkap eksepsinya jika terjadi kesalahan. Dan yang di blok catch adalah blok yang dijalankan jka terjadi eksepsi, jadi pesan kesalahannya di dalam catch ini. Biasanya berupa statement. Finally sebenarnya hanya pelengkap saja dan jarang digunakan. Ini bisa dibayangkan sebagai footer, yaitu akan keluar di akhir atau dijalankan di akhir. Mungkin akan lebih jelas dengan contoh di bawah ini:

class Coba {
public static void main(String[] args) {
System.out.println("star program\n");
try{
System.out.println(10/0);
}
catch(Throwable b) {
System.err.println("terjad kesalahan >> "+b.getMessage());
}
finally {
System.out.println("Pembagian nol\n");
}
System.out.println("end of program");
}
}

Outputnya

start program

terjadi kesalahan >> / by zero

pembagian nol

end of program

NB:

* Program dibaca dari atas, mencetak start program terlebih dulu setelah itu baru masuk try
* Di blok program try terjadi kesalahan. Kesalahannya, bilangan berapapun jika dibagi nol itu tidak bisa atau tidak terdefinisi.
* Blok catch mencetak kesalahannya. Catch mempunyai parameter b yang berkelas Throwable. Throwable adalah kelas yang ada di package java.lang yang menangani eksepsi dan merupakan turunan dari kelas objek (kelas tertinggi di JAVA). Dan perlu diketahui blok ini akan dijalankan jika terjadi eksepsi saja.
* System.err.println untuk mencetak kesalahan dan getMessage() adalah method untuk menampilkan kesalahan yang terjadi.
* Blok finally itu bisa dikatakan seperti footer, jadi akan dijalankan di bagian terakhir saja dan akan tetap dijalankan walaupun tidak terjadi kesalahan atau eksepsi sekalipun
* Setelah selesai akan keluar dari Try Catch dan mencetak end of program.