Minggu, 04 Desember 2011

Materi Belajar OOP

 1. Kelas dan Object
Kelas dapat didefinisikan sebagai template/blue-print untuk membuat object. Kelas Pembuatan object dari kelas dikenal dengan nama instansiasi.(Puji Hartono, Pemrograman Aplikasi Wireless dengan Java, 10-11).
Sebagai contoh, kita ambil kelas Manusia, mempunyai atribut nama. Selain itu, ia juga mempunyai method tampilkanNama , kerja, makan. Setiap kelas memiliki konstruktor yang berfungsi sebagai pembentuk object, ia juga berfungsi sebagai procedure yang pertama kali dijalankan ketika object bentukan terbentuk.
Dalam bahasa Java, dapat disajikan dengan code program berikut :
class Manusia{ //Nama File : Manusia.java
String nama;
//konstruktor
Manusia(String n){
this.nama = n;
}
//function mengembalikan nilai nama
String tampilkanNama(){
return nama;
}
//procedure makan
void makan(){ System.out.println("hem...enyak..enyak..enyak...");
}
//procedure kerja
void kerja(){
System.out.println("kerja..kerja...kerja...");
}
}
Kita akan menginstansiasi kelas Manusia menjadi object samson.
class Samson{ // Nama File : Samson.java
public static void main(String args[]){
//instansiasi kelas Manusia menjadi object samson
Manusia samson=new Manusia("samsonasik");
System.out.println("Nama "+samson.tampilkanNama());
samson.makan();
}
}
2. Pewarisan
Salah satu kelebihan pemrograman berorientasi Objek adalah penggunaan ulang kode-kode yang telah dibuat. Pewarisan adalah salah satu cara diantaranya.
Sebagai contoh, kelas Manusia diturunkan menjadi kelas Mahasiswa.
class Mahasiswa extends Manusia{
//konstruktor Mahasiswa
Mahasiswa(String n){
//memanggil konstruktor Manusia
super(n);
}

//method bentukan baru...
void kerja(){
System.out.println("belajar...belajar...");
}
}
Angga adalah seorang Mahasiswa keturunan Manusia, setelah dia kerja, dia makan.
class Angga{
public static void main(String args[]){
Mahasiswa angga = new Mahasiswa("Angga Darmawan");
System.out.println("Nama : "+angga.tampilkanNama());
angga.kerja();
angga.makan();
}
}
Setelah object angga memberi tahu namanya, dia kerja dengan method khusus kelas Mahasiswa dan terakhir dia makan dengan method warisan dari kelas Manusia. Kelas turunan akan mewariskan atribut-atribut dan method-method baseclass/parentclass-nya.
Ketika angga makan, dia makan dengan method Manusia, tetapi ketika kerja, dia kerja dengan method baru yang didefinisikan khusus pada kelas Mahasiswa(“belajar…belajar…”), inilah yang disebut dengan method overriding.

 3. Polimorfisme
Salah satu pilar Pemrograman Berorientasi Objek yang lain adalah polymorfisme yaitu kemampuan beberapa objek bertipe sama bereaksi secara berbeda terhadap pesan
yang sama. (Puji Hartono,Pemrograman Aplikasi Wireless dengan Java, 8-9)
Sebagai contoh, kita tambahkan satu kelas lagi dari kelas manusia, yaitu kelas dosen.
Diimplementasikan dalam bahasa Java :
class Dosen extends Manusia{
Dosen(String n){
super(n);
}
Void kerja(){
System.out.println("mengajar...mengajar...");
}
}
Rino adalah Dosen keturunan Manusia.
class Rino{
public static void main(String args[]){
Dosen rino=new Dosen("Rino Handiarto");
System.out.println(rino.tampilkanNama());
rino.makan();
rino.kerja();
}
}
Hasil running :                                                                                                                                           Rino Handiarto
hem...enyak..enyak..enyak...
mengajar...mengajar...

 Kemudian angga si mahasiswa, dan Rino si dosen, diperintahkan untuk bekerja, nah lho, apa reaksinya ?
