Gambar cangkir dengan uap mengepul di atasnya serta tulisan Java seperti Gambar 8.1 ini mungkin pernah kalian lihat. Ya, ini adalah logo dari bahasa pemrograman Java yang popularitasnya meningkat beberapa tahun belakangan ini. Banyak game dan aplikasi yang digunakan pada perangkat mobile seperti telepon selular dan PDA dibuat dengan bahasa ini. Bahasa ini dikenal karena portabilitas dan dukungan pada konsep pemrograman berorientasi obyek.
DOWLOAD PROJECT LATIHAN
Bab ini meliputi dua standar kompetensi, yaitu membuat program dalam bahasa pemrograman berorientasi obyek dan membuat program aplikasi menggunakan Java. Hal ini karena kedekatan konsep antara Java dan pemrograman berorientasi obyek. Standar kompetensi membuat program dalam bahasa pemrograman berorientasi obyek terdiri dari empat kompetensi dasar yaitu tipe data dan kontrol program, pembuatan kelas, penggunaan inheritance, polymorphism, dan overloading, dan penggunaan interface dan paket. Sedangkan standar kompetensi membuat program aplikasi menggunakan Java terdiri dari lima kompetensi dasar, yaitu menjelaskan file I/O, tipe data dan variabel, menerapkan operator, menjelaskan exception handling, menerapkan multithreading dan menjelaskan network programming.
Dalam penyajian pada buku ini, satu sub bab tidak langsung merujuk pada satu kompetensi dasar. Ringkasan diletakkan pada setiap akhir bab kemudian dilanjutkan dengan soal-soal latihan. Sebelum mempelajari kompetensi ini ingatlah kembali sistem operasi, prinsip pemecahan masalah, algoritma pemrograman dasar dan lanjutan, pemrograman dengan VB dan VB.Net dan materi-materi pendukung dari mata pelajaran lain.
Tujuan
Setelah mempelajari bab ini diharapkan pembaca akan mampu:
- Memahami konsep pemrograman berorientasi obyek
- Menjelaskan File I/O, tipe data dan variabel pada Java
- Menggunakan operator
- Menerapkan kontrol program
- Menjelaskan Exception Handling
- Menerapkan Multi-Threading
- Menjelaskan Network Programming
- Membuat program berorientasi obyek dengan class
- Menggunakan prinsip inheritance, polymorphism dan overloading
- Membuat program berorientasi obyek dengan interface dan paket
1. Konsep Pemrograman Berorientasi Obyek
Pemrograman Berorientasi Obyek (Object Oriented Programming -- OOP) adalah programming paradigm yang menggunakan obyek dan interaksinya untuk merancang aplikasi dan program komputer. OOP tidak banyak digunakan sebelum awal tahun 1990an. Tapi sekarang menjadi sesuatu yang sudah lumrah digunakan. Bahasa-bahasa pemrograman seperti keluarga dotNet dari Microsoft (Visual Basic.Net, Visual C#, dan Visual J), Borland Delphi, Java, Phyton, PHP versi 5 ke atas, C++ dan banyak lainnya merupakan bahasa pemrograman yang mendukung konsep OOP.
Apakah obyek itu? Semua benda yang ada didunia ini dapat kita sebut sebagai obyek. Guru mata pelajaran RPL kalian adalah suatu obyek. Buku yang kalian pegang ini juga suatu obyek. Bahkan mata pelajaran RPL adalah juga sebuah obyek. Setiap obyek akan mempunyai karakteristik dan tingkah laku tertentu. Karakteristik disebut attribute dan tingkah laku disebut sebagai behavior atau method.
Dalam difinisi pemrograman berorientasi obyek dikenal adanya kelas dan obyek. Class atau kelas mendefinisikan karakteristik abstrak dari sesuatu termasuk atribut atau sifat-sifat dari sesuatu dan apa yang dapat dikerjakan oleh sesuatu (method). Sebagai contoh, mobil adalah sebuah kelas yang memiliki attribut warna, merek, tipe dan lain-lain. Mobil juga punya method antara lain, maju, mundur dan berhenti (lihat Gambar 8.2).

Gambar 8.2. Kelas, atribut dan method.
Obyek adalah contoh dari kelas yang sudah didefinisikan. Atribut dan method dari kelas secara otomatis akan menurun pada obyek namun dengan kekhususan. Sebagai ilustrasi kita perhatikan Gambar 8.2. Pada gambar tersebut, kita bisa identifikasi kelasnya adalah mobil dengan atribut dan methodnya. Obyeknya adalah sebuah mobil sedan dengan merk Toyota, dan warnanya adalah merah. Sedan itu juga memiliki method maju, mundur dan berhenti. Pada kasus ini mobil sedan disebut sebagai instance atau turunan dari kelas mobil.
Ada beberapa konsep penting yang kalian harus pahami dalam pemrograman berorientasi yaitu, abstraksi, enkapsulasi, inheritance dan polymorphism.
2. Abstraksi
Abstraction atau disebut juga composition merupakan prinsip penyederhanaan dari sesuatu yang kompleks dengan cara memodelkan kelas sesuai dengan masalahnya. Untuk lebih memperjelas pengertian coba perhatikan Gambar 8.3. Pada gambar tersebut terlihat sebuah mobil jika dipecah-pecah bagian-bagiannya kita akan dapatkan seperti ban, mesin, rangka mobil, kaca, dan lain-lain dan hal in berlaku sebaliknya. Jika kita gabungkan bagian-bagian tersebut maka kita akan mendapatkan sebuah kelas mobil. Pada pemrograman berorientasi obyek biasanya kalau kita menjumpai beberapa kelas atau obyek yang kalau diidentifikasi memiliki banyak kesamaan atribut dan method maka kita akan menggabungkan kelas-kelas tersebut menjadi satu super class.

Gambar 8.3. Contoh abstraction.
3. Enkapsulasi
Prinsip encapsulation adalah prinsip penyembunyian detil dari sebuah kelas terhadap obyek yang berinteraksi terhadapnya. Sebagai contoh ketika kita menjalankan mobil, sebenarnya kita sedang berinteraksi dan kita meminta kepada mobil untuk menjalankan methodnya seperti maju, mundur atau berhenti. Kita berinteraksi hanya dengan beberapa bagian dari mobil (interface) seperti persneling, setir, pijakan gas, pijakan rem dan bagian lain. Tapi detil proses yang terjadi didalam mobil bagaimana bisa maju, mundur atau berhenti kita tidak perlu tahu.
4. Inheritance
Inheritance atau pewarisan adalah prinsip pewarisan sifat dari orang tua ke anak atau turunannya yang diterapkan pada kelas. Orang tua memiliki atribut dan method yang lebih umum dibandingkan dengan anak atau turunannya. Pada Gambar 8.4. kita bisa tahu bahwa mobil memiliki atribut dan method yang lebih umum dibandingkan dengan sedan , truk atau bus. Mobil sebagai kelas yang mewarisi disebut sebagai super class, sedangkan sedan, truk dan bus sebagai kelas yang diwarisi disebut sub class.

Gambar 8.4. Pewarisan.
5. Polymorphism
Polymorphism mungkin merupakan konsep pemrograman beroerientasi obyek yang paling sulit dimengerti. Arti dari polymorphism adalah kemampuan dari suatu obyek untuk mempunyai lebih dari satu bentuk. Atau dalam pengertian lain adalah kita dapat menerapkan sesuatu hal yang berbeda melalui suatu cara yang sama. Sebagai contoh kalau ada empat ekor hewan berbeda yaitu burung, ular, katak, dan singa kemudian kita minta untuk bergerak, maka burung akan terbang, ular akan melata, katak melompat, singa mungkin akan berlari. Jadi suatu method yang sama mungkin bisa diterapkan secara lain jika obyek yang menerapkan adalah berlainan.
6. Pengenalan Java
Bahasa pemrograman Java pertama lahir dari The Green Project, yang berjalan selama 18 bulan, dari awal tahun 1991 hingga musim panas 1992. Proyek tersebut menggunakan versi yang dinamakan Oak. Nama Oak ini tidak dipakai untuk versi release Java karena sebuah perangkat lunak sudah terdaftar dengan merek dagang tersebut, sehingga diambil nama penggantinya menjadi "Java". Nama ini diambil dari kopi murni yang digiling langsung dari biji (kopi tubruk). Saat ini Java berada dibawah lisensi Sun Microsystems.
Menurut definisi dari Sun, Java adalah nama untuk sekumpulan teknologi untuk membuat dan menjalankan perangkat luinak pada komputer standalone ataupun pada lingkungan jaringan. Orang orang yang berkecimpung dalam dunia pemrograman lebih suka menyebut Java sebagai sebuah teknologi dibanding hanya sebuah bahasa pemrograman, karena Java lebih lengkap dibanding sebuah bahasa pemrograman konvensional.
7. Kebutuhan Perangkat Lunak
Untuk membuat program Java paling tidak harus tersedia dua buah software yaitu:
Java 2 SDK Standard Edition (J2SE)
Perangkat lunak ini merupakan yang akan kita gunakan untuk mengkompilasi kode program Java yang kita buat. Selain itu pada perangkat lunak ini tersedia kelas-kelas yang dapat kita gunakan untuk membangun aplikasi desktop, grafis, keamanan, konektivitas basis data dan jaringan. Perangkat lunak ini dapat di-download gratis di situs Sun Microsystem. Setelah itu perangkat lunak ini harus diinstal pada system operasi yang kita pakai.
Text Editor
Perangkat lunak ini berfungsi untuk menuliskan kode-kode program. Notepad, Vi, Gedit, merupakan contoh-contoh teks editor yang dapat digunakan. Namun menggunakan teks editor agak menyulitkan karena tidak tersedia fasilitas bantu yang memudahkan dalam menuliskan kode program. Saat ini beberapa IDE tersedia gratis di internet. IDE tersebut telah menyediakan banyak fasilitas seperti syntax coloring, auto completion, dan template untuk memudahkan membuat aplikasi berbasis Java. NetBeans (www.netbeans.org) dan Eclipse (www.eclipse.org) merupakan dua buah IDE yang sangat terkenal dan sangat kuat. Gambar 8.5. menunjukkan tampilan NetBeans IDE.

Gambar 8.5. NetBeans IDE.
8. Kompilasi Kode Program
Sebelum kita membuat program dan mengkompilasinya kita harus mengatur ClassPath. ClassPath adalah suatu sistem variabel yang digunakan untuk mengatakan pada program yang ditulis dengan bahasa Java tempat lokasi-lokasi yang akan digunakan. Misalkan kita meletakkan kode program kita di direktori d:\TestCode\Java, maka kita perlu mengatur path agar kita bisa menggunakan compiler java dari direktori ini. Berikut ini langkahlangkah membuat classpath:
Buka command-prompt di Windows kemudian setelah terbuka ketikkan:
Set PATH=C:\progra~1\java\jdk1.5.0\bin;%PATH%
Set CLASSPATH=.;D:\TestCode\Java
Path di atas adalah jika kita menggunakan JDK versi 1.5, jika versi yang lain maka tinggal menyesuaikan.
Periksa apakah setting sudah benar dengan mengetikkan perintah java pada direktori manapun dari command prompt.
Setelah classpath terbentuk, coba buka Notepad kemudian ketikkan kode berikut ini;
public class Main {
//isi blok
public static void main(String[] args) {
System.out.println("Hallo ini Java lho");
}
}
Kemudian simpan file kode tersebut dengan nama yang sama dengan class yang ada pada kode tersebut yaitu Main dan diakhiri dengan ekstensi .java. Simpan di lokasi yang telah kita tetapkan di atas (lihat Gambar 8.6). Aturan penulisan nama file di Java sangat ketat, sehingga jika kalian memberi nama file tidak sama dengan nama kelasnya, maka program akan menolak untuk dieksekusi.
Pada kode program di atas, baris pertama menunjukkan nama class yaitu Main. Pada Java semua kode seharusnya ditempatkan didalam deklarasi class. Kita melakukannya dengan menggunakan kata kunci class. Sebagai tambahan, class menggunakan akses khusus public, yang menunjukkan bahwa class kita mempunyai akses bebas ke class yang lain dari package yang lain pula (package merupakan kumpulan class-class).
Setelah deklarasi class kemudian diikuti tanda { yang menunjukkan awal blok kode. Tanda ini harus ditutup dengan tanda } sebagai akhir blok.
Baris yang dimulai dengan tanda // adalah komentar. Kemudian baris berikutnya adalah deklarasi nama method. Dalam hal ini nama method-nya adalah main (method utama). Kita dapat membuat method-method lainnya diluar main ini. Setelah deklarasi ini diikuti juga dengan blok kode. Pada blok kode berisi pernyataan System.out.println("Hallo ini Java lho");. Perintah System.out.println(), menampilkan teks yang diapit oleh tanda petik ganda (" ") pada layar.

Gambar 8.6. Nama file dan lokasi penyimpanan.
Sekarang buka command prompt dan arahkan ke direktori tempat file java kalian simpan dan ketikkan seperti pada Gambar 8.7. Perhatikan cara penulisan dan hasil yang diperoleh.

Gambar 8.7. Cara eksekusi program dalam Java.
Sebelum dapat dieksekusi, maka kode program (Main.java) harus dikompilasi dengan menggunakan perintah javac seperti terlihat di Gambar 8.7. Setelah kompilasi berhasil, maka program dapat kita eksekusi dengan menggunakan perintah java. Proses kompilasi akan menghasilkan file dengan nama Main.class (periksa direktori kalian dengan perintah dir, dan cari file dengan akhiran .class). Yang kita panggil pada perintah java adalah file dengan akhiran class ini dan bukan lagi kode sumber yang berakhiran .java.
9. Latihan Pemrograman OOP
Pada contoh-contoh sebelumnya dan beberapa penjelasannya kita telah menyinggung beberapa kali tentang class (kelas) dan object (obyek). Namun kita belum mempelajari dengan jelas apa sebenarnya kelas dan obyek dalam Java. Kelas dan obyek dalam Java adalah penerapan dari prinsip-prinsip pemrograman berorientasi obyek yang telah kita pelajari di awal bab ini.

Kelas dapat didefinisikan sebagai kerangka yang mendefinisikan variabelvariabel, method umum dari sebuah obyek tertentu. Pada pemrograman berorientasi obyek, kelas tidak jauh berbeda dengan tipe data primitive. Perbedaannya, tipe data digunakan untuk mendeklarasikan variabel normal, sedangkan kelas digunakan untuk mendeklarasikan variabel yang berupa obyek. Kelas masih bersifat abstrak.
9.1 Pembuatan Kelas
Pada Java kelas didefinisikan dengan kata kunci class. Bentuk umum untuk mendefinisikan kelas adalah sebagai berikut:
class NamaKelas
tipe data1; tipe data2;
...
tipe dataN;
tipe method1 (daftar parameter) {
//blok kode untuk method1
}
tipe method2 (daftar parameter) {
//blok kode untuk method2
}
...
tipe methodN (daftar parameter) {
//blok kode untuk methodN
}
}
Data atau variabel yang didefinisikan di dalam kelas sering disebut sebagai instance variable. Nilai-nilai variabel ini akan dibaca melalui method-method yang tersedia. Dengan demikian method digunakan sebagai antarmuka (interface) antara pemakai kelas dengan data yang ada di dalam kelas tersebut. Ingat kembali prinsip encapsulation di awal bab. Perhatikan contoh kelas berikut.
Contoh 8.22. Membuat kelas sederhana
class Siswa
{
String name; String alamat; int usia;
}
Pada kode di atas kita membuat class dengan nama Siswa. Ada tiga data yang ada pada class tersebut yaitu nama, alamat dan usia. Kita belum menambahkan method di sini. Melalui kode di atas sebenarnya kita telah mendefinisikan tipe data baru yaitu Siswa. Kode program di atas hanyalah sebuah template. Artinya kalau jalankan program di atas tidak akan menghasilkan apa-apa. Kita perlu membuat obyek aktual berdasarkan kelas di atas. Dengan cara sebagai berikut.
Contoh 8.23. Menggunakan kelas
class Siswa {
String nama; String alamat;
int usia;
}
public class DataSiswa {
public static void main(String[] args) { Siswa siswa1 = new Siswa(); siswa1.nama = "Roni"; siswa1.alamat = "Mergosono Gg. 1 No. 34"; siswa1.usia = 23;
System.out.println("Nama :" + siswa1.nama);
System.out.println("Alamat :" + siswa1.alamat);
System.out.println("Usia :" + siswa1.usia);
}
}
Kode program di atas harus kita simpan dengan nama file DataSiswa.java, buka Siswa.java. Hal ini karena method main berada pada class DataSiswa. Pada kode di atas kelas Siswa kita gunakan pada kelas DataSiswa. Kita membuat obyek aktual dari kelas Siswa dengan cara mengetikkan Siswa siswa1 = new Siswa();. Siswa1 adalah nama obyek aktual dari kelas Siswa. Setelah itu baru kita dapat menggunakan variabel atau data yang ada pada kelas siswa. Kalau dijalankan, kode program di atas akan menghasilkan output seperti pada Gambar 8.13.

