File

Selasa, 04 Oktober 2011


PEMROGRAMAN BERORIENTASI OBJEK
Belajar PBO, berarti harus membiasakan diri berpikir secara kelas dan objek setiap menghadapi masalah.
Contoh :
Buatlah program untuk menghitung keliling lingkaran dari masukan jari-jarinya !
Masalah tersebut bila disajikan dengan pendekatan kelas dan objek, harus direvisi sebagai berikut :
Buatlah kelas lingkaran yang memiliki tanggungjawab mengetahui jari-jarinya dan kelilingnya, lingkaran tersebut dapat melakukan aksi mengembang dan berkerut sesuai dengan panjang jari-jarinya.








Sylabi
1.             Pengantar
2.             Kelas, Method dan Modifier
3.             Objek
4.             Package
5.             Information Hiding, Encapsulation, Inheritance, dan Polymophism
6.             Kelas Inner, Kelas Abstract, dan Interface
7.             Exception Handling
8.             Kelas-Kelas Dasar
9.             MultiThreading










BAB I. Pengantar
(Identifier, Keyword, Literal dan Tipe Data, Operator, Separator)

1.1.            Pengantar
Bahasa java yang telah dirilis :
1.        Product Sun Microsystem : j2se, j2me, j2ee
2.        Product Borland : JBuilder
3.        Product Microsoft : Visual J
Spesifikasi j2ee antara lain JDBC, JDOM (untuk XML),  Remote Method Invocation, Enterprise Java Beans, Java Messaging, Java Server Pages, Java Servlet, Socket Programming, dan SQLJ.
Java/Standard Development Kit (JDK/SDK) merupakan alat-alat utama bagi programmer untuk membuat dan menjalankan java.
Development Kit dapat didownload di :


Komponen JDK antara lain compiler(javac), interpreter(java) disebut juga java virtual machine atau java runtime environment, applet viewer(appletviewer), debugger(jdb), java class library(jcl), header dan stub generator(javah), dan yang paling penting yaitu java documentation(javadoc).
Penjelasan penggunaan komponen JDK :
1.        Kompilator (javac)
       Bertugas untuk melaksanakan kompilasi
       *.java menjadi *.class
       Syntax umum : javac nama.java
2.    Interpreter (java)
       Bertugas untuk menjalankan bytecode (*.class)
       Syntax umum : java nama.class
3.        Applet Viewer
       Digunakan untuk menjalanakan applet viewer, namun sekarang sudah digantikan browser.
       Syntax umum : appletviewer nama.html
4.        Java Debugger
Bertugas untuk melakukan debugging aplikasi java. Syntax umum : jdb option
5.        Java Class File Diassembler (javap)
Bertugas membuat daftar method dan attribute public dari suatu kelas.
Syntax : javap namaKelas
6.        Java Header and Stub Generator
Bertugas menerjemahkan bahasa yang ditulis dalam bahasa java menjadi bahasa C.
Syntax umum : javah namaKelas
7.        Java Documentation Generator
Menampilkan pustaka kelas, interface, constructor, dan method standard yang telah dibuat vendor.
Dari hasil instalasi, dokumentasi ini dapat dilihat di pada  C:\java\docs\api\index.html atau
C:\Program Files\NetBeans3.6\docs\junit\index.html
8.        Source Code Java API
Source code ini dapat diperoleh dari file src.zip.




Untuk pemrogram pemula lingkungan pemrograman java dapat diringkas menjadi :
1.        Editing source code menggunakan editor teks.
2.        Compiling menggunakan keyword javac melalui command promp (dapat juga dari editor teks).
3.        Executing menggunakan : 
a.        Keyword java melalui command prompt (dapat juga dari editor teks)
b.       Browser atau applerviewer untuk applet.

Token
Token adalah elemen terkecil di program yang masih memiliki arti. Ada 5 token dalam bahasa java yaitu identifier, keyword, literal dan tipe data, operator, serta separator.

Identifier
Identifier adalah token yang merepresentasikan nama sesuatu. Sesuatu tersebut adalah variabel, atau konstanta, atau attribute, atau method, atau kelas, atau package, atau interface, atau nama file, dan lain-lain.
Keyword
Kata kunci digunakan untuk suatu tujuan tertentu. Ada 51 keyword dalam java yaitu :
abstract
continue
for
new
switch
boolean
default
goto
null
synchronized
break
do
if
package
this
byte
double
implements
private
threadsafe
byvalue
else
import
protected
throw
case
extends
instanceof
public
throws
catch
false
int
return
transient
car
final
interface
short
true
class
finally
long
static
try
const
float
native
super
void




while