class worker{
public static void main(String args[]){
//masukkan dalam array ( -->akan dibahas lebih lanjut...
Manusia[] profesi=new Manusia[2];
profesi[0] = new Mahasiswa("Angga Darmawan");
profesi[1] = new Dosen("Rino Handiarto");
profesi[0].kerja();
profesi[1].kerja();
}
}
Hasil running
belajar...belajar...
mengajar...mengajar...
Dari contoh di atas, terlihat, pesan yang sama, akan menghasilkan reaksi yang berbeda tergantung methodnya.

4. Pengkapsulan
Seorang programmer tentu sudah terbiasa memandang suatu aplikasi ataupun kelas dan interface referensi (API) sebagai suatu modul yang terbungkus rapi. Kita tidak perlu mengetahui implementasi (source code) dari modul-modul tersebut, yang perlu kita ketahui hanyalah variabel/peubah yang menjadi input atau output program tersebut, serta bagaimana ia berinteraksi dengan “dunia luar”.
Pengkapsulan adalah bagaimana kita me-“wrapping” atau membungkus data dan method yang menyusun kelas sehingga kelas tersebut bisa dipandang sebagai suatu modul. Termasuk di sini adalah menentukan hak akses dunia luar terhadap attribute dan method dalam suatu kelas. Dalam dunia pemrograman disebut “Information Hiding”.
(Viddi Mardiansyah, Tiga Pilar OOP, 4-5).
Java menggunakan 3 eksplisit keyword untuk setting batasan / hak akses dunia luar terhadap suatu kelas, yaitu private, protected, dan public.
(Bruce Eckel, Thinking In Java, 36)
Private berarti tidak seorang pun di “dunia luar” boleh mengaksesnya, jika ia berupa atribut, maka akses dari luar hanya bisa dilakukan melalui method, yang tentu saja, method itu tidak bersifat private dunks….
Contoh:
class Resep{
//atribut private ini tidak bisa diisi langsung dari luar kelas..
private String jenis;
private String namakue;
//konstruktor...
Resep(String n){
this.namakue=n;
}
void isiJenis(String j){
this.jenis=j;
System.out.print(this.namakue+" itu “+this.jenis);
}
//function...
String kadaluarsa(){
String tahan="";
String tahan="";
if (jenis.equals("kue basah")){
tahan=" -- > cepet kadaluarsa";
}else{
tahan=" --> lama kadaluarsanya..";
}
//nilai yang dikembalikan..
return tahan;
}
}
Kelas di atas akan diturunkan menjadi kelas Basah, yaitu berisi sifat kue basah.
Kita akan mencoba langsung mengisikan atribut jenis pada kelas parent-nya.
class Basah extends Resep{
Basah(String n){
super(n);
this.jenis="kue basah";
}
}
Apa yang terjadi ketika kita kompilasi ???
F:\”data samson”\modul\modultutorialjava>javac Basah.java
Basah.java:5: jenis has private access in Resep
this.jenis="kue basah";
^
1 error
Error di atas terjadi karena si turunan berusaha langsung mengakses atribut private yang dipunya oleh parent-nya. Gimana cara mengaksesnya? Ya harus memakai method
class Basah extends Resep{
Basah(String n){
super(n);
//methodnya...
isiJenis("kue basah");
}
}
Kue tart adalah jenis kue basah.
class Tart{
public static void main(String args[]){
Basah tart=new Basah("Kue Tart");
System.out.println(tart.kadaluarsa());
}
}
Jika dikompilasi dan dirun akan menjadi seperti ini :
F:\”data samson”\modul\modultutorialjava>javac Tart.java
F:\”data Samson”\modul\modultutorialjava>java Tart
Kue Tart itu kue basah -- > cepet kadaluarsa
Protected hampir sama dengan private, hanya saja, ia bisa diakses oleh kelas bawahannya tanpa menggunakan perantara, jadi bisa secara langsung diakses asalkan memenuhi syarat :
􀃎 Dalam satu kelas itu sendiri, atau kelas bawahannya, ia tidak bisa diakses oleh kelas yang tidak ada hubungan dengan kelas itu sama sekali.
Syarat dan ketentuan berlaku :
Akses tidak melalui instansiasi / pembentukan object, kalau melalui instansiasi, protected hanya tidak bisa diakses ketika dia berada pada package yang berbeda.
Contoh :
package satu;
public class MakhlukHidup{
protected String nyawa;
}
package dua;
import satu.*;
public class Tumbuhan{
public Tumbuhan(String n){
MakhlukHidup mh=new MakhlukHidup();
mh.nyawa="Roh...";
}
}
Hasil setelah dicompale
1 error