Gambar 8.13. Hasil eksekusi terhadap class DataSiswa
Sekarang kita akan buat kelas menjadi sedikit lebih kompleks dengan mengikutkan method pada kelas tersebut. Perhatikan contoh berikut.
Contoh 8.23. Pembuatan kelas yang mempunyai method
class Siswa {
String nama; String alamat; int usia; double nilaiMatematika; double nilaiBhsInggris; double nilaiBhsIndonesia;
double rerata;
// Menghasilkan nama dari Siswa
public String getNama(){ return nama;
}
// Mengubah nama siswa public void setNama( String temp ){
nama = temp;
}
// Menghitung rata -- rata nilai
public double getRerata(){
rerata = (
nilaiMatematika+nilaiBhsInggris+nilaiBhsIndonesia )/3;
return rerata;
}
}
public class DataSiswa {
public static void main(String[] args) { Siswa siswa1 = new Siswa(); siswa1.setNama("Rony"); siswa1.nilaiMatematika = 67; siswa1.nilaiBhsInggris = 87;
siswa1.nilaiBhsIndonesia = 59;
System.out.println("Nama :" +
siswa1.getNama());
System.out.println("Nilai Matematika :" + siswa1.nilaiMatematika);
System.out.println("Nilai Bahasa Inggris :" + siswa1.nilaiBhsInggris);
System.out.println("Nilai Bahasa Indonesia :" + siswa1.nilaiBhsIndonesia);
System.out.println("Rerata :" +
siswa1.getRerata());
}
}
Pada kode di atas kita memperluas kelas Siswa dengan menambahkan empat variabel yaitu nilaiMatematika, nilaiBhsInggris, nilaiBhsIndonesia dan rerata. Kita juga menambahkan tiga buah method yaitu getNama, setNama dan getRerata. getNama merupakan method untuk menampilkan isi dari variabel nama. setNama adalah method untuk memberi nilai pada variabel nama. getRerata adalah method untuk menghitung rata-rata nilai dari tiga pelajaran dan menampilkan isi dari hasil perhitungan. Perhatikan bagaimana method ini digunakan pada kelas DataSiswa. Apabila dijalankan maka kita akan memperoleh output seperti pada Gambar 8.14.