Literal dan Tipe Data Primitif
Literal adalah nilai variabel/attribute atau nilai konstanta atau nilai objek data. Ada tiga besaran literal dalam java yaitu angka, karakter, dan string.
Angka terdiri dari byte, short, int, long, float, double, dan boolean (dianggap angka true = 1 atau false = 0)
Semua variabel dan konstanta  yang akan digunakan harus dipesan terlebih dahulu dalam deklarasi.
Bentuk umum :
TipeData namaVar = ungkapan_atau_nilai;
TipeData namaVar1, namaVar2, …;
[modifier] static final TipeData NAMAKONSTANTA = nilai;
Contoh deklarasi :
double a=3, b=4;
double c = Math.sqrt(a*a+b*b);
static final PHI=3.14;
static final double CM_PER_INC = 2.54;
Berikut tabel jangkauan dan ukuran dari semua tipedata sederhana dalam java :
Tipe Data Primitif
Jangkauan
Ukuran (bit)
byte
-128 s/d 127
8
short
-32767 s/d 32767
16
int
-2147483648 s/d 2147483647
32
long
-9223372036854775808 s/d
9223372036854775807
64
char
sebuah Unicode
16
float
3.4e-038 s/d 3.4e+038
32
double
1.7e-308 s/d 1.7e+308
54
boolean
false = 0 atau true = 1
8


Operator
Operator melakukan komputasi terhadap satu/dua objek data. Operan yang dioperasikan dapat berupa literal, variabel, atau nilai yang dikirim method.
Berikut tabel dan hirarki operator :
Prioritas
Kelompok Operator
Keterngan
1
.  []  ()
Sekaligus
2
++var, --var, ~, instanceof
preincrement, predecrement, unary, instance dari kelas …
3
(type) (casting)

4
!
Not
5
*, /, %
perkalian, pembagian, modulus
6
+, -
penjumlahan, pengurangn
7
<<, >>, >>>
geser untuk bil biner
8
<, >, <=, >=
pembandingan
9
==, !=
kesamaan, ketidaksamaan
10
&
and
11
^
exclusive or
12
|
unconditional or
13
&&
conditional and
14
||
conditional or
15
? :
shorthand untuk if..then…else…
16
=, +=, -=, *=, /=, %=, ^=
operator penugasan
17
&=, |=, <<=, >>=, >>>=
operator penugasan
18
var++, var--
postincrement, postdecrement
Separator
Separator menginformasikan ke compiler java mengenai adanya kelompok kode program.
Berikut adalah daftar separator di java :
Notasi
Nama
Deskripsi
(…)
kurung
mengelompokkan parameter method.
{…}
kurung kurawal
mengelompokkan nilai-nilai suatu array,
mendefinisikan blok kode kelas ataupun kode method.
[…]
kurung siku
mendeklarasikan tipe array
:
titik koma
mengakhiri pernyataan, merangkai pernyataan-pernyataan di dalam for.
,
koma
memisahkan identifier-identifier di bagian deklarsi variable.
.
titik
memisahkan nama-nama package,
memisahkan kelas dari objek,
dan objek dari method.






Keyword break, continue, dan return
Kelompok keyword ini pada prinsipnya merupakan kendali jump (variasi lain dari goto), sehingga berakibat pengabaian sisa instruksi.

Penggunaan keyword break
Ada dua penggunaan keyword break, yaitu untuk keluar dari kendali percabangan switch, dan untuk keluar dari kendali perulangan.
Dengan keyword ini berarti percabangan/perulangan akan diakhiri, kemudian eksekusi dilanjutkan ke pernyataan setelah blok percabangan/perulangan tersebut.
Contoh :
public class ContohBreak {
    public static void main(String args[]) {
        int i = 0;
        do {
           i++;
           System.out.println(i);
           if (i==5) break;
        } while (i <= 9);
    }
}

Penggunaan keyword continue
Penggunaan keyword ini untuk segera lompat ke perulangan berikutnya. Pernyataan-pernyataan setelah keyword continue dalam blok perulangan saat itu berarti diabaikan.
Contoh :
public class contohContinue {
    public static void main(String args[]) {
        int i=0;
        do {
           i++;
           if (i==3) continue;
           System.out.println(”iterasi ke : “+i);
           if (i==5) break;
        } while(i <= 9);
    }
}
   







Penggunaan keyword return
Keyword ini digunakan untuk keluar dari suatu method, pernyataan-pernyataan setelah keyword ini dan masih dalam blok method tersebut, berarti diabaikan, kemudian eksekusi dilanjutkan ke pernyataan setelah blok method tersebut.
Contoh cuplikan program :
int abs(int x) {
    if (x >= 0)
        return x;
    else
        return(-x)
   
    }
} 









BAB II. KELAS, METHOD, DAN MODIFIER
Apapun konsep yang diimplementasikan di java harus dikapsulkan ke dalam kelas.
Kelas mendefinisikan sekumpulan objek yang memiliki kesamaan keadaan dan perilaku.
Ada dua kelompok kelas, yaitu kelas standard dan kelas yang didefinisikan sendiri. Kumpulan dari method/kelas standard dalam java dikenal dengan API (Aplication Programming Interface).