 5OVERLOADING
Overloading adalah suatu keadaan di mana beberapa method memiliki nama yang sama tetapi fungsionalitasnya berbeda. (Ali Ridho Barakbah, S.Kom, 9).

 No.
Perbedaan
Overloading
Overriding
1.
Pengertian Dasar
suatu keadaan di mana beberapa method memiliki nama yang sama tetapi fungsionalitasnya berbeda
Suatu keadaan di mana method pada subclass menolak method pada parent classnya. (contohnya sudah pernah dibahas pada modul sebelumnya. )
2.
Ciri-ciri

a. Nama method harus sama
b. Bisa berupa constructor, procedure, maupun function.
c. Daftar Parameter harus berbeda
d. Return type boleh sama, boleh berbeda (jika berupa konstruktor atau prosedur, tidak mempunyai nilai balik).


a. Nama method harus sama
b. Bisa berupa procedure maupun function.
c. Daftar parameter harus sama
d. Return type harus sama(procedure tidak mempunyai nilai balik).



 a Overloading Constructor
Suatu kelas boleh memiliki lebih dari satu konstruktor.Konstruktor yang terdiri dari lebih dari satu konstruktor disebut overloading konstruktor.
Contoh :
class Bentuk3D{
double panjang,lebar,tinggi;
//konstruktor pertama
Bentuk3D(double pj){
this.panjang=pj;
this.lebar=1;
this.tinggi=1;
}
//konstruktor kedua
Bentuk3D(double pj,double lb){
this.panjang=pj;
this.lebar=lb;
this.tinggi=1;
}
//konstruktor ketiga
Bentuk3D(double pj,double lb,double tg){
this.panjang=pj;
this.lebar=lb;
this.tinggi=tg;
}
}