Gambar 8.14. Eksekusi pada class yang mempunyai method.
Ada beberapa tipe method di dalam class, yaitu method yang tidak mengembalikan nilai, method yang mengembalikan nilai dan method khusus yaitu constructor. Secara umum method ini boleh kita samakan dengan prosedur atau fungsi (lihat kembali Bab 6 dan 7). Perhatikan contoh-contoh berikut ini.
Contoh 8.24. Pembuatan method tanpa pengembalian nilai
Class Bangun { double panjang; double lebar;
// Mendefinisikan method void (tidak mengembalikan nilai)
void cetakLuas() {
System.out.println("Luas bangun = " +
(panjang * lebar));
}
}
class pakaiBangun {
public static void main(String[] args) {
Bangun b1, b2;
// instansiasi objek b1 = new Bangun(); b2 = new Bangun();
// mengisi data untuk objek b1 b1.panjang = 4; b1.lebar = 3;
// mengisi data untuk objek b2 b2.panjang = 6; b2.lebar = 5;
// memanggil method cetakLuas() untuk masing-masing objek b1.cetakLuas(); b2.cetakLuas();
}
}
Pada kode di atas, class Bangun mempunyai satu method yaitu cetakLuas. Method ini tidak mengembalikan nilai. Hasil akhir dari method ini akan tersimpan pada method tersebut. Bandingkan dengan contoh berikut
Contoh 8.25. Pembuatan method dengan pengembalian nilai
Class Bangun { double panjang; double lebar;
// Mendefinisikan method yang mengembalikan nilai double hitungLuas() { double luas = panjang * lebar; return luas;
}
}
class pakaiBangun {
public static void main(String[] args) {
Bangun b1, b2;
// instansiasi objek b1 = new Bangun(); b2 = new Bangun();
// mengisi data untuk objek b1 b1.panjang = 4; b1.lebar = 3;
// mengisi data untuk objek b2 b2.panjang = 6; b2.lebar = 5;
// memanggil method hitungLuas() untuk masing-masing objek
System.out.println("Luas b1 = " + b1.hitungLuas());
System.out.println("Luas b2 = " + b2.hitungLuas());
}
}
Pada contoh 8.25 ini kita membuat metode hitungLuas yang mengembalikan nilai. Perhatikan deklarasi method tidak lagi menggunakan void tetapi menggunakan double yang merupakan tipe data nilai yang dikembalikan. Untuk mengembalikan nilai digunakan kata kunci return. Perhatikan cara pemanggilan method dari contoh 8.24 dan 8.25, apa yang berbeda?
Method dapat juga memiliki argumen seperti halnya pada fungsi atau prosedur. Perhatikan contoh berikut
Contoh 8.26. Pembuatan method dengan argumen
class Bangun { double panjang; double lebar;
// method dengan argumen void isiData(double p, double l) { panjang = p;
lebar = l;
}
// method yang mengembalikan nilai double hitungLuas() { double luas = panjang * lebar; return luas;
}
}
class pakaiBangun {
public static void main(String[] args) {
Bangun b;
// instansiasi obyek
b = new Bangun();
// memanggil method isiData dan mengisi argumennya b.isiData(6,8);
// memanggil method hitungLuas() untuk objek b
System.out.println("Luas b = " + b.hitungLuas());
}
}
Pada contoh 8.26 ini kita menambahkan satu method lagi pada class Bangun yaitu isiData. Karena tidak mengembalikan nilai maka kita menggunakan void. Method ini mempunyai dua buah argument yaitu p dan l yang digunakan untuk menampung nilai yang akan kita masukkan. Perhatikan bagaimana kita menggunakan method ini (lihat bagian b.isiData(6, 8) ).
Constructor yang merupakan method khusus, merupakan method yang didefiniskan di dalam kela dan akan dipanggil secara otomatis setiap kali terjadi pendefinisian (instansiasi) obyek. Biasanya constructor berfungsi untuk melakukan inisialisasi nilai terhadap data-data yang terdapat pada kelas yang bersangkutan. Nama method constructor harus sama dengan nama kelas itu sendiri. Constructor tidak memiliki kembalian nilai dan tidak void. Perhatikan contoh berikut ini.
Contoh 8.27. Pembuatan class dengan constructor
class Bangun { double panjang; double lebar;
// constructor dengan argumen
Bangun(double p, double l) { panjang = p;
lebar = l;
}
// method yang mengembalikan nilai double hitungLuas() { double luas = panjang * lebar; return luas;
}
}
class pakaiBangun {
public static void main(String[] args) {
Bangun b;
// instansiasi obyek
b = new Bangun();
// memanggil method isiData dan mengisi argumennya b.isiData(6,8);
// memanggil method hitungLuas() untuk objek b
System.out.println("Luas b = " + b.hitungLuas());
}
}
Kode di atas sekilas sama dengan contoh 8.26, namun sebenarnya berbeda. Pada kode ini terdapat constructor dengan nama yang sama dengan kelasnya yaitu Bangun. Constructor seperti halnya method yang lain boleh mempunyai argumen dan boleh tidak. Pada contoh di atas kita constructor Bangun mempunyai argumen p dan l.
9.2. Penerapan Inheritance
Prinsip inheritance atau pewarisan, secara umum telah kalian pelajari di awal bab. Pewarisan adalah keuntungan besar dalam pemrograman beorientasi obyek karena suatu sifat atau method yang telah didefinisikan dalam superclass, secara otomatis diwariskan dari pada semua subclasses. Jadi kita mungkin hanya perlu mendefinisikan method satu kali di superclass kemudian dapat kita gunakan pada subclass. Perhatikan contoh berikut.
Contoh 8.28. Penerapan inheritance
class SuperA { private int a;
public void setSuperA(int nilai) { a = nilai; }
public int getSuperA() { return a;
}
}
// membuat kelas turunan (subclass) dari kelas A class SubB extends SuperA { private int b;
public void setSubB(int nilai) { b = nilai; }
public int getSubB() { return b;
}
}
class DemoKelasTurunan1 {
public static void main(String[] args) {
// melakukan instansiasi terhadap kelas B
SubB ObyekB = new SubB();
// mengeset nilai objek dari kelas B
ObyekB.setSuperA(50);
ObyekB.setSubB(200);
// mendapatkan nilai yang terdapat dalam objek dari kelas B
System.out.println("Nilai a : " + Obyek.getSuperA());
System.out.println("Nilai b : " + Obyek.getSubB());
}
}
Pada kode di atas, class SuperA adalah super class yang memiliki satu data yaitu a dan dan dua method yaitu setSuperA dan getSuperA. Class SubB adalah turunan dari kelas SuperA (perhatikan deklarasi class SubB extends SuperA). Data dan method yang ada pada class SuperA secara otomatis akan dibawa ke class SubB. Sehingga class SubB akan mempunyai dua data yaitu a dan b. Data a adalah hasil warisan dari class SuperA sedang data b adalah milik class SubB sendiri. Method pada class SubB akan terdiri dari empat method, yaitu setSuperA dan getSuperA yang merupakan warisan dari class SuperA serta class setSubB dan getSubB yang milik class SubB sendiri. Cobalah ketik program di atas kemudian jalankan dan cermati hasil yang diperoleh. Perhatikan contoh yang lain berikut ini.
Contoh 8.29. Penerapan inheritance untuk menghitung luas dan volume
class Bangun { protected double panjang; protected double lebar;
// constructor default Bangun() { panjang = lebar = 0;
}
Bangun(double p, double l) { panjang = p;
lebar = l;
}
// method yang mengembalikan nilai public double hitungLuas() { double luas = panjang * lebar; return luas;
}
}
class Box extends Bangun {
private double tinggi;
// constructor class Box Box (int p, int l, int t) {
panjang = p; lebar = l; tinggi = t;
}
public double getTinggi() { return tinggi;
}
public double hitungVolume() { double volume = panjang * lebar * tinggi; return volume;
}
}
class inheritBangun {
public static void main(String[] args) {
Box kotak;
// instansiasi obyek
kotak = new Box(6, 8, 3);
// memanggil method hitungLuas(), getTinggi() dan hitung volume()
System.out.println("Luas salah satu sisi = " + kotak.hitungLuas());
System.out.println("Tinggi kotak = " + kotak.getTinggi());
System.out.println("Volume kotak = " + kotak.hitungVolume());
}
}
Kelas Bangun di atas adalah superclass sedangkan Box adalah subclass. Pada default constructor Bangun, nilai panjang dan lebar diinisialisasi dengan nilai 0. Perhatikan didepan deklarasi variabel panjang dan lebar pada kelas Bangun dicantumkan kata kunci protected yang berarti kelas turunan dari Bangun tetap dapat mengakses nilai dari variabel tersebut namun yang tidak memiliki hubungan turunan tidak dapat mengaksesnya.
Pada Box yang merupakan subclass ditambahkan satu variabel yaitu tinggi dengan tambahan kata kunci private diikuti tipe datanya. Private menunjukkan bahwa variabel tinggi hanya bisa diakses didalam kelas Box. Lawan dari private adalah public, yang berarti dapat diakses oleh siapapun dan dari manapun. Pada kelas Box juga kita tambahkan satu method yaitu hitungVolume(). Pada contoh 8.29 di atas obyek yang kita buat yaitu kotak, merupakan hasil instansiasi dari kelas Box. Oleh karena kelas Box adalah turunan dari kelas Bangun, maka kita dapat mengakses method hitungLuas() yang merupakan warisan dari kelas Bangun. Tentu saja kita bisa mengakses method getTinggi() dan hitungVolume() yang merupakan method pada kelas Box. Kalau kita eksekusi program di atas, maka akan tampak seperti berikut.