2.1. Pengertian Kelas
Kelas digunakan untuk membuat objek, dan berperan sebagai tipe data dari objek. Kelas merupakan sarana pengkapsulan kumpulan data dan kumpulan method yang mengoperasikan kumpulan data tersebut.

2.2. Anatomi Kelas
Bentuk umum struktur anatomi kelas sebagai berikut
(modifier1) class NamaKelas (modifier2) {
     classbody
}
Classbody terdiri dari attribute, constructor, dan method.
Modifier pada anatomi kelas, sifatnya optional, digunakan berdasarkan kebutuhan. Modifier menunjukkan sifat-sifat tertentu dari : kelasnya, methodnya, atau attributenya.
Ada 10 keyword yang digunakan sebagai modifier1 dan dikelompokkan menjadi :
1.        Modifier akses (public, protected, default, private)
2.        Modifier final
3.        Modifier static
4.        Modifier abstract
5.        Modifier synchronized
6.        Modifier native
7.        Modifier storage (transient, volatile)
Modifier yang memiliki sifat saling kontradiktif yaitu static dan abstract. Sementara static tidak boleh memberi sifat pada interface, dan keyword super tidak boleh digunakan pada method static.
Ada 2 keyword yang sering digunakan sebagai modifier2, yaitu extends dan implements.
2.3. Deklarai Attribute (Variabel Anggota Data)
Deklarasi diletakkan di dalam classbody (di luar method). Bentuk umum deklarasi attribute :
[modifier] tipedata namavariabel;
[public] [static] final tipedata NAMA_KONSTANTA = nilai;
Contoh :
public class CircleClass {
    public static final double PI = 3.14159265358979323846;
     public double x, y, r;
     // dan seterusnya
}
2.4. Method
Method merupakan tingkah laku dari suatu objek atau kelas, jika bersifat static berarti tingkah laku semua objek dalam kelas tersebut.
Method diletakkan di dalam classbody (sebaiknya tidak diletakkan dalam method lain).
Bentuk umum method :
[modifier] tipe_return_value namaMethod(tipe parameter) {
    methodbody;
}
Modifier boleh lebih dari satu (dipisah oleh spasi).
Pasangan tipe dan parameter dapat lebih dari satu (dipisah oleh koma).
Bentuk umum method main() sebagai berikut :
[modifier] tipe_return_value main(String args[]) {
    methodbody
}
Ada tiga sintaks pemanggilan suatu method :
namaMethod([nilaiParamater]);
namaObjek.namaMethod([nilaiParamater]);
namaKelas.namaMethod([nilaiParamater]);
Tidak semua member (class, attribute, dan method) dapat diakses method, berikut tabel aksesnya :
Method
member (class, attribute, method)
Static
static
boleh lewat objek ataupun class,
boleh langsung kalau dalam kelas sendiri
Static
non static
hanya boleh lewat objek,
langsung tidak boleh,
lewat class tidak boleh
Non static
static
boleh lewat objek ataupun class,
boleh langsung kalau dalam kelas sendiri
Non static
non static
hanya boleh lewat objek,
langsung tidak boleh,
lewat class tidak boleh