 class ContohBentuk3D{
public static void main(String args[]){
System.out.println("instansiasi pertama => panggil konstruktor pertama\n");
Bentuk3D bentuk=new Bentuk3D(3.5);
System.out.println("Panjang = "+bentuk.panjang);
System.out.println("Lebar = "+bentuk.lebar);
System.out.println("Tinggi = "+bentuk.tinggi);
System.out.println("\ninstansiasi kedua =>panggil konstruktor kedua");
Bentuk3D bentuk2=new Bentuk3D(7.2,2.3);
System.out.println("Panjang = "+bentuk2.panjang);
System.out.println("Lebar = "+bentuk2.lebar);
System.out.println("Tinggi = "+bentuk2.tinggi);
System.out.println("\ninstansiasi ketiga =>panggil konstruktor ketiga");
Bentuk3D bentuk3=new Bentuk3D(5.2,3.5,2.1);
System.out.println("Panjang = "+bentuk3.panjang);
System.out.println("Lebar = "+bentuk3.lebar);
System.out.println("Tinggi = "+bentuk3.tinggi);
}
}
Hasil Compile
Panjang = 3.5
Lebar = 1.0
Tinggi = 1.0
instansiasi kedua =>panggil konstruktor kedua
Panjang = 7.2
Lebar = 2.3
Tinggi = 1.0
instansiasi ketiga =>panggil konstruktor ketiga
Panjang = 5.2
Lebar = 3.5
Tinggi = 2.1

b. Overloading Method (Procedure || Function)
Overloading juga bisa terjadi pada method, baik itu berupa procedure maupun function.
Contoh :
class mobil{
private String merek;
mobil(String m){
this.merek=m;
System.out.println(this.merek+" adalah kendaraan beroda 4");
}
//procedure bergerak
void bergerak(String arah){
System.out.println("melaju ke arah "+arah);
}

//overload procedure bergerak
void bergerak(String arah,int jauh){
System.out.println("melaju ke arah "+arah+" sejauh "+jauh+" km ");
}
}

Hasil Compile :
melaju ke arah maju
melaju ke arah mundur sejauh 3 km

6.STATIC vs FINAL
1. Static (satu-satunya*)
Selama ini, yang kita ketahui adalah suatu variabel atau method diasosiasikan dan diakses melalui suatu instance dari kelas. Nah, sekarang, kita akan belajar tentang hal yang lain, yaitu static modifier yang hidup dalam kelas itu sendiri dan dishare ke seluruh instance dari kelas tersebut. (Pat Niemeyer,Jonathan Knudsen,Learning JavaTM, 2nd Edition, Chapter 5). (semua instance dari class yang sama mempunyai atribut / method yang bersifat milik bersama)(Unknown, *,Pemrograman Berbasis Obyek, Advanced Class Features I, 34 ). Variabel yang dideklarasikan static disebut sebagai variabel static atau variabel class. Begitupun juga terhadap method, disebut method static atau method kelas. Modifier static digunakan untuk variabel, method, dan inner class (tentang inner class akan dibahas lebih lanjut ).
Contoh :
class Sepeda{
//atribut static diinisialisasi...
static int jmlRoda = 2;
}
Sekarang, kita coba tampilkan member static tersebut…
class TesStatic{
public static void main(String args[]){
//instansiasi pertama :)
Sepeda motor = new Sepeda();
motor.jmlRoda =2;
System.out.println("Jumlah Roda Motor = "+motor.jmlRoda);

Hasil compile:
Jumlah Roda Motor = 2
Jumlah Roda Becak = 3
Jreng..jreng...,apa yang terjadi pada jumlah roda motor...
Jumlah Roda Motor = 3

Dari hasil di atas terlihat bahwa atribut jmlRoda dari objek motor berubah menjadi 3, karena jmlRoda telah diubah menjadi 3 oleh objek becak, dari sini jelas bahwa dengan adanya modifier static, berarti member itu milik kelas. Yang dimaksud static itu satu-satunya* bukan berarti kita hanya bisa mendeklarasikan satu member static, tapi karena apabila terjadi perubahan pada member suatu kelas, maka itu akan berlaku pada semua instance yang ada.
Ada satu hal lain lagi tentang member static, yaitu kita bisa saja memanggil member static tanpa harus menginstansiasi dulu, contoh :
class TesStatic2 {
public static void main(String args[]){
//memanggil langsung ke atributnya...
Sepeda.jmlRoda = 2;
System.out.println("Jumlah roda sepeda = "+Sepeda.jmlRoda);
}
}
2. Final (tidak berubah)
Keyword Final bisa berlaku di class, variabel, maupun method. Jika ia menempel pada class, maka ia tidak bisa dibuat subclass, jika pada method, tidak bisa dioverride, jika pada variabel, maka bersifat konstan.
Contoh pada variabel:
class Hitung{
final double phi = 3.14;
int jari2;
Hitung(int jari2){
this.jari2 = jari2;
}
double Luas(){
return jari2*phi;
}
public static void main(String args[]){
Hitung lingkaran = new Hitung(7);
////iilllleeggaall aacccceessss......
lliinnggkkaarraann..pphhii == 33..1155;; ////iilllleeggaall......
System.out.println(lingkaran.Luas());
}
}
Jika kita compile, maka akan tampil pesan kesalahan :
F:\data samson\My Dedication\kumpulanmodul\Java>javac Hitung.java
Hitung.java:12: cannot assign a value to final variable phi
lingkaran.phi = 3.15; //illegal...
^
1 error
Dari sini jelas bahwa variabel yang diberi nilai final bersifat konstan, tidak boleh dan tidak bisa berubah.
Contoh pada class :
final class Tiang{
int tinggi;
}
class Tower extends Tiang{
}
Class Tiang mempunyai modifier final, jadi tidak bisa dibuat subclass, dan jika kita memaksa untuk melakukan pewarisan seperti di atas, maka akan terjadi pesan kesalahan :
F:\data samson\My Dedication\kumpulanmodul\Java>javac Tower.java
Tower.java:5: cannot inherit from final Tiang
class Tower extends Tiang{
1 error