Gambar 8.15. Hasil eksekusi program kelas Bangun dan Box
9.3. Penerapan Overriding dan Overloading
Kadang-kadang, ketika kita membuat method di dalam subclass, kita ingin membuat method dengan nama yang sama dengan method pada superclass namun dengan penerapan yang berbeda. Sebagai contoh pada kelas Bangun pada contoh 8.29, tersedia method hitungLuas(). Misalnya kita ingin membuat subclass Segitiga yang merupakan turunan dari kelas Bangun. Kemudian kita ingin membuat method hitungLuas() yang penerapannya tidak lagi luas = panjang x lebar tetapi dengan penerapan luas = 0.5 x alas x tinggi. Pada kondisi ini method hitungLuas() dari superclass akan tertutupi oleh method pada subclass. Hal seperti ini biasa disebut sebagai overriding. Perhatikan contoh berikut.
Contoh 8.30. Penerapan overriding
class Bangun { // method umum
public double hitungLuas() {
System.out.println("Method belum terdefinisi"); Return 0;
}
}
class Segitiga extends Bangun {
private double alas;
private double tinggi;
Segitiga (int a, int t) {
alas = a; tinggi = t;
}
// overriding method hitungLuas() public double hitungLuas() { double luas = 0.5 * alas * tinggi; return luas;
}
}
class overridingBangun { public static void main(String[] args) {
Segitiga s;
// instansiasi obyek
s = new Segitiga(6, 8);
// memanggil method hitungLuas() dari subclass Segitiga System.out.println("Luas segitiga = " +
s.hitungLuas());
}
}
Pada contoh di atas, kelas Bangun sebagai superclass mempunyai method hitungLuas(), tetapi belum kita definisikan isi methodnya. Pada kelas Segitiga, method hitungLuas() ini kita overriding untuk mendapatkan nilai luas segitiga. Pada eksekusi program di atas, yang dijalankan adalah method hitungLuas() yang ada pada subclass Segitiga. Hasil dari eksekusi program akan tampak seperti pada Gambar 8.16. Apabila kita ingin tetap menjalankan method hitungLuas() yang ada pada kelas Bangun kita dapat memanggil dengan kata kunci super. Rubahlah method hitungLuas() pada kelas Segitiga dengan kode berikut.
public double hitungLuas() {
super.hitungLuas();
System.out.println();
double luas = 0.5 * alas * tinggi;
return luas;
}
Jalankan program, maka kalian akan mendapatkan hasil seperti Gambar 8.17. Bandingkan dengan hasil eksekusi sebelumnya (Gambar 8.16)