Method dasar ada dua jenis yaitu getter() dan setter().
Contoh :
public class Dog {
    private int weight; // information hiding
    public int getWeight() {   //getter
        return weight; 
    }
    public void setWeight(int newWeight) {   //setter
        weight = newWeight;
    }
}
public class TesDog {
    public static void main(String[] args) {
        Dog d = new Dog(); // membuat objek d
        d.setWeight(42); // input
        System.out.println(”Dog d’s weight is ”+d.getWeight())
}








2.4.1. Overloading terhadap Method
Maksud overloading disini bukan overloading terhadap operator sebagaimana C++. Overloading disini adalah mendefinisikan dua atau lebih method di dalam kelas yang sama, dengan nama yang sama, namun dengan deklarasi parameter yang berbeda.
Java interpreter mampu membedakan method mana yang dieksekusi dengan mengenali tipe parameter yang dilewatkan ke method, serta mengenali return valuenya.
Tugas dari method-method yang dioverloading tersebut berbeda.










Contoh overloading terhadap method :
import java.lang.*;
public class Perkalian {
    private double pangkat(int a, int b) {
        double hasil = 1.0;
        //kode program
        return hasil;
    }
    private double pangkat(double a, int b) {
        double hasil = 1.0;
        //kode program
        return hasil;
    }
    private double pangkat(int a, double b) {
        double hasil = 1.0;
        //kode program
        return hasil;
    }
    private double pangkat(double a, double b) {
        double hasil = 1.0;
        //kode program
        return hasil;
    }
    public static void main(String[] args) {
         Perkalian kali = new Perkalian();
         System.out.println(kali.pangkat(10,308));
             
         // dst untuk data yg lain
    }
}

2.4.2. Keyword this
this adalah objek yang langsung digunakan tanpa didahului proses instansiasi.
Penggunaan keyword ini yaitu bila ada attribute (non static) dari suatu kelas akan digunakan method yang berada dalam kelas yang sama, namun nama attribute tersebut dan nama parameter yang dilewatkan pada method tersebut SAMA.
Keyword ini dapat digunakan secara implicit maupun eksplisit.
Contoh penggunaan yang eksplisit :
class RectangleToy {
    private double width, height;
    public void setRectangle(double width, double height) {
        this.width = width;
        this.height = height;
    }
}
Pemanggilan attribute yang eksplisit, biasa digunakan untuk mengatasi panamaan yang sama. Pada contoh ini parameter di method setRectangle() menggunakan nama yang sama dengan attribute di kelas RectangleToy.

Contoh pemanggilan implisit :
class RectangleToy {
    private double width, height;
     public void setRectangle(double newwidth, double newheight) {
        width = newwidth;
        height = newheight;
    }
}

2.5. Constructor
Pada prinsipnya constructor adalah method yang tidak memiliki return value (secara implisit adalah instant dari kelasnya), hanya saja namanya sama dengan nama kelas, dan dapat diberi modifier akses (public, protected, default, private).
Bentuk umum pendefinisian constructor :
[modifier] namaConstructor(tipe namaparameter) {
    constructorBody;
}
Tujuan constructor dibuat adalah untuk melakukan inisialisasi yang diperlukan objek baru.



Contoh constructor dan overloadingnya :
class PersonToy {
    String name;
    String addressLine1;
    String addressLine2;
    String city;
    int age;
    public PersonToy() {
        name = ” ”;
        addressLine1 = ” ”;
        addressLine2 = ” ”;
        city = ” ”;
        age = 0;
    }
    public PersonToy(String newName,
                                  String newAddress1,
                                  String newAddress2;
                                  String newCity;
                                  int newAge) {

       name = newName;
       addressLine1 = newAddressLine1;
       addressLine2 = newAddressLine2;
       city = newCity;
       age = newAge;
    }
}



2.6. Modifier
Modifier1 untuk menentukan sifat dari suatu kelas dan menentukan preveledge (hak akses) dari kelas lain. Modifier2 untuk menentukan relasi (extend atau implements) dengan kelas lainnya.
Wilayah modifier akses, dalam bentuk tabel :
Wilayah Akses
public
protected
default
private
Di kelas yg sama
Beda kelas,
di package yg sama
x
Beda kelas,
beda package,
di kelas turunan
x
x
Beda kelas,
beda package,
tidak di kelas turunan
x
x
x
Wilayah modifier akses tersebut dapat diilustrasikan:
                                           
                           public
                     
                               protected
                       