Gambar 8.16. Hasil eksekusi overriding pada method hitungLuas().

Gambar 8.17. Hasil eksekusi overriding dan pernyataan super.
Overloading memiliki kesamaan dengan overriding dalam hal menyembunyikan method dari superclass. Tetapi memiliki perbedaan yaitu, pada overloading methodnya memiliki nama yang sama dengan method pada kelas induk, tetapi memiliki daftar argument dan implementasi yang berbeda. Sedangkan overriding, method mempunyai nama dan daftar argumen yang sama dengan kelas induk dan hanya implementasinya yang berbeda. Perhatikan contoh berikut.
Contoh 8.31. Contoh overloading
class Bangun { // method umum
public double hitungLuas() {
System.out.println("Method belum terdefinisi"); return 0;
}
}
class BujurSangkar extends Bangun {
private double sisi;
// overload method hitungLuas() public double hitungLuas(double sisi) {
double luas = sisi * sisi;
return luas;
}
}
class overloadBangun {
public static void main(String[] args) {
BujurSangkar b;
// instansiasi obyek
b = new BujurSangkar();
// memanggil method hitungLuas() dari subclass
BujurSangkar
System.out.println("Luas BujurSangkar = " +
b.hitungLuas(6));
}
}
Perhatikan pada kode di atas, method hitungLuas() pada kelas bangun tidak mempunyai argumen sedangkan pada kelas BujurSangkar mempunyai argumen yaitu sisi. Inilah yang disebut sebagai overloading. Bandingkan dengan contoh overriding pada contoh 8.29 dan 8.30.
9.4 Penerapan Polymorphism
Seperti telah dijelaskan di awal bab, polymorphism adalah kemampuan sebuah untuk menerjemahkan suatu method menjadi berbagai macam aksi. Sebenarnya ketika kalian mempelajari overriding dan overloading di atas secara tidak langsung kalian telah mempelajari dasar-dasar penyusun teori polymorphism. Polymorphism membolehkan kelas induk (superclass) untuk mendefinisikan method umum untuk semua turunannya. Kelas-kelas turunannya dapat mengimplementasikan method tersebut sesuai dengan karakteristik masinmasing kelas.
Pada contoh 8.30 dan 8.31 kita telah membuat kelas Bangun yang merupakan kelas induk yang mempunyai method hitungLuas(). Method ini bersifat umum. Pada contoh 8.30, method ini kita implementasikan dengan untuk mencari nilai luas segitiga pada kelas Segitiga. Sedangkan pada contoh 8.31, method ini kita implementasikan untuk mencari luas BujurSangkar pada kelas BujurSangkar. Perhatikan contoh berikut ini.
Contoh 8.32. Penerapan polymorphism
class Bangun { public double hitungLuas() { System.out.println("Method umum"); return 0;
}
}
class BujurSangkar extends Bangun {
private double sisi;
BujurSangkar(int s) { sisi = s;
}
//overriding method hitungLuas() public double hitungLuas() { double luas = sisi * sisi; return luas;
}
}
class Segitiga extends Bangun { private double alas;
private double tinggi;
Segitiga (int a, int t) {
alas = a; tinggi = t;
}
// overriding method hitungLuas() public double hitungLuas() { double luas = 0.5 * alas * tinggi; return luas;
}
}
class Lingkaran extends Bangun { private double jarijari;
private final double PI = 3.1416;
Lingkaran(int r) { jarijari = r;
}
//overriding method hitungLuas() public double hitungLuas() { double luas = PI * jarijari * jarijari; return luas;
}
}
class DemoPolimorfisme2 {
public static void main(String[] args) {
Bentuk obyek;
BujurSangkar b = new BujurSangkar(12);
Segitiga s = new Segitiga(5, 6);
Lingkaran l = new Lingkaran(4);
// obyek mengacu pada objek BujurSangkar obyek = b;
// akan memanggil method yang terdapat pada
BujurSangkar
System.out.println("Luas bujursangkar : " + obyek.hitungLuas()); System.out.println();
// obyek mengacu pada objek Segitiga obyek = s;
// akan memanggil method yang terdapat pada Segitiga
System.out.println("Luas segitiga : " + obyek.hitungLuas()); System.out.println();
// obyek mengacu pada objek Lingkaran obyek = l;
// akan memanggil method yang terdapat pada Lingkaran
System.out.println("Luas lingkaran: " + obyek.hitungLuas()); System.out.println();
}
}
Pada contoh 8.32 ini kita menggabungkan contoh-contoh sebelumnya untuk menunjukkan bagaimana polymorphism terbentuk. Kelas induk adalah Bangun dan mempunyai subclass yaitu BujurSangkar, Segitiga dan Lingkaran. Semuanya subclass mempunyai method hitungLuas() yang diturunkan dari kelas Bangun. Perhatikan bahwa meskipun nama method hitungLuas() ada pada semua subclass, ternyata penerapannya berbeda-beda tergantung pada subclass masing-masing.
9.5 Menggunakan Paket dan Interface
Pada beberapa bagian di atas telah disinggung tentang package atau paket. Packages dalam JAVA berarti pengelompokan beberapa class dan interface dalam satu unit. Fitur ini menyediakan cara untuk mengatur class dan interface dalam jumlah banyak dan menghindari kekacauan pada penamaan class dan file.
Kalau kalian cermati contoh 8.4 pada sub bab terdahulu, sebenarnya kalian telah menggunakan konsep package ini secara tidak langsung. Pada contoh tersebut kita menggunaka pernyataan import untuk menggunakan kelaskelas yang ada pada paket Java.IO. Java menyediakan banyak paket yang telah dibuat oleh tim pengembang java. Paket-paket ini dapat kita gunakan untuk mempermudah pemrograman.
Cara membuat paket cukup mudah, kita tinggal menggunakan kata kunci package diikuti dengan nama paket yang kita inginkan seperti berikut:
package NamaPaket;
NamaPaket adalah nama paket yang kita akan gunakan untuk menyimpan file kode program dan file hasil kompilasi. Java menggunakan sistem direktori untuk menyimpan paket yang dibuat. Apabila kita membuat paket dengan nama PaketBangun, maka kita harus membuat direktori dengan nama yang sama persis yaitu PaketBangun. Dan file paket dan kelas-kelas dalam satu paket tersebut harus kita simpan pada direktori tersebut. Perhatikan contoh berikut.
Contoh 8.33. Pembuatan paket
Pada bagian ini kita akan membuat paket yang merupakan modifikasi dari contoh 8.32. Nama paket yang ingin kita buat adalah PaketBangun yang mempunyai tiga anggota kelas yaitu kelas BujurSangkar, Segitiga dan Lingkaran. Untuk tahap awal, buatlah direktori dengan nama PaketBangun (pada contoh ini, direktori ini kita letakkan di D:\TestCode\Java\PaketBangun ). Kemudian secara berturut-turut buatlah kode program berikut dan simpan dengan nama sesuai nama kelasnya pada direktori PaketBangun. Perhatikan pada awal kode kelas selalu diawali pernyataan package PaketBangun;. Hal ini menunjukkan bahwa kelas tersebut merupakan anggota dari PaketBangun. File:
BujurSangkar.java
package PaketBangun; class BujurSangkar extends Bangun { private double sisi;
public BujurSangkar(int s) { sisi = s; }
public double hitungLuas() { double luas = sisi * sisi; return luas;
}
}
File : Segitiga.java
package PaketBangun; class Segitiga extends Bangun { private double alas;
private double tinggi;
public Segitiga (int a, int t) {
alas = a; tinggi = t;
}
public double hitungLuas() { double luas = 0.5 * alas * tinggi; return luas;
}
}
Lingkaran.java
package PaketBangun; class Lingkaran extends Bangun { private double jarijari;
private final double PI = 3.1416;
public Lingkaran(int r) { jarijari = r;
}
public double hitungLuas() { double luas = PI * jarijari * jarijari; return luas;
}
}
Setelah itu lakukan pengaturan classpath seperti terlihat pada sub bab awal. Dan lakukan kompilasi pada ketiga file tersebut di atas sehingga akan diperoleh hasil file seperti Gambar 8.18.

Gambar 8.18. Kompilasi pada tiga file anggota paket.
Setelah kompilasi berhasil, buatlah file baru di direktori D:\TestCode\Java, misalnya dengan nama PakaiPaketBangun.java. Kemudian ketikkan kode berikut ini pada file tersebut. Kompilasi dan jalankan kode program tersebut.
//import seluruh kelas pada PaketBangun import PaketBangun.*;
class PakaiPaketBangun {
public static void main(String[] args) {
BujurSangkar b = new BujurSangkar(12);
Segitiga s = new Segitiga(5, 6);
Lingkaran l = new Lingkaran(4);
System.out.println("Luas bujursangkar : " +
b.hitungLuas()); System.out.println();
System.out.println("Luas segitiga : " +
s.hitungLuas()); System.out.println();
System.out.println("Luas lingkaran: " +
l.hitungLuas()); System.out.println();
}
}
Perhatikan cara penulisan untuk memanggil paket. Jika kita hanya membutuhkan kelas Lingkaran saja, maka perlu menuliskan import PaketBangun.Lingkaran;. tetapi jika kita butuh semua kelas maka kita menuliskan dengan cara import PaketBangun.*;. Jika kita jalankan perintah ini maka hasilnya akan sama persis dengan contoh 8.33. Perbedaannya adalah pada contoh 8.32 kelas-kelas berada pada satu file. Sedangkan pada contoh 8.33 kelas-kelas berada pada filenya masing-masing dan baru dikelompokkan dengan menggunakan package.
Interface atau antar muka pada bahasa pemrograman Java sangat mirip dengan kelas, tapi tanpa atribut kelas dan memiliki metode yang dideklarasikan tanpa isi. Deklarasi metode pada sebuah interface dapat diimplementasikan oleh kelas lain. Sebuah kelas dapat mengimplementasikan lebih dari satu interface. Metode pada interface yang diimplementasikan pada suatu kelas harus sama persis dengan yang ada pada interface. Interface digunakan jika kita ingin kelas yang tidak berhubungan mengimplementasikan method yang sama. Perhatikan contoh berikut ini.
Contoh 8.34. Pembuatan interface
interface Bentuk {
public double luas();
public double volume();
}
Pada contoh ini kita membuat sebuah interface dengan nama Bentuk yang mempunyai dua method yaitu luas() dan volume(). Perhatikan penulisan interface. Kedua method yang ada dideklarasikan tanpa isi. Kita dapat menggunakan interface ini untuk membuat kelas baru dan mengimplementasikan interface ini dalam kelas tersebut. Perhatikan contoh berikut ini.
Contoh 8.34. Penggunaan interface
class Kubus implements Bentuk {
int x = 10;
public double luas( ) {
return (6 * x * x);
}
public double volume() {
return (x * x * x);
}
}
class Lingkaran implements Bentuk {
int radius = 10; public double luas() {
return (Math.PI * radius * radius);
}
public double volume() {
return 0;
}
}
10. Ringkasan
- Konsep penting harus pahami dalam pemrograman berorientasi yaitu, kelas, obyek, abstraksi, enkapsulasi, inheritance dan polymorphism.
- Ada 8 tipe data dasar pada Java yaitu boolean (untuk bentuk logika), char (untuk bentuk tekstual), byte, short, int, long (integral), double and float (floating point).
- Operator yang tersedia pada Java adalah operator aritmatika, relasional, logika dan bitwise.
- Struktur kontrol program untuk percabangan dapat dilakukan dengan pernyataan if, if ... else, dan if ...else ... if, sedangkan pengulangan dapat dilakukan dengan for, while dan do-while.
- Exception adalah kondisi abnormal yang terjadi saat runtime. Java menyediakan mekanisme try, throw, catch dan finally untuk menangani exception.
- Thread adalah suatu bagian program yang tidak tergantung pada bagian lain dan dapat dijalankan secara bersama-sama. Java membolehkan kita untuk mengatur thread sesuai dengan kebutuhan.
- Java mendukung penuh konsep kelas, inheritance, overriding, overloading, dan polymorphism.
- Paket adalah kumpulan dari kelas-kelas. Sedangkan interface adalah kelas tanpa atribut dan mempunyai method yang dideklarasikan tanpa isi.
11. Latihan Soal
1. Buatlah program untuk menampilkan nilai dari beberapa variabel yang mempunyai tipe data dan nilai awal sebagai berikut:
- a. Tipe data float, nilai awal = 3.45.
- b. Tipe data char, nilai awal = B
- c. Tipe data int, nilai awal = 23
2. Buatlah program untuk menghitung nilai rata-rata dari tiga variabel berikut : number1 = 56.3, number2 = 12 dan number3 = 2.78.
3. Dengan menggunakan variabel pada no 2, buatlah program untuk mencari nilai terkecil dari ketiga variabel tersebut.
4. Ambil tiga nilai ujian dari user dan hitung nilai rata-rata dari nilai tersebut. Berikan pernyataan "Selamat" pada output jika nilai rata-rata lebih besar atau sama dengan 60, selain itu beri output. Gunakan BufferedReader untuk mendapat input dari user, dan System.out untuk output hasilnya.
5. Buat sebuah program yang mencetak nama kalian selama seratus kali. Buat tiga versi program ini menggunakan while loop, do while dan forloop.
6. Dengan menggunakan kelas, buatlah program tentang kelas staf sekolah. Kelas ini adalah superclass yang mempunyai subclass guru dan tenaga administrasi.
- Kelas staf sekolah mempunyai variabel nama, alamat, jumlah anak, tanggal awal bekerja dan pangkat. Selain itu juga punya method lama bekerja (diperoleh dari tanggal saat ini dikurangi tanggal awal bekerja) dan method hitung gaji pokok. Gaji pokok diperoleh dari nilai gaji dasar ditambah tunjangan lama, tunjangan pangkat bekerja dan tunjangan anak. Selain itu mempunyai method hitung gaji total yang belum didefinisikan.
- Kelas guru, selain variabel dan method pada superclassnya, juga mempunyai variabel bidang keahlian dan method hitung tunjangan mengajar yang diperoleh dari banyaknya jam mengajar dikali upah per jam mengajar. Definisikan method hitung gaji total sebagai penjumlahan gaji pokok dengan tunjangan mengajar.
- Kelas tenaga administrasi, selain variabel dan method pada superclassnya, juga mempunyai variabel jam kerja seminggu dan method hitung upah lembur. Upah lembur dihitung jika seorang tenaga administrasi bekerja lebih dari 40 jam perminggu. Kelebihannya adalah jam lembur. Upah lembur = jumlah jam lembur dikali dengan upah per jam lembur. Definisikan method hitung gaji total sebagai penjumlahan gaji pokok dengan upah lembur.