                                      default
                                  
                                              
                                           private




2.6.1. Public
Menyatakan bahwa kelas/method/attribute tersebut dapat diakses oleh kelas lain dimanapun.

2.6.2. Protected
Menyatakan bahwa kelas/method/attribute tersebut dapat diakses oleh kelas lain yang berada dalam satu package atau kelas lain tersebut merupakan turunannya.

2.6.3. Private
Menyatakan bahwa kelas tersebut tidak dapat diakses sama sekali oleh kelas lain bahkan juga tidak dapat diturunkan.
Berarti attribute-attribute yang private hanya dapat diakses oleh method-method dalam kelas yang sama, kelas lain masih dapat mengakses melalui method-method tersebut asal modifiernya public.
Pertimbangan suatu attribute dideklarasikan private :
1.            Bila kelas lain tak memerlukan attribute tersebut.
2.            Melindungi suatu attribute dari kemungkinan nilainya diubah oleh method lain dari kelas lain.
Final (no extended, no overrided)
Menyatakan bahwa suatu kelas tidak dapat menurunkan (extend) kelas lain.
Menyatakan bahwa suatu method tidak dapat dioverride oleh method lain.
Membentuk suatu attribute menjadi konstanta.

Static (no need instanciation, no overrided)
Method dan attribute ada dua jenis, yaitu method dan attribute milik kelas serta method dan attribute milik suatu objek.
Method dan attribute milik kelas, diakses melalui tiga cara, pertama melalui nama kelasnya, kedua melalui nama objek yang diinstant dari kelasnya, dan ketiga bebas tanpa didahului nama kelas atau nama objeknya.
Method dan attribute milik objek, diakses hanya melalui nama objeknya.
Method static tidak bisa dioverride. Method main() harus memiliki modifier static.

Modifier static artinya method dan attribute milik kelas, menjadi sifat bersama dari semua objek dalam kelas tersebut (tidak memerlukan instansiasi objek untuk menjalankannya).
Contoh System.out.println() bersifat static artinya untuk memanggil method println() tidak harus dilakukan instansiasi dari kelas System.

2.6.6. Abstract (no instanciation, should be overrided)
Abstract class adalah kelas murni (tanpa objek) dan tidak boleh memiliki objek (tidak boleh ada instansiasi) serta method-method yang abstract harus disempurna-kan oleh kelas turunannya melalui override.
Kelas seperti ini biasanya merupakan root suatu struktur kelas.
Konsekuensi penggunaan sifat abstract :
1.        Tidak dapat dibuat constructor yang abstract.
2.        Tidak dapat dibuat method yang static dan abstract (kedua sifat saling kontradiktif).
3.        Tidak diijinkan membuat method yang private dan abstract (kedua sifat ini juga saling kontradiktif).
2.6.7.                  Synchronized (khusus modifier method)
Pada lingkungan multithread, dimungkinkan lebih dari satu jalui eksekusi yang berjalan di kode yang sama, kondisi tersebut dapat diatur sehingga pada selang waktu tertentu hanya ada satu jalur eksekusi yang diijinkan di method yang synchronized (eksekusi dilakukan secara mutual exclusive).

2.6.8.                  Native (khusus modifier method)
Modifier ini digunakan untuk memanggil/mengakses method yang ditulis dalam bahasa C/C++.
Seperti method yang abstract, method yang native hanya berupa prototype, implementasi method ini berada di file external (dalam folder yang sama).

2.6.9.                  Transient (khusus modifier attribute)
Java memiliki konsep serialisasi, yaitu kemampuan untuk mentransformasikan objek menjadi suatu stream, sehingga objek dapat ditransfer dari suatu aplikasi ke aplikasi lainnya, atau dari suatu workstation ke workstation lainnya. Prinsip ini digunakan dalam aplikasi client-server.
Salah satu ketentuan serialisasi adalah tidak boleh ada perubahan nilai attribute suatu objek, saat objek tersebut ditransformasikan menjadi stream, dan sebaliknya, namun suatu objek dapat memiliki nilai attribute yang boleh berubah (bersifat transient).

2.6.10.                    Volatile (khusus modifier attribute)
Dalam manajemen thread, java dapat menyimpan nilai suatu attribute (yang sering diakses thread) menjadi cache value, sehingga tidak perlu selalu merujuk ke lokasi memori aslinya.
Attribute tersebut bersifat volatile, karena nilainya rentan berubah bila diakses oleh lebih dari satu thread.

2.6.11.                    Extends
Bila terjadi pewarisan, kelas yang mewariskan method dan attributenya disebut kelas super, sedangkan yang diwariskan disebut subkelas.
Kelas yang memiliki modifier ini berarti merupakan subkelas dari suatu kelas super.
Caranya :
[modifier1] class NamaSubKelas extends NamaKelasSuper {
    classBody
}

2.6.12.                    Implements
Kelas yang memilki modifier2 implements artinya kelas tersebut mengimplementasikan satu atau lebih interface. Bila terdapat lebih dari satu interface, gunakan tanda koma di antara interface-interface tersebut.
Caranya :
[modifer] class NamaKelas implements NamaInterface1, NamaInterface2 {
    classBody
}






BAB III. OBJEK
Pada prinsipnya objek adalah sebuah pointer. Selama tidak bersifat static, programmer dapat melakukan sesuatu hanya terhadap objek tertentu dari kelas.

Siklus Hidup Objek
Suatu objek di java, terlebih dahulu harus dideklarasikan, setelah itu mengalami pembuatan, penggunaan, kemudian penghancuran.

Deklarasi dan Pembuatan/Instansiasi Objek
Ilustrasi :
MyClass mc;                                        MyClass

Ditentukan variabel mc dengan tipe MyClass, dalam deklarasi mc masih berupa pointer dan belum menunjuk alokasi memori. Keyword new diperlukan untuk membentuk objek tsb sekaligus memanggil constructor.
MyClass
~var1 : int
~var2 : String

+method1:int
+method2:void
 
mc = new MyClass()                  MyClass        
 


Ada 4 cara untuk melakukan deklarasi dan pembuatan objek (ingat NamaKelas = NamaConstructor)
Cara1 :
NamaKelas namaObjek;  // deklarasi
namaObjek = new NamaConstructor(); // pembuatan
Deklarasi dan pembuatan objek boleh jadi satu dalam suatu kelas. Deklarasi dan pembuatan objek boleh dipisah di kelas yang berbeda, misalnya deklarasi objek di method main() pada kelas1, sedangkan pembuatan/instansiasi  objek berada pada kelas2.
Cara2 :
NamaKelas namaObjek = new NamaConstructor();
Artinya dua proses deklarasi dan pembuatan dijadikan satu.
Cara3 :
new NamaConstructor();
Cara ini objek diinstansiasi tanpa nama, tujuannya hanya untuk menjalankan constructor.
Cara4 :
New NamaKelas(”…..”).namaMethod();

Penggunaan Objek
Penggunaan objek sebenarnya untuk memanggil method yang merupakan sifat objek tersebut.
Bentuk umum :
namaObjek.namaMethod([daftarNilaiParameter]);
namaObjek.namaAttribute;

Penghancuran Objek
Teknik yang digunakan java untuk menangani objek yang sudah tidak diperlukan lagi disebut garbage collection. Objek yang sudah tidak diperlukan lagi akan terdeteksi oleh JVM, sehingga secara otomatis dihancurkan oleh garbage collector (bukan oleh programmer).







BAB IV. PACKAGE
4.1. Pengertian Package
Package adalah sarana/cara pengelompokkan dan pengorganisasian kelas-kelas dan interface yang sekelompok menjadi suatu unit tunggal dalam library.
Package juga mempengaruhi mekanisme hak akses ke kelas-kelas di dalamnya.

4.2. Pengaruh Package terhadap Method main()
Kelas yang mengandung method main() memilki syarat tidak berada dalam suatu package, dan hirarki posisi foldernya di atas package yang diimport.

4.3. Membuat Package
Ada tiga langkah untuk membuat package :
1.        Mendeklarasikan dan memberi nama package.
2.        Membuat struktur dan nama direktori yang sesuai dengan struktur dan nama package.
3.        Mengkompilasi kelas-kelas sesuai dengan packagenya masing-masing.

4.4. Mendeklarasikan dan Memberi Nama Package
Deklarasi package harus diletakkan pada bagian paling awal (sebelum deklarasi import) dari source code setiap kelas yang dibungkus package tersebut.
Bentuk umum deklarasi package :
package namaPackage;
Deklarasi tersebut akan memberitahukan kompilator, ke library manakah suatu kelas dikompilasi dan dirujuk.
Syarat nama package :
1.        Diawali huruf kecil
2.        Menggambarkan kelas-kelas yang dibungkusnya
3.        Harus unik (berbeda dengan nama package standard)
4.        Merepresentasikan path dari package tersebut.
5.        Harus sama dengan nama direktorinya.
Contoh package standard :
java.lang (berisi kelas-kelas fundamental yang sering digunakan).
java.awt dan javax.swing (berisi kelas-kelas untuk membangun aplikasi GUI)
java.io (berisi kelas-kelas untuk proses input output)
4.5.            Membuat Struktur Direktori
Pada langkah ini, buatlah direktori menggunakan file manager (di windows menggunakan explorer) sesuai struktur package dari langkah sebelumnya. Kemudian tempatkan kelas-kelas tersebut ke direktori yang bersesuaian (mirip seperti  menyimpan file-file ke dalam folder).
Package dapat bersarang di package lain, sehingga dapat dibuat hirarki package.
Bentuk umum pernyataan package multilevel :
package namaPackage1[.namaPackage2[.namaPackage3]];
Contoh hirarki package di JDK :
package java.awt.image;

4.6. Compile dan Run Kelas dari suatu Package
Selanjutnya masing-masing kelas tersebut dalam package tersebut dikompilasi menjadi byte code (*.class). Artinya package tersebut siap digunakan.



4.7.            Menggunakan Package
Ada dua cara menggunakan suatu package yaitu :
1.            Kelas yang menggunakan berada dalam direktori (package) yang sama dengan kelas-kelas yang digunakan. Maka tidak diperlukan import.
2.            Kelas yang menggunakan berada dalam direktori (package) yang berbeda dengan kelas-kelas yang digunakan. Maka pada awal source code di kelas pengguna harus mencantumkan :
import namaPackage.NamaKelas;  atau
import namaPackage.*;
Contoh :
import java.text.DecimalFormat;
import javax.swing.*;

4.8. Setting Classpath
Path hirarki package, didaftarkan sebagai salah satu nilai variabel lingkungan yang bernama Classpath.
Classpath diset dengan aturan : berawal dari drive (C:\ atau D:\) sampai dengan satu tingkat sebelum kita mendeklarasikan package.
BAB V. INFORMATION HIDING, ENCAPSULATION, INHERITANCE, DAN POLYMORHISM

5.1. Latar Belakang Encapsulation
Vendor perangkat lunak computer merahasiakan source code produknya,  user hanya diberitahu melalui manual cara  menggunakan produknya.
Programmer java pun tidak perlu mengetahui bagaimana rinci source code dari modul antarmuka referensi (API), programmer hanya perlu tahu return value dan parameter milik method-methodnya, atau hanya perlu tahu parameter milik constructor-constructornya.

5.2. Information Hiding dan Encapsulation
Information Hiding adalah menyembunyikan attribute suatu objek dari objek lain.
Encapsulation adalah menyembunyikan method suatu objek dari objek lain.
Attribute maupun method disembunyikan dengan cara memberikan modifier private.
Method dalam kelas yang sama, yang memberikan nilai pada attribute private disebut method setter, sedangkan method masih dalam kelas yang sama, yang mengambil nilai dari attribute private disebut getter.
// Contoh program Information Hiding dan Encapsulation
public class PersegiPanjang{
    private double panjang; // attribute yg di hide
    private double lebar;      // attribute yg di hide
    private double tinggi;     // attribute yg di hide
    public PersegiPanjang() {
        panjang = 0;
        lebar = 0;
    }
    private double luas(double p, double l) {   // di encap
        return p*l;
    }
    public void setPanjang(double panjang) {
        this.panjang = panjang;
    }
    public void setLebar(double lebar) {
        this.lebar = lebar;
    }
    public double getPanjang() {
        return panjang;
    }
    public double getLebar() {
        return lebar;
    }   
    public double getLuas() {
        return luas(panjang, lebar);
    }
}
public class MainPersegiPanjang {
    public static void main(String[] srgs) {
       PersegiPanjang pp = new PersegiPanjang();
       pp.setPanjang(10);
       pp.setLebar(20);
       System.out.println(”Panjang : ”+ pp.getPanjang());
       System.out.println(”Lebar : ”+ pp.getLebar());
       System.out.println(”Luas : ”+ pp.getLuas());
    }
}
 
5.3. Inheritance
Semua attribute dan method dari suatu kelas super dapat diwariskan ke subkelas.
Dalam hirarki kelas, jika kelas C merupakan turunan kelas B, dan kelas B merupakan turunan kelas A, maka otomatis attribute dan method kelas A juga diwariskan kelas C.
Bentukpewarisan :
[modifier] class namaSubKelas extend namaKelasSuper {
   // classBody
}




5.4. Manfaat Pewarisan
Tanpa inheritance, maka semua attribute dan method yang pernah dibuat dan butuhkan kelas lain, harus ditulis ulang seluruhnya.
Dengan inheritance, seorang programmer ingin memodifikasi suatu attribute atau method yang dimanfaatkan subkelas, maka dilakukan modifikasi attribute dan method tersebut pada kelas supernya.

5.5. Overrriding Attribute dan Method
Overriding adalah kemampuan suatu subkelas untuk memodifikasi attribute dan method milik kelas supernya (tentu yang memiliki sifat private atau final tidak biasa dilakukan overriding).
Modifikasi yang dilakukan, misalnya jumlah parameter, tipe parameter, tipe return value, ataupun lingkungan pemrosesan datanya.







// Contoh program overriding
class KelasSuper {
    public void methodAsli() {
        System.out.println(”Method milik KelasSuper jalan”);
    }
    public static void main(String[] args) {
        KelasSuper oks = new KelasSuper();
        oks.methodAsli();
    }
}

class SubKelas extends KelasSuper {
     public void methodAsli() {
        System.out.println(”Method yg overrided jalan”);   
    }
    public void methodPemanggil() {
        System.out.println(”Method pemanggil methodAsli jln”);
        super.methodAsli();  // yg dipanggil milik kelas super
    } 
    public static void main(String[] args) {
        SubKelas osk = new SubKelas();
        osk.methodAsli();
        osk.methodPemanggil();
    }
}









5.6. Menggunakan Method dan Constructor Kelas Super
Java tidak memperbolehkan subkelas memanggil contructor milik kelas supernya dengan cara hanya memanggil namanya.
Cara yang benar :
super();
super(tipe parameter);
Cara yang pertama, akan memanggil constructor default milik kelas supernya, sedangkan cara kedua, akan memanggil constructor kelas supernya yang sesuai dengan parameter tersebut.
Jika ada overriding, misal nama methodnya namaMethod(), maka cara pemanggilan method (non static) milik kelas super :
super.namaMethod();  // perhatikan contoh pada 5.5
Sehingga dapat dibedakan namaMethod() milik siapa yang dipanggil.

5.7. Polymorphism
Polymorphism artinya bersifat poly morphy (memiliki banyak bentuk).
Method-method overloading masih dalam kelas yang sama, namun contoh berikut memvisualisaikan method respon() nama sama, namun pada kelas yang berbeda dapat memilki isi method yang berbeda pula tergantung kelasnya.
Contoh pertama :
class EkspresiWajah{
    public String respons() {
        return(”Perhatikan ekspresi wajah saya”);
    }
}
class Gembira extends EkspresiWajah{
    public String respons() {
        return(”ha ha ha…”);
    }
}
class Sedih extends EkspresiWajah{
    public String respons() {
        return(”hik hik ngeee ngeee ngeee”);
    }
}
class Marah extends EkspresiWajah{
    public String respons() {
        return(”Hai kurang ajar…!”);
    }
}



class MainEkspresiWajah{
    public static void main(String args[]) {
       EkspresiWajah objEkspresi = new EkspresiWajah();
        Gembira objGembira = new Gembira();
        Sedih objSedih = new Sedih();
        Marah objMarah = new Marah();

        EkspresiWajah[] arrEkspresi = new EkspresiWajah[4];
        arrEkspresi[0] = objEkspresi;
        arrEkspresi[1] = objGembira;
        arrEkspresi[2] = objSedih;
        arrEkspresi[3] = objMarah;

        System.out.println(”Ekspresi[0] : ”+arrEkspresi[0].respons());
        System.out.println(”Ekspresi[1] : ”+arrEkspresi[1].respons());
        System.out.println(”Ekspresi[2] : ”+arrEkspresi[2].respons());
        System.out.println(”Ekspresi[3] : ”+arrEkspresi[3].respons());
    }
}

Contoh kedua :
public class Employee {
    private String name;
    private double salary;
    protected Employee(String n, double s) {
        name = n;
        salary = s;
    }
    protected String getDetails() {
        return ”Name : ”+name+ ”\nSalary : ”+salary;
    }
    public void cetak() {
        System.out.println(”coba di Employee”);
    }
}
public class Manager extends Employee {
    private String department;
    public Manager(String nama, double salary, String dep) {
        super(nama, salary);
        department = dep;
    }
    public String getDepartment() {
        return department;
    }
    public String getDetails() {
        return super.getDetails()+ ”\nDepartment : ”+getDepartment();  
    }
    public void cetak() {
        System.out.println(”Coba di Manager”);
    }
}

public class View {
    public static void main(String[] args) {
       Employee e = new Employee(”Ali”,1200000);
       Employee em = new Manager(”Ali”,1200000,”Informatika”);
       System.out.println(”Data employee :\n”+e.getDetails());
       System.out.println(”Data manager :\n”+em.getDetails());
       em.cetak();      
    }
}

Catatan :
Kalau method cetak() di kelas Employee dan kelas Manager ada, maka yang dijalankan adalah method milik kelas Manager.
Prioritasnya adalah kelas Manager kemudian kelas Employee.
BAB VI. KELAS INNER, KELAS ABSTRCT,
DAN INTERFACE
6.1. Kelas Inner
Java membolehkan programmer menyisipkan suatu kelas ke dalam kelas lainnya. Kelas sisipan ini disebut kelas Inner.
Kelas Inner berguna untuk mendukung suatu proses yang akan dijalankan oleh kelas luarnya.
Beberapa ketentuan kelas Inner :
a)            Kelas Luar yang mengandung kelas Inner, bila dikompilasi akan menghasilkan dua file *.class, yaitu Luar.class dan Luar$Inner.class
b)            Kelas Inner boleh tidak diberi nama, yang disebut Anonymous Inner.
c)            Kelas Inner dapat diberi modifier akses public, atau protected, atau default, ataupun private.
d)           Untuk mengakses referensi this dari kelas luar digunakan bentuk NamaKelasLuar.this.


e)            Kelas Luar ikut bertanggung-jawab dalam instansiasi kelas Inner (yang non static). Kalau objek kelas Luar adalah a, dan objek kelas Inner adalah b, maka sintaks yang benar adalah :
Luar a = new Luar();
         Luar.Inner b = a.new Inner();
f)             Jika kelas Inner bersifat static, maka objek milik kelas Inner dapat dibuat sendiri tanpa melalui kelas Luarnya, (Artinya kelas Inner tidak dapat mengakses attribute ataupun method non static milik kelas Luarnya).
6.2. Menggunakan Kelas Inner
Kelas Inner lazim digunakan untuk membuat handler di method main() pada suatu aplikasi GUI.
Handler merupakan bagian program yang akan memproses event-event yang dipicu ketika user berinteraksi dengan komponen-komponen GUI.
Contoh program berikut adalah aplikasi Button sederhana dengan handlernya dari kelas Inner :
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class DemoJButtonInner extends JFrame {
    private JButton btn;
    public DemoJButtonInner {
        super(”Demo JButton Inner Class”);
        Container c = getContentPane();
        c.setLayout(new FlowLayout());
        btn = new JButton(”Button”);
        c.add(btn);
        // membuat event handler
        ButtonHandler handler = new ButtonHandler();
        btn.addActionListener(handler);
        setSize(275, 100);
        show();
    }

    public static void main(String args[]) {
        DemoJButtonInner app = new DemoJButtonInner();