Anda di halaman 1dari 53

BAB 1 Paradigma Bahasa Pemrograman

1.1 Paradigma Pemrograman


Paradigma pemrograman merupakan pandangan mendasar terkait tentang formulasi sebuah
solusi dalam bahasa pemrograman. Dengan kata lain paradigm pemrograman adalah bagaimana
cara kita memandang suatu masalah/cara berpikir untuk mendapatkan solusi atau memecahkan
suatu masalah. Paradigm pemrograman menjelaskan tentang perspektif/pandangan pemrograman
tentang program yang akan dibuatnya. Ada empat jenis paradigm pemrograman yaitu :
- Pemrograman functional
- Pemrograman procedural atau oteratif
- Pemrograman berorientasi objek
- Pemrograman deklaratif atau logic

1.1.1 Pemrograman Functional


Paradigma functional memandang penyelesaian masalah sebagai komposisi dan aplikasi yang
memetakan masalah ke jawaban. Pemrograman ini berdasarkan teori fungsi matematika. Artinya,
pemrograman ini terdiri atas fungsi-fungsi seperti fungsi-fungsi yang ada di matematika.
Penyelesaian masalah didasari atas aplikasi dari fungsi-fungsi tersebut. Fungsi merupakan
pembangun utama program sehingga fungsi-fungsi ini dapat melewatkan parameter dan
mengembalikan nilai yang sudah diproses.
Paradigma functional tidak lagi mempermasalahkan memorisasi dan struktur data, tidak ada
pemilihan antara data dan pemrograman, tidak ada lagi pengertian tentang variable.
Pemrograman tidak perlu mengetahui bagaimana mesin mengeksekusi atau bagaimana informasi
disimpan dalam memori.
Komponen Pemrograman Functional adalah :
- Objek data
- Fungsi built in
- Fungsi form
Contoh bahasa pemrograman functional adalah LISP.
Contoh implementasi bahasa pemrograman LISP, missal ingin mencari penyelesaian dari 2x2-5x-
3=0 dengan menggunakan rumus abc, maka sintaks programnya
> (setq a 2)
>2
>(setq b -5)
>-5
>(setq c -3)
>-3
Selanjutnya member nilai ke diskriminan d, yaitu b2-4ac
>(setq d (-(*b b) (*4 a c)))
>4
Karena d positif maka diperoleh dua penyelesaian real
>(/(+(-b)(sqrt d)(* 2 a)
]3
>(/(-(-b)(sqrt d)(* 2 a)
]-12

1.1.2 Pemrograman Procedural


Pemrograman procedural memandang penyelesaian masalah sebagai hasil dari serangkaian
langkah yang menyelesaikan sub masalah.
Pemrograman procedural didasari oleh konsep mesin Von Newmann sekelompok tempat
penyimpanan (memori), yang dibedakan menjadi memori instruksi dan memori data, masing-
masing dapat diberi nama dan harga. Instruksi akan dieksekusi satu persatu secara sekuensial
oleh sebuah pemroses tunggal. Beberapa instruksi menetukan instruksi berikutnya yang akan
dieksekusi. Data diperiksa dan dimodifikasi secara sekuensial pula. Program dalam paradigma
ini didasari pada strukturisasi informasi di dalam memori dan manipulasi dari informasi yang
disimpan tersebut. Kata kunci yang sering didengungkan dalam pendekatan ini adalah:
Algoritma + Struktur Data = Program
Paradigma procedural merupakan paradigma yang biasanya diajarkan pertama kali karena sangat
dekat dengan mekanisme eksekusi mesin (secara hardware, komputer bekerja secara sekuensial
atau berurutan)
Elemen dari pemrograman procedural yaitu
- Program utama
- Konstanta
- Variabel
- Operator
- Struktur data
Contoh bahasa pemrograman structural adalah Cobol, Basic, Pascal, Fotran, dan C.
Contoh implementasi pada pascal
Kode Program 1.1

Program ContohInteger;

Uses CRT;

Var y : Integer;

p : Real;

X : Real;

Begin

y := 5;

p := 6;

x := y + p;

Writeln(Nilai X adalah :,x:4:1);

End.

1.1.3 Pemrograman Berorientasi Objek (object-oriented programming)


Pemrograman berorientasi objek merupakan paradigma pemrograman yang berorientasikan
kepada objek. Semua data dan fungsi di dalam paradigma ini dibungkus dalam kelas-kelas atau
objek-objek. Paradigma ini didasari oleh kelas dan objek. Objek adalah instansi dari kelas objek
yang mempunyai atribut (kumpulan sifat), dan mempunyai kelakuan (kumpulan reaksi, method).
Objek yang satu dapat berorientasi pada objek yang lainnya lewat pesan, dengan tetap terjaga
integritasnya. Kelas mempunyai hirarki, anggota dari sebuah kelas juga mendapatkan turunan
atribut dari kelas di atasnya. Paradigm ini menawarkan modularitas, penggunaan kembali,
kemudahan modifikasi.
Contoh bahasa pemrograman yang berbasis paradigm berorientasi objek adalah Visual Foxpro,
Java, C++, Pascal, VB.Net, Simula, Ruby, Python, dan PHP.
Contoh implementasi pada bahasa pemrograman Java

1.1.4 Pemrograman Deklaratif


Pemrograman ini mendeskripsikan suatu masalah dengan pernyataan daripada menyelesaikan
masalah dengan implementasi algoritma. Paradigm ini didasari oleh pendefinisian relasi antar
individu yang dinyatakan sebagai predikat. Sebuah program logic adalah kumpulan aksioma
(fakta dan aturan deduksi). Pada saat program dieksejusi, pemakai mengajukan pertanyaan, dan
program akan menjawab apakah pernyataan itu dapat dideduksi dari aturan fakta yang ada.
Program akan memakai aturan deduksi dan mencocokkan pertanyaan dengan fakta-fakta yang
ada untuk menjawab pertanyaan.
Contoh bahasa pemrograman deklaratif adalah PROLOG dan CLIPS.
1.2 Mekanisme Eksekusi Program
Komputer merupakan benda yang bodoh yang hanya bisa menjalankan instruksi dalam
bahasa mesin, bukan bahasa manusia. Komputer yang pertama diprogram langsung dengan
menuliskan bahasa mesin ke dalam komputer, seiring berlalunya waktu, hal itu dirasakan tidak
efisien sehingga diciptakanlah bahasa assembly, berupa kata-kata singkat yang lebih mudah
diingat dibanding dengan kode yang harus dimasukkan langsung. Bahasa assembly sebenarnya
tidak jauh dari bahasa mesin namun sudah cukup untuk membantu pemrogram menulis
program dengan lebih mudah. Bahasa assembly ini disebut sebagai bahasa tingkat rendah.
Pada tahun enampuluhan, para ahli mulai banyak membuat bahasa yang lebih mudah dimengerti
oleh manusia, bahasa tersebut disebut sebagai bahasa tingkat tinggi. Ada banyak bahasa yang
diciptakan, bahkan sangat banyak, namun sedikit yang bertahan hingga saat ini. Tapi semua
bahasa tersebut memiliki kesamaan yaitu bahwa mereka tidak bisa langsung dimengerti oleh
komputer sehingga perlu diterjemahkan ke dalam bahasa mesin.
Penerjemahan dapat dilakukan dengan menggunakan program (yang pada awalnya dulu ditulis
dengan bahasa assembly) yang bisa berupa sebuah interpreter atau sebuah kompilator (atau
gabungan dari keduanya). Program penerjemah tersebut akan memeriksa sintaks (format
penulisan) apakah benar atau tidak, lalu menerjemahkan program tersebut ke dalam bahasa
mesin.

1.2.1 Interpreter
Interpreter adalah suatu program komputer yang mampu menerjemahkan program dari bahasa
tingkat tinggi yang dimengerti oleh manusia dan langsung menjalankan program tersebut. Kerja
interpreter seperti penerjemah untuk turis yang langsung menerjemahkan kalimat demi kalimat
yang dikatakan oleh sang turis.
Setiap kali kita membutuhkan program tersebut, maka interpreter akan bekerja menerjemahkan
program dari bahasa tingkat tinggi ke bahasa mesin untuk dieksekusi. Jadi siklus kerja ketika
kita membuat program dengan interpreter adalah: tulis/edit program, eksekusi.

1.2.2 Kompilator
Kompilator adalah suatu program komputer yang membaca seluruh program dari bahasa tingkat
tinggi yang dimengerti oleh manusia dan kemudian menerjemahkan keseluruhan program
tersebut dalam bahasa mesin. Program yang sudah diterjemahkan tersebut akhirnya akan
dijalankan oleh komputer. Kerja kompilator seperti penerjemah buku yang akan menerjemahkan
seluruh buku sekaligus, sehingga setiap orang bisa mengerti makna buku dalam bentuk
terjemahannya.
Kompilator hanya perlu bekerja sekali saja menerjemahkan bahasa tingkat tinggi ke bahasa
mesin, dan jika kita membutuhkan kembali program tersebut, kita hanya perlu menjalankannya,
kompilator tidak perlu bekerja lagi. Jadi siklus kerja jika kita memakai kompilator adalah:
tulis/edit program, kompilasi, eksekusi.
1.2.3 Pemriksaan Kesalahan Oleh Kompilator dan Interpreter
Kompilator dapat melakukan pemeriksaan kesalahan pada program saat kompilasi, kesalahan ini
hanya berupa kesalahan yang bisa diketahui secara statik (misalnya kesalahan penggunaan tipe
data), pemeriksaan ini umumnya disebut dengan compile time error checking. Tidak semua
kesalahan program bisa dideteksi saat kompilasi.
Kompilator juga bisa menyisipkan kode untuk melakukan pemeriksaan kesalahan pada saat
program berjalan, misalnya jika pengguna memasukkan bilangan nol sebagai pembagi maka
program bias dihentikan karena pembagian dengan nol tidak mungkin dilakukan. Pemeriksaan
kesalahan yang pada saat program berjalan disebut dengan run time error checking.
Pemeriksaan run time ini tergantung pada kompilator, ada kompilator yang melakukan banyak
pemeriksaan pada saat run time, ada juga yang tidak.
Sebagian besar interpreter menerjemahkan kode satu persatu, sehingga pemeriksaan kesalahan
selalu dilakukan saat run time meskipun ada juga yang melakukan pemeriksaan awal sebelum
kode mulai diinterpretasi.

1.2.4 Kompilator vs Interpreter


Apakah suatu bahasa diinterpretasi atau dikompilasi bergantung pada ketersediaan interpreter
atau kompilator untuk bahasa tersebut. Sebagai contoh, kita tidak dapat mengatakan bahwa
bahasa BASIC adalah bahasa yang diinterpretasi karena ada juga kompilator untuk bahasa
BASIC.
Interpreter dan kompilator masing-masing memiliki keuntungan dan kerugian. Kelebihan
interpreter adalah pengembangan program lebih cepat, tidak perlu melakukan kompilasi yang
mungkin butuh waktu lama, namun kerugiannya setiap kali program perlu dijalankan, interpreter
harus bekerja lagi, sehingga kecepatan eksekusi program menjadi kurang jika dibanding dengan
kompilator.
Sebaliknya penggunaan kompilator memungkinkan kita membentuk program yang dapat
langsung dijalankan dengan cepat (karena sudah dalam bahasa mesin), namun dibutuhkan waktu
yang relative lama dalam pengembangan programnya.

1.3 Kompilator + Interpreter


Meskipun tidak terlalu penting, namun perlu diketahui bahwa ada bahasa yang dikompilasi
namun tidak ke dalam bahasa mesin (ke bahasa antara), lalu diinterpretasi oleh suatu interpreter
untuk menjalankannya. Sebagian pekerjaan interpreter (memvalidasi program) sudah dilakukan
oleh kompilator, sehingga interpreter hanya perlu mengeksekusi program saja.
Contoh bahasa yang menggunakan pendekatan ini adalah: Java, C#, dan VB.NET

1.3.1 Debugger
Kesalahan pertama yang ditemukan pada salah satu komputer pertama (yang saat itu masih
sangat besar) adalah karena adanya serangga/kutu (bug) yang menyebabkan komputer tidak
bekerja. Sejak saat itu semua kesalahan, baik di bidang hardware maupun software komputer
disebut dengan bug (istilah ini lebih umum di bidang software dibanding hardware).
Proses untuk menemukan kesalahan program disebut juga dengan proses pencarian bug (istilah
proses ini adalah debug). Dalam pencarian kesalahan ini terkadang diperlukan program
pembantu yang dinamakan debugger. Program ini akan membantu pemrogram untuk melihat
bagaimana eksekusi program dilakukan oleh komputer, dan melihat kesalahan yang mungkin
ada ketika program sedang berjalan.

1.3.2 Editor, Kompilator dan IDE


Untuk memasukkan program ke dalam komputer, kita perlu tools yang dinamakan editor. Editor
adalah program yang mampu menerima teks dari manusia, dan menyimpannya ke dalam bentuk
digital yang dimengerti komputer. Editor juga memungkinkan kita melakukan koreksi terhadap
pengetikan yang kita lakukan (menghapus teks, menyalin teks, dan lain-lain). Bentuk kode
program yang kita masukkan ini disebut dengan kode sumber atau source code.
Untuk menjalankan program yang sudah kita ketikkan, kita akan membutuhkan kompilator
atau interpreter. Pada bahasa Pascal, kompilator lebih umum dipakai dibanding interpreter.
Perlu diperhatikan bahwa editor dan kompilator adalah dua program yang terpisah dan berbeda.
Sebuah IDE (Integrated Development Environment) adalah program yang menggabungkan
fungsi editor dan kompilator (serta terkadang debugger) dalam satu paket. IDE saat ini semakin
populer, bahkan banyak orang yang menyangka bahwa IDE sama dengan kompilator. Sebuah
IDE mungkin saja sekaligus memiliki fungsi kompilator, tapi tidak selalu demikian, terkadang
IDE hanya menyediakan fungsi editor, dan akan memanggil kompilator yang sesungguhnya
ketika kita akan mengkompilasi program.
BAB 2 Java Sebagai Bahasa Pemrograman Berorientasi Objek

2.1 Pengantar Java

Pada tahun 1991, sekumpulan insinyur Sun, yang dipimpin oleh


James Gosling, bermaksud membuat sebuah sebuah bahasa
pemrograman untuk komputer mini. Komputer tersebut tidak
memiliki tenaga yang besar, dan hanya memiliki memori kecil.
Berdasarkan spesifikasi tersebut, bahasa yang akan dibuat
haruslah kecil namun tetap aman dan handal. Selain itu, karena
banyak perusahaan dapat memilih CPU yang berbeda-beda, maka
bahasa tersebut tidak boleh tergantung pada platform tertentu. Project
ini diberinama : GREEN.
Tim pengembang, kemudian memutuskan untuk membuat bahasa yang menghasilkan kode
portable. Kode ini nantinya harus dapat dijalankan diberbagai mesin, sesuai interpreter
masing-masing, Gosling akhirnya memberi nama bahasanya Oak (konon Oak adalah nama
pohon yang sering ia lihat, di depan jendelanya di Sun). Namun karena sudah ada bahasa
pemrograman dengan nama Oak, akhirnya bahasa
tersebut diganti, dengan nama Java
Java meruapakan sebuah bahasa pemrograman, yang populer dikalangan para akademisi
dan praktisi komputer. Java dikembangkan pertama kali oleh James Gosling dari Sun
Microsystems pada tahun 1990-an. Java pertama kali dikembangkan untuk memenuhi
kebutuhan, akan sebuah bahasa komputer yang ditulis satu kali dan dapat dijalankan
dibanyak sistem komputer yang berbeda, tanpa perubahan kode
berarti. Kebanyakan bahasa komputer yang ada, memiliki keterbatasan migrasi ke sistem yang
berbeda.

Java diciptakan, sebagai sebuah bahasa baru dengan implementasi yang berbeda. Bahasa Java
merupakan bahasa berorientasi objek, yang diturunkan dari C++ dengan banyak
penyempurnaan. Pada umumnya, para pakar pemrograman berpendapat, bahwa bahasa Java
memiliki konsep yang konsisten dengan teori pemrograman objek dan aman untuk digunakan.
Kini universitas-universitas diberbagai negara berpaling dari bahasa Pascal atau C++ kemudian
memilih bahasa Java, sebagai bahasa untuk belajar pemrograman.
Komponen Java
JVM (Java Virtual Machine)
Java dapat berjalan pada sebuah sistem operasi maka membutuhkan suatu Java Virtual
Machine (JVM). JVM sendiri terdiri dari Java Runtime Environment (JRE) dan Java
Development Kit (JDK). Sun Microsystems mengeluarkan tiga kelas paket Java, yaitu J2-SE
JRE (hanya berisi JRE), J2- SE SDK (berisi JDK + JRE), dan J2-EE SDK (berisi JDK+JRE
dan tools untuk aplikasi enterprise). Untuk versi SE (Standard Edition) tersedia gratis pada
situs www.Java.com.
IDE (Integrated Development Environment)
IDE (Integrated Development Environment) adalah sebuah editor pemrograman sebuah
bahasa. Untuk Java sendiri ada banyak IDE yang tersedia dipasaran baik yang bersifat
gratis (freeware) ataupun yang berbayar. Beberapa IDE yang populer antara lain, JCreator
(www.jcreator.com), Netbeans (www.netbeans.org), JBuilder (www.borland.com/jbuilder), dan
lain-lain.

2.2 Kaidah dan Konvensi Sintaks Java


Setiap bahasa pemrograman memiliki aturan masing-masing. Dalam Java sendiri aturan
penamaan sebagai berikut:
1. Tidak menggunakan spasi
2. Java bersifat case sensitive (membedakan huruf besar dengan huruf kecil)
3. Nama file dokumen java harus sama dengan nama kelas
4. Setiap pernyataan Java diakhiri dengan tanda ;
5. Tidak memulai nama dengan simbol
6. Apabila sebuah variable maka penamaannya menggunakan huruf kecil
Contoh: int nilai = 6;
7. Apabila sebuah objek maka penamaannya diawali dengan huruf kapital (huruf besar)
Contoh: 1. Dalam penulisan class -> class Test {
2. dalam menulis Stirng -> (String [] args)
3. Dalam penulisan System -> System.out.println
8. Apabila sebuah konstanta, maka penamaannya ditulis dengan full kapital
Contoh: 1. final double PHI = 3.14;
2. final double G = 9.8;
9. Apabila terdapat lebih dari satu kata, maka spasi diganti dengan huruf kapital
Contoh: 1. nilai awal -> int nilaiAwal
2. objek lanjutan -> objekLanjutan
3. no class found exception -> noClassFoundException
10. Apabila terdapat lebih dari 1 kata pada konstanta maka spasi diganti dengan underscore
Contoh: right click -> RIGHT_CLICK

2.3 Variabel dan Operator


Variabel adalah satuan dasar penyimpanan dalam program Java. Suatu variable dapat bersifat
local (sementara), misalkan variable yang ada di perulangan for, atau dapat juga variable
instance yang dapat diakses oleh semua method dalam class. Dalam Java, secara eksplisit kita
harus mendeklarasikan variable sebelum kita menggunakannya. Untuk mendefinisikan variable
tentukan tipenya terlebih dahulu lalu nama variable tersebut diakhiri dengan titik koma. Bentuk
dasar dalam mendeklarasikan variable adalah seperti ini:
Kode Program 2.1

Sebagai contoh apabila kita ingin mendeklarasikan variable dengan nama x dan bertipe data
bilangan integer (int), maka dapat menulisnya dengan cara sbb:
int x;
Kode Program 2.2
public class ContohVariabel {
int panjang;
String namaLengkap;
double radius;

Terdapat beberapa persyaratan yang harus diperhatikan dalam penentuan nama variable pada
saat proses deklarasi yaitu sebagai berikut:
a. Nama variable tidak boleh ada spasi
b. Nama variable tidak boleh berupa angka atau diawali dengan karakter numeric
c. Nama variable tidak boleh mengandung karakter simbol, kecuali tanda $
d. Nama variable tidak boleh menggunakan kata kunci yang sudah didefiniskan

Inisialisasi variable
Java mengijinkan kita untuk melakukan inisialisasi terhadap variable yang dideklarasikan, nilai
inisialisasi adalah nilai yang digunakan sebagai nilai awal (default) sebelum akhirnya nilai
variable tersebut diisi atau diganti dengan nilai lain. Bentuk umum proses inisialisasi nilai ke
dalam variable adalah sbb:
Tipe namaVariabel = nilai;
Tipe namaVariabel = nilai1,
Contoh:
int index = 0;
char ch = A;
contoh dalam Java
Kode Program 2.3
Deklarasi Variabel Class
Variable kelas adalah variable yang dapat diakses oleh semua method di dalam class, termasuk
static method seperti method main. Ketika mendeklarasikan variable class, ada dua aturan dasar
yang harus diikuti, yaitu:
1. Menempatkan deklarasi variable pada blok class, tetapi tidak dalam method yang berada dalam
class.
2. Kita harus memasukkan kata kunci static dalam pendeklarasian variable class. Kata kunci static
ditempatkan sebelum tipe variable.
Kode Program 2.4
public class SalamSatu {
//Mendeklarasikan variable class
static String salam = Assalamualaikum;

public static void main (String[] args) {


System.out.println(salam);
System.out.println(nama);
}

static String nama = Galih Hendro Martono


}

Dapat dilihat dari contoh di atas bagaimana kita mendeklarasikan variable kelas di awal dan di
akhir class, kedua-duanya bias dilakukan, tetapi dianjurkan untuk mendeklarasikan setiap
variable di awal class karena memudahkan untuk maintance kode di kemudian hari.

Deklarasi Variable Instance


Deklarasi variable instance sama halnya dengan variable class, tetapi tidak menggunakan kata
static dalam pendeklarasianya. Variable instance terhubung dengan instance dari class. Jadi kita
hanya bisa menggunakannya ketika membuat instane dari class yang bersangkutan. Karena static
method tidak terhubung dengan instance dari class, kita tidak bias menggunakan variable
instance dalam static method dan memasukannya ke dalam main method. Berikut adalah contoh
dan pendeklarasian variable instance dan jika kita mencoba untuk mengakses variable tersebut
melalui main method (yang merupakan static method) maka saat di compile akan mengalami
error.
Kode Program 2.5

Apabila kita compile program di atas, maka akan terjadi error dengan pesan sebagai berikut:
Deklarasi Variabel Lokal
Variable local adalah variable yang dideklarasikan di dalam badan method. Jadi kita hanya dapat
menggunakan variable tersebut di dalam method saja. Method lain dalam class tidak peduli akan
keberadaan variable tersebut. Dan variable local hanya akan ada jika method (yang memiliki
variable local tersebut) diekseskusi. Dalam pendeklarasiannya kita tidak perlu menambahkan
kata static (seperti yang harus dilakukan pada saat mendeklarasikan variable class). Jika kata
static digunakan dalam pendeklarasian variable local, maka compiler akan menghasilkan pesan
error dan menolak untuk melakukan compile terhadap program.
Berikut adalah contoh program yang menunjukkan pendeklarasian variable local di dalam
method main:
Kode Program 2.6

Berbeda dengan variable class dan instance, variable local dideklarasikan terlebih dahulu
sebelum statement yang menggunakan variable tersebut. Perhatikan contoh program berikut ini:
Kode Program 2.7

Contoh sourcode di atas saat di kompilasi akan terjadi error seperti berikut:
Dapat kita lihat dari pesan error tersebut compiler tidak bisa menenmukan variable salam, karena
variable tersebut baru dideklarasikan pada line ke-9, sedangkan statement yang berada pada baris
ke-7 (dan juga baris ke-8) sudah menggunakan variable tersebut.

Konstanta
Konstanta adalah sebuah variable yang nilainya tetap dan tidak bisa dirubah lagi. Konstanta
digunakan untuk menyimpan data yang tidak akan kita ubah. Dalam Java, pendeklarasiannya
dituliskan dengan keyword final di depan tipe variable. Sekali konstanta diberi nilai, maka nilai
tersebut tidak dapat diubah.
Contoh:
final int uang_transport = 35.000;

Operator
Pada Java operator di bagi menjadi empat kelompok besar, yaitu:
- Operator Aritmatika
- Operator Relasional
- Operator Logika
- Operator Bitwise

a. Operator Aritmatika
Operator aritmatika adalah operator-operator yang digunakan untuk melakukan perhitungan-
perhitungan matematis, seperti penjumlahan, pengurangan, pembagian dan perkalian. Di dalam
table berikut akan ditunjukkan daftar operator yang termasuk ke dalam kelompok operaor
aritmatika
Tabel 2.1 Operator Aritmatika
Operator Keterangan
+ Penjumlahan
- Pengurangan
* Perkalian
/ Pembagian
% Modulus (sisa bagi)
++ Increment
-- Decrement
Operand dari operator aritmatika harus bertipe numerik, tidak bisa digunakan untuk tipe data
Boolean.

b. Operator Relasional
Operator relasional adalah operator yang menyatakan hubungan antara satu operand dengan
operand lainnya. Table berikut ini menunjukkan daftar operator relasional yang terdapat dalam
Java.
Tabel 2.2 Operator Relasional
Operator Keterangan
== Sama dengan
!= Tidak sama dengan
> Lebih besar
< Lebih kecil
>= Leih besar atau sama dengan
<= Lebih kecil atau sama dengan

c. Operator Logika
Operator Boolean digunakan untuk melakukan operasi terhadap dua operand yang bertipe
Boolean. Hasil yang diberikan ada operasi ini juga akan bertipe Boolean. Berikut ini table yang
menunjukkan operator Boolean.
Tabel 2.3 Operator Logika
Operator Keterangan
&& Operator AND
|| Operator OR
^ Operasi XOR
! Operasi NOT

d. Operator bitwise
Operator bitwise digunakan untuk melakukan operasi Boolean terhadap dua buah operand
bertipe integer. Operasi ini dilakukan bit demi bit. Dengan demikian, secara implicit nilai integer
tersebut akan dikonversi terlebih dahulu ke dalam bentuk biner. Dalam operasi ini, nilai true
direpresentasikan dengan nilai 1 dan falses dengan nilai 0. Berikut ini daftar operator bitwise
yang terdapat dalam Java.
Table 2.4 Operator Bitwise
A B A&B A|B A^B !A
1 1 1 1 0 0
1 0 0 1 1 0
0 1 0 1 1 1
0 0 0 0 0 1
2.4 Struktur Percabangan dan Perulangan
2.4.1 Percabangan
Struktur kontrol percabangan adalah pernyataan dari Java yang mengijinkan user untuk memilih
dan mengeksekusi blok kode spesifik dan mengabaikan blok kode yang lain. Jenis percabangan
pada Java terdiri dari:
Statement if
Statement if-else
Statement switch case

2.4.1.1 Statement if
Percabangan if di Java menyatakan pernyataan akan dieksekusi jika memenuhi syarat atau
kondisi tertentu. Sintaks percabangan ini adalah sebagai berikut:
if(kondisi){
Statement1;
Statement2;
.
}
Kode Program 2.8

Jika program di atas dijalankan, maka hasilnya adalah tulisan sepuluh karena kondisi pada if
bernilai true, jika kondisi bernilai salah, misal nilai == 100, maka program tidak akan
menghasilkan tulisan apa-apa.

2.4.1.2 Statement if-else


Percabangan ini untuk memilih satu dari dua kemungkinan kemunculan. Dengan kata lain,
bentuk if-else menyebabkan eksekusi dijalankan melalui sekumpulan boolean, sehingga hanya
bagian tertentu program yang dijalankan. Berikut bentuk umum pernyataan if else:
if(kondisi)
statement jika kondisi benar
else
statement jika kondisi salah
Kode Program 2.9
Jika program di atas dijalankan, maka hasilnya adalah tulisan Bukan Sepuluh, hal ini
dikarenakan nilai bernilai 8 bukan 10.

2.4.1.3 Percabangan switch-case


Pernyataan switch memberikan suatu cara untuk mengirim bagian program berdasarkan nilai
suatu variable atau pernyataan tunggal. Percabangan switch dimaksudkan untuk menangani
banyak kemungkinan kemunculan. Bentuk umum percabangan switch:
switch(expression) {
case value1;
break;
case value2;
break;
case valueN;
break;
default;
}
Pada percabangan switch pertama, diperlukan sebuah variable, setelah itu pada bagian case
dibandingkan, jika sama, maka instruksi akan dijalankan sampai menemui tanda break.
Kode program 2.10

Jika program diatas dijalankan, maka program akan menghasilkan tulisan Bukan Hari Libur

2.4.2 Perulangan
Struktur kontrol perulangan adalah statement dari Java dimana kita bisa mengeksekusi blok kode
berulang-ulang dalam kurun nilai tertentu. Ada tiga jenis struktur kontrol perulangan yaitu while,
do-while, dan for.

2.4.2.1 Perulangan while


Pernyataan while berguna untuk melakukan proses perulangan untuk sebuah kondisi, selama
kondisi tersebut bernilai benar (true), maka perulangan akan terus berjalan, dan akan terhenti
ketika kondisi bernilai salah (false). Bentuk pernyataan while seperti berikut ini:

Kode Program 2.11

Jika program tersebut dijalankan, maka hasilnya adalah tulisan dari no 1 sampai 10. Dan saat
jumlah bernilai 11, maka perulangan akan terhenti dikarenakan kondisi bernilai false (11<=10).

2.4.2.2 Perulangan do-while


Perulangan do-while merupakan perulangan yang hampir mirip dengan perulangan while namun
perbedaannya, pada perulangan do-while, maka minimal instruksi akan dijalankan sekali. Bentuk
pernyataan do-while sebagai berikut:
do{
statement1;
statement2;
;
}
while(kondisi);
Kode Program 2.12

Jika program dijalankan, maka akan menghasilkan keluaran 100, artinya walaupun kondisi salah,
namun minimal isi instruksi akan dijalankan sekali, hal ini dikarenakan proses do-while berbeda
dengan while, dimana do-while pertama melakukan instruksi baru mengecek kondisi, sedangkan
while pertama mengecek kondisi baru melakukan instruksi.

2.4.2.3 Perulangan for


Perulangan for merupakan perulangan yang memiliki variable untuk melakukan penkondisian,
berbeda dengan while dengan while dan do-while yang kita harus membuat sebuah variable di
luar untuk melakukan pengkondisian, pada perulangan for, ditempatkan sebuah blok untuk
membuat variable dan melakukan proses pengkondisian. Bentuk pernyataan for seperti berikut:
Misal ingin menampilkan angka 1samapai 100, maka dapat menggunakan perulangan for.

2.5 Perintah break


Perintah break merupakan perintah yang dapat digunakan untukmenghentikan proses perulangan,
contoh:

Maka program hanya akan menampilkan angka 1 sampai 50, karena pada saat i mencapai 50,
program dihentikan oleh perintah break.

2.6 Perintah continue


Perintah continue dapat digunakan untuk meloncati sebuah perulangan, maksudnya adalah
instruksi yang seharusnya dapat dilewati, hal ini berarti instruksi tidak akan dijalankan.
Contoh:

Jika program di atas dijalankan, maka hasilnya akan menampilkan angka-angka ganjil saja, hal
ini dikarenakan saat nilai i merupakan angka genap, maka perintah continue membuat program
tidak akan menampilkan angka genap.
BAB 3 PEMROGRAMAN BERORIENTASI OBJEK

3.1 Pemrograman Berorientasi Objek


Object Oriented Programming atau dapat juga disebut dengan pemrograman berorientasi pada
objek merupakan metode pemrograman yang sedang booming saat ini. Metode ini digunakan
untuk mencari cara atau bagaimana membuat sebuah program yang lebih mudah dan
meminimalisir kesalahan dalam proses compiling-nya. Dalam dunia nyata kita sering melihat
berbagai macam objek yang memang dapat dilihat secara kasat mata dan dapat dirasakan karena
mempunyai bentuk. Tetapi dalam sebuah proses program, objek terkadang merupakan
sekumpulan perintah-perintah yang dijalankan oleh sebuah compiler tertentu sehingga dapat
menampilkan hasil yang diinginkan oleh si pembuat program.

OOP (Object Oriented Programming) atau Pemrograman Berorientasi Objek adalah suatu cara
baru dalam berfikir serta berlogika dalam menghadapi masalah-masalah yang akan dicoba diatasi
dengan bantuan komputer. OOP, tidak seperti pendahulunya (Pemprograman Terstruktur),
mencoba melihat permasalahan lewat pengamatan dunia nyata dimana setiap objek adalah entitas
tunggal yang memiliki kombinasi struktur data dan fungsi tertentu. Ini kontras dengan
pemrograman terstruktur dimana struktur data dan fungsi didefinisikan secara terpisah dan tidak
berhubungan secara erat.

Dengan menggunakan OOP maka dalam melakukan pemecahan suatu masalah kita tidak melihat
bagaimana cara menyelesaikan suatu masalah tersebut (terstruktur) tetapi objek-objek apa yang
dapat melakukan pemecahan masalah tersebut. Sebagai contoh anggap kita memiliki sebuah
departemen yang memiliki manager, sekretaris, petugas administrasi data dan lainnya. Misal
manager tersebut ingin memperoleh data dari bag administrasi maka manager tersebut tidak
harus mengambilnya langsung tetapi dapat menyuruh petugas bagian administrasi untuk
mengambilnya. Pada kasus tersebut seorang manager tidak harus mengetahui bagaimana cara
mengambil data tersebut tetapi manager bisa mendapatkan data tersebut melalui objek petugas
administrasi. Jadi untuk menyelesaikan suatu masalah dengan kolaborasi antar objek-objek yang
ada karena setiap objek memiliki deskripsi tugasnya sendiri.

Pemrograman berorientasi objek bermaksud untuk memecahkan masalah programming mirip


dengan cara berfikir manusia dan bagaimana manusia berinteraksi dengan dunia. Kita telah
melihat bagaimana masalah programming dipecahkan dengan membaginya menjadi instruksi-
instruksi kecil yang dirangkai menjadi suatu kesatuan tugas. Cara ini disebut juga dengan
pemrograman berdasarkan prosedur.

Pada pemrograman berorientasi objek, kita membagi masalah pemrograman berdasarkan objek
atau "sesuatu" benda. Objek ini diibaratkan seperti makhluk hidup, yaitu memiliki ciri-ciri fisik
dan juga perilaku. Dalam pemrograman berorientasi objek, ciri-ciri fisik ini disebut juga sebagai
atribut, pada dasarnya berisi informasi tentang objek tersebut. Sedangkan perilaku disebut
sebagai metode, yaitu bagaimana suatu objek bertindak atau melakukan sesuatu.
Dengan cara ini diharapkan pemrograman berorientasi objek merupakan pemrograman yang
lebih alami dibandingkan dengan pemrograman berorientasi prosedur, karena cara fikir kita
sudah terbiasa dengan bagaimana kita berinteraksi dengan dunia.

Sampai tingkat tertentu, PBO hanya merubah cara pandang programmer. Objek dalam kaitannya
dengan dasar pemrograman adalah gabungan dari variabel (dalam hal ini atribut) dan subrutin
(yaitu metode) yang berinteraksi dengan variabel pada objek.

Banyak bahasa pemrograman lain yang juga mendukung konsep PBO, akan tetapi Java
merupakan bahasa yang mendukung penuh PBO, di antaranya karena Java memiliki beberapa
fitur penting yang berbeda dari bahasa standar. Untuk menggunakan fitur ini, kita harus
mengubah cara pandang kita terlebih dahulu.

3.2 Konsep Objek & Kelas


3.2.1 Kelas
Kelas merupakan cetak biru (blueprint) dari objek atau dengan kata lain sebuah kelas
menggambarkan ciri-ciri objek secara umum. Kelas digunakan untuk membuat objek. Contoh
template (cetakan) roti digunakan untuk membuat banyak roti.

Gambar 2.1 Contoh Pembentukan Kelas

Contoh lain misalkan Suzuki Smash, Yamaha Jupiter, Honda 125 FI, dan Kawasaki KZR
merupkan objek dari kelas sepeda motor. Suzuki smash dan objek lainnya juga memiliki
kesamaan atribut (merk, tipe, berat, kapasitas bensin, tipe mesin, warna, dan harga) dan method
untuk mengakases data pada atributnya (misalnya fungsi untuk menginputkan data merk, tipe,
berat dsb serta fungsi untuk mencetak data merk, tipe, berat, dsb).
Kode Program 3.1
Class SepedaMotor
{
private String merk, type;
private int tangki;
private long harga;

public void setMerk (String merk)


this.merk = merk;
}
public String getMerk () {
return merk;
3.2.2
} Objek
}
Objek merupakan segala sesuatu yang ada di dunia ini, yaitu manusia, hewan, tumbuhan, rumah,
kendaraan, Mobil, sepeda motor, gelas, computer, meja dan lain sebagainya. Contoh-contoh
objek nyata pada kehidupan kita. Pada pemrograman berorientasi objek, kita akan belajar
bagaimana membawa konsep objek dalam kehidupan nyata menjadi objek dalam dunia
pemrograman.
Setiap objek dalam dunia nyata pasti memiliki 2 elemen penyusunnya, yaitu keadaan (state) dan
perilaku/sifat (behavior). Sebagai contoh, sepeda memiliki keadaan yaitu warna, merk, jumlah
roda, ukuran roda. Dan perilaku/sifat sepeda adalah berjalan, berhenti, belok, menambah
kecepatan, mengerem. Pada saat objek diterjemahkan ke dalam konsep PBO, maka elemen
penyusunnya juga terdiri atas 2 bagian, yaitu:
- Atribut, merupakan ciri-ciri yang melekat pada suatu objek (state) : pedal, roda, jeruji,
warna, jumlah roda.
- Method, merupakan fungsi-fungsi yang digunakan untuk memanipulasi nilai-nilai pada
atribut atau untuk melakukan hal-hal yang dapat dilakukan suatu objek (behavior) :
kecepatannya, menaik, kecepatannya menurun, perpindahan gigi sepeda.
Objek dalam konsep PBO memiliki keadaan dan perilaku yang sama seperti halnya objek di
dunia nyata, karena objek dalam konsep PBO merupakan representasi objek dari dunia nyata.
Objek dalam PBO mempresentasikan keadaan melalui variable-variabel (atribut), sedangkan
perilakunya direpresentasikan dengan method (yang merupakan suatu fungsi yang berhubungan
dengan perilaku objek tersebut maupun berhubungan dengan atribut dari objek tersebut). Jadi
dalam PBO state disimpan pada variable dan tingkah laku disimpan pada method.
Objek yang memiliki kesamaan atribut dan method dapat dikelompokkan menjadi sebuah kelas.
Dan objek-objek yang dibuat dari suatu kelas itulah yang disebut dengan instant of kelas atau
instance. Untuk menginstansi (membuat) objek dari kelas, gunakan operator new.
Sintaks membuat objek dari suatu kelas:
namaClass namaObjek = new namaClass()
Kode Program 3.2
Class Latihan1a
{
public static void main (String [] args) {
SepedaMotor motor = new SepedaMotor();
motor.setMerk (Suzuki);
System.out.println (Motor ini bermerk + motor.getMerk());
}
}

Perhatikan class Latihan1a diatas, nama objek (instant of class) dari class SepedaMotor adalah
motor.
Perhatikan keyword this pada class SepedaMotor. Untuk membedakan variable merk pada
parameter dan variable merk pada atribut dari class SepedaMotor, digunakanlah keyword this.
Sehingga untuk menggunakan atribut merk pada class SepedaMotor, digunakan:
this.merk
3.3 Atribut dan Method
Atribut adalah data yang membedakan antara objek yang satu dengan yang lain. Dalam class
atribut disebut sebagai variable. Pada contoh class Latihan1a, atribut dari class tersebut adalah
merk, tipe, tangki, dan harga, yang ini berarti bahwa setiap objek dari class sepeda motor (atau
dengan kata lain setiap sepeda motor yang ada di dunia nyata) pasti memiliki merk, tipe
motornya, kapasitas maksimal dari tangki BBM, dan harga jual sepeda motor tersebut di pasaran.
Method adalah semua hal yang bisa dilakukan oleh objek dari suatu kelas. Method dapat
digunakan untuk mengubah nilai atribut suatu objek, menerima informasi dari objek lain dan
mengirim informasi ke objek lain untuk melakukan suatu task, dengan kata lain method
merupakan cara objek berkomunikasi dengan objek lain. Dalam OOP, pastikan setiap method
hanya melakukan satu tugas, jika tidak, pecah method tersebut ked dalam beberapa method yang
lebih kecil.
Contoh method dari class Latihan1a adalah setMerk(String merk) dan getMerk() yang berfungsi
untuk mengambil nilai atribut merk.
Secara umum method (ada yang memyebutnya fungsi) itu ada 2 macam, yaitu method yang
mengembalikan nilai dan method yang tidak mengembalikan nilai. Contoh method yang
mengembalikan nilai adalah method getMerk() dimana hasil dari method ini adalah
mengembalikan nilai string dari atribut merk. Sedangkan contoh method yang tidak
mengembalikan nilai adalah method setMerk(String merk), yaitu dengan cirri tipe data dari
method tersebut adalah void.
Sintaks untuk membuat method:
Accessmodifier tipeMethod namaMethod (.)
Keterangan
Parameter -> tipeData1 namaVar1, tipeData2 namaVar2..
Contoh:
Public long getHarga()
Kode Program 3.3 Contoh Class, Object, Variabel, method
class VolcanoRobot {
String status;
int speed;
float temperature;
void checkTemperature() {
if (temperature > 660) {
status = "returning home";
speed = 5;
}
}
void showAttributes() {
System.out.println("Status: " + status);
System.out.println("Speed: " + speed);
System.out.println("Temperature: " + temperature);
}
}
Kode Program 3.4 Contoh Class, object, variable, dan method
public static void main(String[] arguments) {
VolcanoRobot dante = new VolcanoRobot();
dante.status = "exploring";
dante.speed = 2;
dante.temperature = 510;
dante.showAttributes();
System.out.println("Increasing speed to 3.");
dante.speed = 3;
dante.showAttributes();
System.out.println("Changing temperature to 670.");
dante.temperature = 670;
dante.showAttributes();
System.out.println("Checking the temperature.");
dante.checkTemperature();
dante.showAttributes();
}
}

3.4 Konsep Dasar OOP


- Abstraksi
- Encapsulasi
- Pewarisan (Inheritance)
- Polymorfisme

3.4.1 Abstraksi
Abstraksi adalah pengabstrakan atau penyembunyian kerumitan suatu proses. Abstraksi
menjelaskan definisi dari objek pada class dalam suatu fungsi (method) atau fungsi khusus
(constructor). Sebuah kelas dapat dideklarasikan sebagai kelas abstrak. Tujuan membuat kelas
abstrak adalah agar satu kelas lain dapat memperluasnya (extend) dengan jalan menjadi subclass
darinya.
Contoh Abstraksi:
Contoh berikut akan menjelaskan penggunaan class abstrak dalam pemrograman Objek dalam
Java. Kelas abstrak yang dibuat adalah kelas Animal, kemudian dengan dua jenis variabel,
jumlah kaki dan warna. Ditambahkan method berdasarkan cara jalan dan suaranya.
Kode Program 3.5
public abstract class Hewan {
private int jmlKaki;
private Color warna;
public abstract void jalan();
public abstract void suara();
}
3.4.2 Enkapsulasi
Selain dengan menggunakan metoda abstraksi dalam menyembunyikan method pada super class,
maka juga dapat dilakukan dengan proses pembungkusan suatu fungsi. Dengan kata lain,
sebenarnya proses pembungkusan itu sendiri merupakan salah satu metoda atau mekanisme
untuk melakukan abstraksi. Dalam pemrograman tradisional, proses semacam ini sering juga
disebut dengan penyembunyian informasi (information hiding).
Dalam melakukan pembungkusan kode dan data dalam java terdapat tiga tingkatan akses data
yang perlu diketahui yaitu: Engkapsulasi berhubungan class control yang diberlakukan terhadap
class member yang ada di dalamnya
1. Tingkat akses private
2. Tingkat akses protected
3. Tingkat akses public
1. Tingkat Akses Private ( Encapsulation- Private)
Akses Private berarti bahwa method yang digunakan hanya dapat diakses oleh kelas
yang memilikinya.
Dengan mendeklarasikan data dan method menggunakan akses private, ini berarti data
dan method tersebut tidak boleh diakses atau dignakan oleh kelas-kelas lain yang terdapat
di dalam program.
Sebuah variabel atau method yang dideklarasikan private hanya dapat diakses oleh
method yang merupakan member dari kelas tersebut. Ia tidak dapat diakses oleh kelas
lain yang berada di dalam package yang sama ataupun di lain package.
Untuk mendeklarasikan suatu data atau method dengan tingkat akses private, digunakan
kata kunci private.

2. Tingkat akses Protected


Suatu data maupun method yang dideklarasikan dengan tingkat akses protected dapat
diakses oleh kelas yang memilikinya dan juga oleh kelas-kelas yang masih memiliki
hubungan turunan.
Access control protected berarti member dapat diakses oleh kelas yang berada dalam
package yang sama dan subclass yang berada di dalam package yang berbeda.
Untuk mendeklarasikan tipe data atau method protected digunakan kata kunci protected.

3. Tingkat akses public


Tingkat akses publik merupakan kebalikan dari tingkat akses private.
Data dan method yang bersifat public dapat diakses oleh semua bagian dalam program.
Dengan kata lain, data-data maupun method-method yang dideklarasikan dengan tingkat
akses publik akan dikenali dan diakses oleh semua kelas yang ada di dalam program, baik
yang merupakan kelas turunan maupun kelas yang tidak memiliki hubungan sama sekali.

3.4.3 Pewarisan (Inheritance)


Model Pemrograman berorientasi objek juga menerapkan konsep pewarisan.
Dalam sebuah program, suatu kelas dapat diturunkan menjadi kelas-kelas baru lainnya
yang akan mewarisi beberapa sifat atau perilaku dari kelas induknya.
Semua class dalam Java, termasuk class yang membangun Java API, merupakan subclass
dari superclass Object.
Contoh dari hirarki class:

Gambar 3.1 Contoh Pewarisan


Pewarisan ( inheritance) terdiri dari :
1. Superclass
Adalah class yang letaknya di atas class tertentu di dalam hierarki.
2. Subclass
Adalah class yang letaknya di bawah class tertentu di dalam hierarki.
Untuk mengambil sebuah class, gunakan keyword extends.
Keuntungan penggunaan Inheritance dalam OOP adalah : Reusability.
Reusability maksudnya yaitu:
1. Ketika behavior(method) dideklarasikan dalam superclass, behavior tersebut otomatis
diwariskan ke seluruh subclass.
2. Jadi, Anda dapat meng-enkode method hanya sekali dan method tersebut dapat
digunakan oleh seluruh subclass
3. Sebuah subclass hanya perlu mengimplementasikan perbedaan antara dirinya sendiri
dan parent-nya.

3.4.4 Polimorfisme
Polimorfisme adalah kemampuan suatu objek untuk mempunyai lebih dari satu bentuk.
Polymorphism membuat objek-objek yang berasal dari subclass yang berbeda, diperlakukan
sebagai objek-objek dari satu superclass. Hal ini terjadi ketika memilih method yang sesuai
untuk diimplementasikan ke objek tertentu berdasarkan pada subclass yang memiliki method
bersangkutan.
Pada contoh ini, kita diberikan parent class yaitu Person dan subclassnya adalah Student,
sekarang kita tambahkan subclass lainnya dari Person yaitu Employee.
Berikut adalah hirarki class nya:
Gambar 3.2 Contoh Polimorfisme
Dalam Java, kita dapat membuat referensi dari suatu superclass ke object dari subclassnya.
Kode Program 3.6
public static main( String[] args ) {
Person ref;
Student studentObject = new Student();
Employee employeeObject = new Employee();
ref = studentObject; //titik referensi Person kepada
// sebuah object Student
}

Misalnya, kita memiliki sebuah method getName dalam superclass Person. Dan kita meng-
override method ini di kedua subclass yaitu Student dan Employee.
Kode Program 3.7
public class Student {
public String getName(){
System.out.println(Student Name: + name);
return name;
}
}
public class Employee {
public String getName(){
System.out.println(Employee Name: + name);
return name;
}
}

Contoh lain dari penerapan polimorfisme misalkan membuat class hewan dan membuat sublass
burung dan harimau, maka bila sebuah burung menerima pesan gerak cepat, dia akan
mengerakkan sayapnya dan terbang. Bila seekor harimau menerima pesan yang sam, namun
yang sesuai dengan kemampuan hewan tersebut. Ini disebut polimorfisme karena sebuah variable
tunggal dalam program dapat memegang berbagai jenisobjek yang berbedaselagi program
berjalan, dan teks program yang sama dapat memanggil beberapa metode yang berbeda di saat
yang sama.
BAB 4 Konsep Berorientasi Objek

4.1 Konstuktor
Konstruktor adalah method khusus yang didefinisikan di dalam kelas dan akan dipanggil secara
otomatis setiap kali terjadi instansiasi objek. Konstruktor itu sendiri berfungsi untuk melakukan
inisialisasi nilai (melalui parameter) terhadap data yang terdapat pada kelas bersangkutan.
Apabila kita tidak mendefinsikan konstruktor dalam kelas yang kita buat, maka secara otomatis
Java akan membuatkannya untuk kita. Konstruktor semacam ini dinamakan default konstruktor.
Default konstruktor akan menginisialisasi semua data yang ada dengan nilai nol. Namun, sekali
kita mendefinisikan sebuah konstruktor baru untuk kelas yang kita buat, maka default
konstruktor sudah tidak berfungsi atau tidak digunakan lagi. Sama halnya seperti method,
konstruktor juga dapat memiliki parameter dan juga dapat di overload. Pembahasan mengenai
overload method dan overload konstruktor akan di bahas pada bagian lain.
Hal yang perlu diperhatikan pada saat mendefinisikan suatu konstruktor kelas adalah tipe
kembalian. Konstruktor tidak memiliki tipe kembalian, juga tidak void. Selain itu nama
konstruktor haruslah sama persis dengan nama kelas yang didefinisikan. Berikut contoh dari
konstruktor.
Kode Program 4.1
Class Kotak {
double panjang;
double lebar;
double tinggi;
//Mendefinisikan constructor untuk kelas kotak
Kotak() {
panjang = 4;
lebar = 3;
tinggi = 2;
}
double hitungVolume() {
return (panjang * lebar * tinggi);
}
}

class DemoConstructor1 {
public static void main(String[] args) {
Kotak k1, k2;
k1 = new Kotak();
k2 = new Kotak();
System.out.println(Volume k1 = + k1.hitungVolume());
System.out.println(Volume k2 = + k2.hitungVolume());
}
}
4.2 Kata kunci static dan final
Pada kode program di atas, kita mengisikan nilai awal untuk data panjang, lebar, dan tinggi
masing-masing dengan nilai 4, 3, dan 2. Hal ini akan berlaku setiap pembentukan objek kotak.
Berikut ini hasil yang akan diberikan apabila program di atas dijalankan.
Volume k1 = 24.0;
Volume k2 = 24.0;
Proses inisialisasi dengan cara di atas masih dapat dikatakan kurang dinamis. Pasalnya, setiap
kali pembentukan objek kotak, nilai yang dijadikan lebih awal selalu 4, 3, dan 2. Untuk
menjadikan constructor lebih bersifat dinamis, maka kita dapat membubuhkan parameter ke
dalamnya, seperti yang tampak pada contoh program berikut ini.
Kode Program 4.2
class Kotak {
double panjang;
double lebar;
double tinggi;
// Mendefinisikan constructor dengan parameter
Kotak(double p, double l, double t) {
panjang = p;
lebar = l;
tinggi = t;
}
double hitungVolume() {
return (panjang * lebar * tinggi);
}
}

class DemoConstructor2 {
public static void main(String[] args) {
Kotak k1, k2;
K1 = new Kotak (4, 3, 2);
K2 = new Koatak (6, 5, 4);
System.out.println(Volume k1 = + k1. hitungVolume())
System.out.println(Volume k2 = + k2. hitungVolume())
}
}

Kali ini, constructor yang kita buat ditambah dengan parameter. Hal ini menyebabkan nilai awal
dapat bersifat dinamis tergantung dari nilai-nilai yang dilewatkan pada saat pembentukan objek.
Perhatikan kode berikut:
k1 = new Kotak (4, 3, 2);
k2 = new Kotak (6, 5, 4);
Baris pertama menunjukkan bahwa kita melakukan inisialisasi panjang dengan nilai 4, lebar
dengan nilai 3, dan tinggi dengan nilai 2. Adapun baris kedua kita menginisialisasi data panjang,
lebar dan tinggi masing-masing dengan nilai 6, 5, dan 4.
4.2 Melakukan Overload terhadap Method
Dalam suatu kelas, kita dapat mendefinisikan lebih dari satu method dengan nama yang sama,
selama parameter yang terdapat pada method-method tersebut berbeda. Parameter dalam suatu
method dikatakan berbeda dari method lainnya apabila:
Jumlahnya berbeda, meskipun tipe datanya sama
Tipe datanya berbeda, meskipun jumlahnya sama
Jumlah dan tipe datanya berbeda
Proses pendefinisian method dengan nama sama ini disebut dengan overload. Perhatikan dua
buah method berikut ini.
Kode Program 4.3
int bagi (int a, int b) {
return a/b;
}
double bagi (double a, double b) {
return a/b
}

Kode di atas legal untuk mendefinisikan di dalam sebuah kelas. Pada contoh tersebut, kita
mendefinisikan dua buah method dengan nama yang sama, tapi paarmeternya berbeda. Dalam
kasus ini, parameter dibedakan berdasarkan tipe datanya. Method bagi() pertama mengambil dua
buah parameter bertipe int, sedangkan method kedua parameternya bertipe double. Sebagai
catatan, proses overload tidak berlaku untuk method yang hanya membedakan tipe
kembaliaannya saja tetapi parameternya sama. Perhatikan kembali contoh berikut:
Kode Program 4.4
int bagi (int a, int b) {
return a/b;
}
double bagi (int a, int b) {
return a/b
}

Kode di atas tidak diperbolehkan dan akan menyebabkan kesalahan pada saat kompilasi.
Alasannya, karena terdapat adanya duplikasi nama method. Berikut ini contoh program yang
akan menunjukkan pendefinisian proses overload method di dalam sebuah kelas.
Kode Program 4.5
Class Pembagian {
//Mendefinisikan method dengan dua parameter bertipe int
int bagi (int a, int b) {
return a/b;
}
//Mendefinisikan method dengan dua parameter bertipe double
double bagi (double a, double b) {
}
}
Kode Program 4.6 Kelas Pemanggil class Pembagian
Class DemoOverload1 {
public static void main (String [] args) {
Pembagian b = new Pembagian();
int x = b.bagi (10, 4);
double y = b.bagi (10.0, 4.0);
System.out.println (Hasil bagi tipe int = + x);
System.out.println (Hasil bagi tipe double = + y);

Hasil yang akan diberikan oleh program di atas sebagai berikut:

Hasil bagi tipe int = 2


Hasil bagi tipe double = 2.4

4.3 Overload pada Constructor


Selain pada method normal pada umumnya, proses overload juga dapat diaplikasikan ke dalam
constructor suatu kelas. Hal ini disebabkan karena sebenarnya constructor juga adalah sebuah
method yang mengembalikan tipe kelas (dirinya sendiri). Pada kenyataan di lapangan, suatu
kelas pada umumnya justru memiliki lebih dari satu constructor. Untuk mendemonstrasikan
bagaimana Java melakukan hal ini, perhatikan kembali definisi kelas Kotak berikut ini:
Kode Program 4.7
class Kotak {
double panjang;
double lebar;
double tinggi;
//comstructor untuk kelas Kotak
Kotak (double p, double l, double t) {
panjang = p;
lebar = l;
tinggi = t;
}
//Method untuk menghitung volume kotak
double hitungVolume() {
return (panjang * lebar * tinggi);
}
}

Pada blok program di atas, dapat dilihat dengan jelas bahwa pada kelas Kotak di atas memiliki
tiga buah parameter yaitu p, l, dan t. ini artinya, setiap pembentukan objek Kotak, kita harus
melewatkan/memberi nilai tiga buah argument ke dalamnya. Dengan demikian, kita sudah tidak
tidak dapat membuat objek Kotak dengan cara berikut ini:
Kotak k = new Kotak() // hal ini karena perintah ini tidak memiliki parameter
Hal ini disebabkan karena default konstructor pada kelas Kotak sudah tidak berlaku lagi, karena
tertimpa oleh constructor yang kita definisikan sendiri. Untuk mengatasi hal ini, kita dapat
melakukan overload pada constructor kelas, seperti yang tampak pada kode program di bawah
ini.
Kode Program 4.8

class Kotak {
double panjang;
double leabr;
double tinggi;
//Mendefinisikan constructor tanpa parameter
Kotak() {
panjang = 0;
lebar = 0;
tinggi = 0;
//Mendefinisikan constructor dengan satu parameter
Kotak (double sisi) {
panjang = lebar = tinggi = sisi;
}
//Mendefinisikan constructor dengan tiga parameter
Kotak (double p, double l, double t) {
panjang = p;
panjang = l;
tinggi = t;
}

double hitungVolume() {
return (panjang * lebar * tinggi);
}
}

class DemoOverloadConstructor {
public static void main(String[] args) {
Kotak k1, k2, k3;
k1 = new Kotak();
k2 = new Kotak(10);
k3 = new Kotak(4, 3, 2);
// Menampilkan volume dari masing-masing objek kotak
System.out.println (Volume k1 = + k1.hiutngVolume());
System.out.println (Volume k2 = + k2.hiutngVolume());
System.out.println (Volume k3 = + k3.hiutngVolume());
}
}

Hasil yang akan diberikan pada saat program di atas dijalankan sebagai berikut:
Volume k1 = 0.0
Volume k2 = 1000.0
Volume k3 = 24.0

4.4 Menentukan Tingkat Akses Data dan Method


Pada materi sebelumnya telah disinggung mengenai tingkat akses dari data dan method dimana
kita dapat menentukan hak akses dari data dan method dengan menggunakan kata kunci private,
public, maupun protected. Di materi sebelumnya telah dijelaskan ketiga tingkat hak akses
tersebut sehingga pada materi kali ini akan membahas implementasi dari ketiga tingkat hak akses
tersebut pada Java. Berikut ini contoh program yang akan menunjukkan penagaruh dari tingkat
akses public dan private di dalam suatu kelas. Tingkat akses protected akan di bahas pada materi
pewarisan.
Kode Program 4.9
class TingkatAkses {
int a;
public int b;
private int c;
public void setC(int nilai) {
c = nilai;
}

public int getC() {


return c;
}
}

class DemoPublicDanPrivate {
public static void main(String[] args) {
TingkatAkses obj = new TingkatAkses();

obj.a = 10; //Benar, karena a secara default bersifat public


obj.b = 20; //Benar, karena b bersifat public
//obj.c = 30; //Salah, karena c bersifat private
obj.setC(30); //Benar, karena method setC() bersifat public
System.out.println (Nilai obj.a : + obj.a);
System.out.println (Nilai obj.b : + obj.b);
System.out.println (Nilai obj.c : + obj.getC());
}
}

Data a dan b yang terdapat pada kelas TingkatAkses di deklarasikan dengan sifat public sehingga
data tersebut dapat diakses dari lingkungan luar (dalam hal ini, pemanggilan dilakukan di dalam
kelas DemoPublicDanPrivate). Namun data c di deklarasikan dengan sifat private sehingga tidak
dapat diakses dari lingkungan luar. Maka dari itu, untuk mengakses data tersebut, perlu
mendefinisikan method yang berfungsi sebagai antarmuka/interface, yaitu method setC() dan
getC () yang keduanya bersifat public. Method setC() digunakan untuk mengisikan nilai terhadap
data c, sedangkan method getC () digunakan untuk mendapatkan nilai c. Dengan demikian,
meskipun c bersifat private akan tetapi secara tidak langsung lingkungan luar juga masih dapat
mengakses data tersebut. Adapun hasil yang akan diperoleh apabila dijalankan sebagai berikut:
Nilai obj.a : 10
Nilai obj.b : 20
Nilai obj.c : 30
Karena bersifat public, maka nilai a dan b yang terdapat pada kelas TingkatAkses dapat
dipanggil langsung dengan cara sebagai berikut:
System.out.println (Nilai obj.a : + obj.a);
System.out.println (Nilai obj.b : + obj.b);
Namun, untuk data c, dapat dipanggil nilainya melalui method getC(), yaitu dengan cara berikut:
System.out.println (Nilai obj.c : + obj.getC() )
BAB 5 Pewarisan (Inheritance)

5.1 Konsep Dasar Pewarisan


Pewarisan (inheritance) adalah salah satu cirri pemrograman berorientasi objek yang menyatakan
bahwa suatu kelas dapat diturunkan lagi menjadi kelas-kelas baru lainnya sehingga dapat
membentuk sebuah hirarki. Java mengizinkan untuk mendefinisikan suatu kelas yang bersifat
generic. Selanjutnya, kelas tersebut dapat diturunkan lagi menjadi kelas baru dengan sifat yang
lebih spesifik. Dalam terminology Java, kelas induk yang diturunkan disebut dengan superclass.
Adapun kelas baru hasil turunan disebut dengan subclass. Pada proses penurunan kelas ini, kelas
turunan akan mewarisi sifat-sifat yang terdapat pada kelas induknya. Selanjutnya, kelas turunan
tersebut dapat memiliki sifat-sifat spesifik yang sebelumnya tidak dimiliki oleh kelas induk.
Sebagai contoh, terdapat kelas binatang. Kelas tersebut selanjutnya dapat diturunkan lagi
menjadi kelas-kelas baru yang lebih spesifik tanpa meninggalkan sifat-sifat asal dari kelas
binatang, menjadi: kelas Herbivora (binatang pemakan tumbuhan) dan Carnivora (binatang
pemakan daging). Kelas turunan juga dapat diturunkan menjadi kelas turunan lainnya. Sebagai
contoh, kelas Herbivora dapat diturunkan menjadi kelas Kambing dan Kerbau, kelas Carnivora
dapat diturunkan menjadi kelas Anjing, Harimau, dan sebagainya. Hirarki kelas tersebut dapat
diilustrasikan dengan gambar berikut:

Gambar 5.1 Contoh Pewarisan


Pada kasus ini, kelas Binatang adalah superclass dari kelas Herbivora dan Carnivora. Kelas
Herbivora dan Carnivora itu sendiri berperan sebagai subclass. Namun, seperti subclass dapat
menjadi superclass bagi kelas-kelas turunan lainnya. Dalam hal ini, subclass Herbivora dapat
menjadi superclass dari kelas Kambing dan Kerbau. Begitu juga subclass Carnivora, dapat
menjadi superclass dari kelas Harimau dan Anjing.

5.2 Membuat Kelas Turunan (Subclass)


Java Menyediakan kata kunci extends yang digunakan untuk melakukan proses penurunan
terhadap suatu kelas. Bentuk umum dari penggunaan kata kunci tersebut sebagai berikut:
Class-nama-subclass extends nama-superclass {
//badan kelas
}
Perhatikan contoh program sederhana berikut ini, yang akan menunjukkan bagaimana cara
membuat sebuah kelas turunan.
Kode Program 5.1
class A {
private int a;
public void setA(int nilai) {
a = nilai;
}
public int getA() {
return a;
}
}

// membuat kelas turunan (subclass) dari kelas A


class B extends A {
private int b;
public void setB(int nilai) {
b = nilai;
}
public int getB() {
return b;
}
}

class DemoKelasTurunan1 {
public static void main(String[] args) {
// melakukan instansiasi terhadap kelas B
B obj = new B();
// mengeset nilai objek dari kelas B
obj.setA(100);
obj.setB(200);
// mendapatkan nilai yang terdapat dalam objek dari kelas B
System.out.println("Nilai a : " + obj.getA());
System.out.println("Nilai b : " + obj.getB());
}
}

Seperti yang dilihat pada kode di atas, kelas B merupakan subclass atau turuna dari kelas A.
Akibatnya, kelas B akan mewarisi sifat-sifat yang ada pada kelas A. sebagai bukti dari
pernyataan ini, coba cermati kembali kode di atas. Di siti, kita membuat objek atau instance dari
kelas B, namun kenyataannya objek tersebut juga memiliki method setA() dan getA(), padahal
kita tidak pernah mendefinisikan kedua method tersebut di dalam kelas B. ini artinya, kelas B
mewarisi method setA() dan getA() dari kelas A. meskipun denikian, data private yang terdapat
pada superclass (kelas A) tetap tidak dapat diakses oleh subclass (kelas B). apabila dijalankan,
program di atas akan memberikan hasil seperti berikut:
Nilai a : 100
Nilai b : 200
Kelas turunan dapat diturunkan lagi menjadi kelas turunan lainnya. Sebagai contoh dalam kasus
ini, misalnya kita ingin menurunkan kelas B menjadi kelas baru, yaitu kelas C. melalui cara ini,
kelas C akan mewarisi sifat-sifat yang terdapat pada kelas A dan kelas B. berikut contohnya:
Kode Program 5.2
class A {
private int a;
public void setA(int nilai) {
a = nilai;
}
public int getA() {
return a;
}
}
// membuat kelas turunan (subclass) dari kelas A
class B extends A {
private int b;
public void setB(int nilai) {
b = nilai;
}
public int getB() {
return b;
}
}
// membuat kelas turunan (subclass) dari kelas B
class C extends B {
private int c;
public void setC(int nilai) {
c = nilai;
}
public int getC() {
return c;
}
}

class DemoKelasTurunan2 {
public static void main(String[] args) {
// melakukan instansiasi terhadap kelas C
C obj = new C();
// mengeset nilai dari kelas C
obj.setA(100);
obj.setB(200);
obj.setC(300);
// mendapatkan nilai yang terdapat dalam kelas C
System.out.println("Nilai a : " + obj.getA());
System.out.println("Nilai b : " + obj.getB());
System.out.println("Nilai c : " + obj.getC());
}
}

Hasil dari program di atas:


Nilai a : 100
Nilai b : 200
Nilai c : 300
Dari hasil tersebut, dapat kita lihat dengan jelas bahwa objek dari kelas C akan memiliki method
yang didefinisikan di dalam kelas A dan B, yaitu method setA(), getA(), setB(), dan getB().
5.3 Tingkat Hak Akses Protected
Pada materi sebelumnya telah dijelaskan tingkat hak akses public dan private. Pada bab ini akan
dibahas tingkat hak akses protected yang memang identik dengan pewarisan. Pada penjelasan
sebelumnya dijelaskan bahwa pada saat data dan method diberikan tingkat akses private maka
data dan method tersebut tidak bisa diakses oleh kelas lainnya. Pada saat didefinisikan sebagai
private maka data dan method tersebut hanya bisa diakses oleh kelasnya sendiri. Apabila data
dan method bersifat public maka semua kelas luar dapat mengakses data dan method tersebut.
Solusi yang tepat untuk permasalahan ini adalah dengan menggunakan tingkat hak akses
protected. Ketika data dan method didefinisikan sebagai protected maka data dan method dapat
diakses oleh semua kelas yang memiliki hubungan turunan tetapi kelas lain tetap tidak bisa
mengaksesnya. Berikut ini contoh penggunaan tingkat akses protected.
Kode Program 5.3
class A {
private int a; // hanya dikenali oleh kelas A
// hanya dapat dikenali oleh kelas A dan turunan-turunannya
protected void setA(int nilai) {
a = nilai;
}
// hanya dapat dikenali oleh kelas A dan turunan-turunannya
protected int getA() {
return a;
}
}

class B extends A {
private int b;
// constructor kelas B
B(int nilaiA, int nilaiB) {
//a = nilaiA; // SALAH, karena a tidak dikenali di sini
setA(nilaiA); // menggunakan method setA()
b = nilaiB;
}
public void showData() {
// menggunakan method getA()
System.out.println("Nilai a : " + getA());
System.out.println("Nilai b : " + b);
}
}

class C {
private int c;
public void setC(int nilai) {
//setA(10); // SALAH, setA() tidak dikenal di sini
c = nilai;
}
public int getC() {
return c;
}
public void showC() {
//System.out.println("Nilai a : " + getA()); // SALAH
System.out.println("Nilai c : " + c);
}
}
Kode Program 5.4 Kelas Pemanggil kode program 5.3
class DemoProtected1 {
public static void main(String[] args) {

// melakukan instansiasi terhadap kelas B


B obj = new B(40, 50);

obj.showData();

obj.setA(100);
System.out.println("Nilai a : " + obj.getA());
}
}

Program di atas akan menghasilkan keluaran sebagai berikut:


Nilai a : 40
Nilai b : 50
Nilai c : 100
Dalam program di atas, method setA() dan getA() didefinisikan sebagai protected. Dengan
demikian, method tersebut dapat diakses oleh kelas turunannya (dalam hal ini kelas B). namun
pada saat kita mengakses kelas tersebut dari kelas C, maka terjadi kesalahan ketika proses
kompilasi. Hal ini karena kelas C tidak memiliki hubungan hirarki dengan kelas A.
Sebagai contoh lain untuk lebih memudahkan pemahaman cara kerja protected pada pewarisan.
Misalnya kelas Kotak akan diturunkan menjadi kelas KotakPejal yang di dalamnya memiliki
data baru, yaitu berat. Dengan demikian, kelas hasil turunan akan memiliki data: panjang, lebar,
tinggi, dan berat. Berikut ini implementasinya.
Kode Program 5.5
class Kotak {
protected double panjang;
protected double lebar;
protected double tinggi;
//default constructor
Kotak() {
panjang = lebar = tinggi = 0;
}
Kotak(int p, int l, int t) {
panjang = p;
lebar = l;
tinggi = t;
}
public double hitungVolume() {
return (panjang * lebar * tinggi);
}
}
Kode Program 5.6 Lanjutan kode program 5.5
class KotakPejal extends Kotak {
private double berat;
KotakPejal(int p, int l, int t, int b) {
panjang = p; // menggunakan data panjang
lebar = l; // menggunakan data lebar
tinggi = t; // menggunakan data tinggi
berat = b;
}
public double getBerat() {
return berat;
}
}

class DemoProtected2 {
public static void main(String[] args) {

// melakukan instansiasi terhadap kelas turunan


KotakPejal k = new KotakPejal(4, 3, 2, 1);

System.out.println("Volume k\t : " + k.hitungVolume());


System.out.println("Berat k\t : " + k.getBerat());
}
}

Hasil yang akan diberikan oleh program di atas sebagai berikut:


Volume k : 24.0
Berat k : 1.0
Seperti yang dilihat, data panjang, lebar, dan tinggi yang terdapat pada kelas Kotak masing-
masing dideklarasikan dengan sifat protected. Dengan demikian, data-data tersebut akan
diwariskan ke kelas turunannya (dalam hal ini kelas KotakPejal).

5.4 Menggunakan Kata Kunci super


Pada contoh penulisan program sebelumnya, penulisan constructor kelas KotakPejal sebenarnya
mengandung duplikasi kode dari constructor kelas Kotak. Perhatikan teks yang dicetak tebal di
bawah ini.
Kode Program 5.7
Kotak (int p, int l, int t) {
panjang = p;
lebar = l;
tinggi = t;
}

KotakPejal (int p, int l, int t, int b) {


panjang = p;
lebar = l;
tinggi = t;
berat = b;
}
Untuk menghindari redudansi tersebut, Java menyediakan kata kunci super. Penulisan program
sebelumnya menjadi lebih efisien ketika menggunakan kata kunci super, seperti yang tampak
pada kode berikut:
Kode Program 5.8
KotakPejal (int p, int l, int t, int b) {
super (p, l,t);
berat = b;
}

Fungsi kata kunci super di atas adalah untuk memanggil constructor dari kelas induk (dalam hal
ini kelas Kotak). Selain fungsi tersebut, kata kunci super juga dapat digunakan untuk mengakses
anggota kelas (data maupun method) dari kelas induk yang telah tertimpa oleh anggota kelas dari
kelas turunan.

5.4.1 Menggunakan super untuk Memanggil Constructor Kelas Induk


Constructor yang terdapat pada kelas induk dapat dipanggil dari kelas turunan menggunakan kata
kunci super. Bentuk umum pemanggilannya sebagai berikut:
super (daftar-parameter);
Daftar parameter adalah daftar parameter yang didefinisikan pada constructor kelas induk.
Dalam penggunaan kata kunci super untuk memanggil constructor kelas induk, penempatannya
harus di bagian awal (baris program). Untuk lebih jelasnya lihat contoh program berikut:
Kode Program 5.9
class Kotak {
protected double panjang;
protected double lebar;
protected double tinggi;
//default constructor
Kotak() {
panjang = lebar = tinggi = 0;
}
Kotak(int p, int l, int t) {
panjang = p;
lebar = l;
tinggi = t;
}
public double hitungVolume() {
return (panjang * lebar * tinggi);
}
}

class KotakPejal extends Kotak {


private double berat;
KotakPejal(int p, int l, int t, int b) {
super(p, l, t); // memanggil constructor kelas Kotak
berat = b;
}

public double getBerat() {


return berat;
}
}
Kode Program 5.10 kelas pemanggil kode program 5.9
class DemoSuper1 {
public static void main(String[] args) {
// melakukan instansiasi terhadap kelas turunan
KotakPejal k = new KotakPejal(6, 5, 4, 2);
System.out.println("Volume k : " + k.hitungVolume());
System.out.println("Berat k : " + k.getBerat());
}
}

Pada kode program:


super (p, l, t); // memanggil constructor kelas kotak
kode di atas digunakan untuk memanggil constructor kelas Kotak, dengan melewatkan argument
p, l, dan t ke dalamnya. Adapun hasil keluaran programnya sebagai berikut:
volume k : 120.0
berat k : 2.0
Berikut ini contoh lain penggunaan kelas super yang menggunakan objek sebagai parameter
constructornya.
Kode Program 5.11
class Kotak {
protected double panjang;
protected double lebar;
protected double tinggi;
Kotak() {
panjang = lebar = tinggi = 0;
}
Kotak(Kotak k) {
this.panjang = k.panjang;
this.lebar = k.lebar;
this.tinggi = k.tinggi;
}
Kotak(int p, int l, int t) {
panjang = p;
lebar = l;
tinggi = t;
}
public double hitungVolume() {
return (panjang * lebar * tinggi);
} }
class KotakPejal extends Kotak {
private double berat;
KotakPejal(KotakPejal kp) {
super(kp); // melewatkan objek ke dalam super()
this.berat = kp.berat;
}
KotakPejal(int p, int l, int t, int b) {
super(p, l, t);
berat = b;
}
public double getBerat() {
return berat;
}
}
Kode Program 5.12 kelas pemanggil kode program 5.11
class DemoSuper2 {
public static void main(String[] args) {
KotakPejal k1, k2, k3;
k1 = new KotakPejal(4, 3, 2, 1);
k2 = new KotakPejal(6, 5, 4, 2);
k3 = new KotakPejal(k1); // melewatkan objek k1

System.out.println("Volume k1\t : " + k1.hitungVolume());


System.out.println("Berat k1\t : " + k1.getBerat());

System.out.println("\nVolume k2\t : " + k2.hitungVolume());


System.out.println("Berat k2\t : " + k2.getBerat());

System.out.println("\nVolume k3\t : " + k3.hitungVolume());


System.out.println("Berat k3\t : " + k3.getBerat());
}
}
Tampak jelas pada kode di atas bahwa kita dapat melewatkan objek ke dalam pemanggilan
super().

KotakPejal (KotakPejal kp) {


super (kp); // melewatkan objek ke dalam super()
this.berat = kp.berat;
}

Penggunaan super() di atas sebenarnya melakukan pemanggilan terhadap constructor Kotak


(Kotak k). Adapun hasil yang akan diberikan oleh program tersebut sebagai berikut:
Volume k1 : 24.0
Berat k1 : 1.0
Volume k2 : 120.0
Berat k2 : 2.0
Volume k3 : 24.0
Berat k3 : 1.0
Dari hasil tersebut terlihat bahwa volume dan berat dari objek k1 dan k3 sama. Hal ini terjadi
pada saat pembentukan objek k3, kita melewatkan objek k1 sebagai parameternya. Ini artinya
data yang dilewatkan untuk membentuk objek k3 adalah data yang terdapat pada objek k1.

5.4.2 Menggunakan super untuk Mengakses Anggota Kelas Induk


Kata kunci super dapat juga digunakan untuk mengakses suatu data atau method yang terdapat
pada kelas induk meskipun jarang penggunaannya. Sebagai contoh terdapat kelas A yang berisi
data a dan bersifat protected (yang artinya kelas turunannya juga mewarisi data a). selanjutnya,
kelas A diturunkan menjadi kelas B. Di dalam kelas B, kita juga ingin mendeklarasikan data
dengan nama a. Secara otomatis, di dalam kelas B, data a yang berasal dari kelas A akan tertimpa
oleh data a yang dideklarasikan pada kelas B itu sendiri. Permasalahannya adalah bagaimana
cara mengakses data a yang ada pada kelas A melalui kelas B? jawabannya adalah dengan
menggunakan kata kunci super. Berikut ini contoh penggunaannya.
Kode Program 5.13
class A {
protected int a;
}
class B extends A {
private int a; // akan menimpa a yang ada dalam kelas A
// constructor
B(int nilai1, int nilai2) {
super.a = nilai1; // a di dalam kelas A
a = nilai2; // a di dalam kelas B
}

public void tampilkanNilai() {


System.out.println("Nilai a di dalam kelas A : " + super.a);
System.out.println("Nilai a di dalam kelas B : " + a);
}
}

class DemoSuper3 {
public static void main(String[] args) {

B obj = new B(121, 212);


obj.tampilkanNilai();
}
}

Pada kode program di atas, a hasil warisan dari kelas A diisi dengan nilai 121 dan a yang
terdapat di dalam kelas B diisi dengan nilai 212. Dengan menggunakan kata kunci super, kita
dapat dengan mudah mengakses variable yang sebenarnya telah tertimpa oleh variable baru.
Apabila dijalankan program tersebut akan memberikan keluaran sebagai berikut:
Nilai a di dalam kelas A : 121
Nilai a di dalam kelas B : 212

5.5 Java Tidak Mendukung Multiple Inheritance


Tidak seperti C++, Java tidak mendukung adanya proses multiple inheritance. Seperti yang telah
disinggung sebelumnya, di dalam C++, suatu kelas turunan dapat dibentuk dari dua atau lebih
kelas induk. Kelas turunan ini selanjutnya akan mewarisi semua kelas induk yang didefinisikan.
Berikut ilustrasi multiple inheritance pada C++.

Gambar 5.2 Multiple Inheritance


Dari gambar tersebut dapat dilihat bahwa kelas D merupakan turunan dari kelas A, Kelas B, dan
Kelas C. Melalui proses di atas, kelas D akan mewarisi sifat-sifat yang terdapat pada keas A,
kelas B, dan Kelas C. Namun, teknik semacam ini hanya dapat dilakukan pada bahasa C++. Di
Java jika ingin menerapkan kasus seperti di atas, maka melakukan proses penurunan kelas secara
bertingkat. Sebagai contoh jika ingin membuat kelas D yang mewarisi kelas A, kelas B, dan
kelas C maka mula-mula perlu membuat kelas A. selanjutnya kelas Aditurunkan menjadi kelas
B, yang kemudian diturunkan menjadi kelas C. Dari kelas C inilah selanjutnya membuat kelas D
yang merupakan turunan dari kelas C. Dengan demikian, secara tidak langsung kelas D juga
memiliki sifat-sifat yang ada pada kelas A, B, dan C. Berikut ini bentuk implementasi kasus di
atas pada Java.
Kode Program 5.14
class A {
private int a;
public void setA(int nilai) {
a = nilai;
}
public int getA() {
return a;
}
}

class B extends A {
private int b;
public void setB(int nilai) {
b = nilai;
}
public int getB() {
return b;
}
}

class C extends B {
private int c;
public void setC(int nilai) {
c = nilai;
}
public int getC() {
return c;
}
}

class D extends C {
private int d;
public void setD(int nilai) {
d = nilai;
}
public int getD() {
return d;
}
}
Kode Program 5.15 Kelas pemanggil kode program 5.14
class DemoTurunanBertingkat {
public static void main(String[] args) {
// membentuk objek dari kelas D
D obj = new D();
// mengisi nilai
obj.setA(10);
obj.setB(20);
obj.setC(30);
obj.setD(40);
// menampilkan nilai
System.out.println("Nilai a : " + obj.getA());
System.out.println("Nilai b : " + obj.getB());
System.out.println("Nilai c : " + obj.getC());
System.out.println("Nilai d : " + obj.getD());
}
}

Apabila dijalankan, program di atas akan memberikan hasil seperti berikut:


Nilai a : 10
Nilai b : 20
Nilai c : 30
Nilai d : 40
Tampak jelas bahwa kelas D telah mewarisi sifat yang terdapat pada kelas A (method setA() dan
method getA()), B (method setB() dan method getB()) dan C (method setC() dan method getC()).

5.6 Constructor pada Proses Penurunan Kelas


Ketika membentuk sebuah hirarki kelas, constructor yang akan dipanggil pertama kali dalam
setiap pembentukan objek adalah constructor dari kelas induk paling dasar. Sebagai contoh,
misalkan terdapat kelas induk dengan nama A dan diturunkan menjadi kelas B. Kemudian kelas
B diturunkan lagi menjadi kelas C. Pada situasi seperti ini setiap membentuk objek dari kelas C
maka urutan constructor yang akan dipanggil adalah constructor dari kelas A, disusul dengan
constructor dari kelas B, baru kemudian constructor dari kelas C. Berikut ini contoh program
yang dapat menunjukkan hal itu.
Kode Program 5.16
class A {
A() {
System.out.println("Constructor dari kelas A");
}
}
class B extends A {
B() {
System.out.println("Constructor dari kelas B");
}
}
class C extends B {
C() {
System.out.println("Constructor dari kelas C");
}
}
Kode Program 5.17 kelas pemanggil kode program 5,16
class DemoConstructorPenurunan {
public static void main(String[] args) {
System.out.println(
"Pada saat membentuk objek dari kelas A:");
A obj1 = new A();
System.out.println(
"\nPada saat membentuk objek dari kelas B:");
B obj2 = new B();
System.out.println(
"\nPada saat membentuk objek dari kelas C:");
C obj3 = new C();
}
}

Pada saat program di atas dijalankan, hasil keluaran yang akan diberikan sebagai berikut:
Pada saat membentuk objek dari kelas A
Constructor dari kelas A

Pada saat membentuk objek dari kelas B


Constructor dari kelas A
Constructor dari kelas B

Pada saat membentuk objek dari kelas C


Constructor dari kelas A
Constructor dari kelas B
Constructor dari kelas C

5.7 Melakukan Override terhadap Method


Pada saat mendefinisikan suatu method di dalam kelas turunan yang nama dan daftar
parameternya sama persis seperti yang terdapat pada kelas induk, maka dikatakan kita telah
melakukan override method yang tersimpan dalam kelas induk. Apabila kita melakukan
pemanggilan method yang telah di override melalui objek dari kelas turunan, maka yang akan
dieksekusi adalah method yang terdapat pada kelas turunan, bukan yang terdapat pada kelas
induk. Dengan kata lain, apabila kita melakukan override terhadap method pada kelas induk,
maka di dalam kelas turunan, method tersebut akan disembunyikan keberadaannya. Perhatikan
contoh program berikut:
Kode Program 5.18
class A {
private int a;
public void setA(int nilai) {
a = nilai;
}
public int getA() {
return a;
}
public void tampilkanNilai() {
System.out.println("Nilai a: " + getA());
}
}

class B extends A {
private int b;
public void setB(int nilai) {
b = nilai;
}
public int getB() {
return b;
}
// melakukan override terhadap method tampilkanNilai()
// yang terdapat pada kelas A
public void tampilkanNilai() {
System.out.println("Nilai b: " + getB());
}
}

class DemoOverride1 {
public static void main(String[] args) {
B obj = new B();
obj.setA(100);
obj.setB(200);
// akan memanggil method yang terdapat pada kelas B
obj.tampilkanNilai();
}
}

Hasil yang akan diberikan oleh program di atas sebagai berikut:


Nilai b : 200
Tampak bahwa pada saat kita membentuk objek dari kelas B, dan kita memanggil method
tampilanNilai() melalui objek tersebut, maka method tampilanNilai() yang akan dipanggil adalah
yang didefinisikan di dalam kelas B. Method tampilanNilai() yang terdapat pada kelas A akan
disembunyikan. Numun, pada kasus-kasus tertentu, terkadang kita perlu juga memanggil method
yang terdapat pada kelas A. Untuk mengatasi hal ini, kita dapat menggunakan kata kunci super,
seperti yang tampak pada kode program berikut.
Kode Program 5.19
class A {
private int a;
public void setA(int nilai) {
a = nilai;
}
public int getA() {
return a;
}
public void tampilkanNilai() {
System.out.println("Nilai a: " + getA());
}
}

class B extends A {
private int b;
public void setB(int nilai) {
b = nilai;
}
public int getB() {
return b;
}
// melakukan override terhadap method tampilkanNilai()
// yang terdapat pada kelas A
public void tampilkanNilai() {
super.tampilkanNilai(); // memanggil method dalam kelas A
System.out.println("Nilai b: " + getB());
}
}

class DemoOverride2 {
public static void main(String[] args) {
B obj = new B();
obj.setA(100);
obj.setB(200);
// akan memanggil method yang terdapat pada kelas B
obj.tampilkanNilai();
}
}

Program akan memberikan hasil sebagai berikut:


Nilai a : 100
Nilai b : 200
Mengapa demikian? Alasannya, dalam method tampilanNilai() yang terdapat pada kelas B.
secara eksplisit kita juga melakukan pemanggilan terhadap method tampilanNilai() yang terdapat
pada kelas A.

5.8 Perbedaan Override dengan Overload


Apabila dilihat secara sepintas, terdapat kemiripan istilah antara override dengan overload.
Namun, keduanya merupakan dua buah proses yang berbeda. Seperti yang telah disinggung
sebelumnya, pada saat kita mendefinisikan suatu method dalam kelas turunan yang memiliki
nama dan daftar parameter yang sama persis dengan yang terdapat pada kelas induk, maka
proses ini disebut dengan override. Akan tetapi, pada kasus-kasus tertentu, ada kalanya kita ingin
mendefinisikan sebuah method di dalam kelas turunan yang namanya sama dengan method yang
terdapat pada kelas induk, tapi daftar parameternya berbeda. Pada proses ini, kita tidak
melakukan override terhadap method, melainkan overload. Berikut ini contoh kode program
yang dapat menunjukkan proses tersebut.
Kode Program 5.20
class Induk {
// mendefinisikan method test() tanpa parameter
public void test() {
System.out.println("Method di dalam kelas Induk");
}
}

class Turunan extends Induk {


// melakukan overload terhadap method test(), bukan override.
public void test(String s) {
System.out.println("Method di dalam kelas Turunan");
System.out.println("s : \"" + s + "\"");
}
}

class DemoOverloadTurunan {
public static void main(String[] args) {
Turunan obj = new Turunan();
// memanggil method test() yang terdapat pada kelas Induk
obj.test();
System.out.println();
// memanggil method test() yang terdapat pada kelas Turunan
obj.test("Contoh overload pada proses pewarisan");
}
}

Ketika dijalankan program di atas akan memberikan hasil seperti berikut:


Method di dalam kelas induk

Method di dalam kelas turunan


A : contoh overload pada proses pewarisan

Dari hasil tersebut, tampak dengan jelas bahwa method test() yang masing-masing didefinisikan
pada kelas induk dan turunan memiliki daftar parameter yang berbeda, sedangkan pada kelas
turunan method tersebut didefinisikan dengan mengambil satu buah parameter bertipe String.
Proses ini dinamakan dengan overload, bukan override.

5.9 Kata kunci final pada proses pewarisan


Pada bab sebelumnya telah dibahas fungsi dari kata kunci final untuk mendeklarasikan sebuah
konstanta. Fungsi lain dari kata kunci tersebut digunakan dalam proses pewarisan, yaitu:
Untuk mencegah suatu method agar tidak dapat di override oleh kelas turunan.
Untuk mencegah suatu kelas tidak dapat diturunkan lagi

5.9.1 Mencegah Method dari Proses Override


Kata kunci final dapat digunakan untuk mencegah suatu method agar tidak dapat di override oleh
kelas-kelas turunan. Method-method semacam ini biasanya bersifat pasti. Artinya, kelas turunan
sudah tidak perlu mengimplementasikan lagi isi dari method tersebut. Untuk melakukan hal ini,
kita hanya perlu menambahkan kata kunci final pada bagian deklarasi method, seperti yang
tampak pada potongan program berikut:
Kode Program 5.21
Class Induk {
//method final
public final void coba () {
}
}

Class Turunan extends Induk


//Salah karena melakukan override terhadap method final
public void coba () {
System.out.println (Tidak diijinkan);
}
}

Seperti yang tampak pada kode di atas, method coba() dideklarasikan sebagai method final di
dalam kelas induk. Maka dari itu, segala bentuk usaha melakukan override terhadap method
tersebut dari kelas Turunan pasti akan menghasilkan kesalahan.

5.9.2 Menjadikan Kelas Tidak Dapat Diturunkan lagi


Apabila kata kunci final dibubuhkan ke dalam deklarasi kelas, maka kelas tersebut akan menjadi
kelas terakhir pada struktur hirarki yang dibentuk. Alasannya karena kelas yang dideklarasikan
sebagai kelas final tidak dapat diturunkan lagi menjadi kelas baru lainnya. Perhatikan contoh
potongan kode berikut:
Kode Program 5.22
class Induk {
// badan kelas induk
}
class Turunan extends Induk {
// badan kelas turunan1
}

//kelas final
final class Turunan2 extends Turunan1 {
//badan kelas turunan2
}

// salah, karena menurunkan kelas final


class Turunan3 extends Turunan2 {
// badan kelas Turunan3
}
Pada contoh di atas, kelas Turunan2 adalah kelas final sehingga tidak dapat diturunkan lagi.
Dengan demikian, pembuatan kelas Turunan3 di atas tidak diijinkan oleh Java. Melalui cara
seperti ini, kelas Turunan2 akan menjadi kelas terakhir dalam struktur hirarki kelas yang ada.

5.10 Manfaat dari Implementasi Pewarisan dalam pengembangan PBO


Manfaat penggunaan konsep pewarisan antara lain: pertama, kita dapat menggunakan kembali
kelas-kelas yang kita buat (sebagai superkelas) dan membuat kelas-kelas baru berdasar
superclass tersebut dengan karakteristik yang lebih khusus dari behavior umum yang dimiliki
superclass. Kedua, kita dapat membuat superclass yang hanya mendefinisikan behavior namun
tidak member implementasi dari method-method yang ada. Hal ini berguna jika ingin membuat
semacam template kelas.
BAB 6 Polimorfisme

Pada bab sebelumnya di bahas mengenai override. Pada dasarnya override digunakan untuk
mendukung konsep dari polimorfisme. Polimorfisme sendiri adalah kemampuan suatu objek
untuk mengungkap banyak hal melalui satu cara yang sama.polimorfisme merupakan salah satu
hal esensial dalam konsep pemrograman berorientasi objek karena polimorfisme mengijinkan
kelas induk untuk mendefinisikan sebuah method general (bersifat umum) untuk semua kelas
turunannya, dan selanjutnya kelas-kelas turunannya dapat memperbaharui implementasi dari
method tersebut secara lebih spesifik sesuai dengan karakteristiknya masing-masing.
Untuk dapat lebih memahami konsep polimorfisme perhatikan contoh berikut. Misalnya kita
ingin memiliki sebuah kelas induk dengan nama Penyanyi, yang akan diturunkan lagi menjadi
kelas PenyanyiJazz, PenyanyiPop, dan PenyanyiDangdut. Pada saat kita meminta 5 orang
penyanyi untuk menyanyikan suatu lagu, maka kelima penyanyi tersebut pasti akan menyanyi
dengan karakteristiknya masing-masing. Artinya apabila dia adalah seorang penyanyi jazz maka
pola nada atau irama yang dia nyanyikan tentu akan kental dengan nuansa jazz. Begitu pula
apabila dia merupakan seorang penyanyi pop maupun dangdut, maka nadanya juga akan
berirama pop maupun dangdut. Berikut contoh implementasi kasus tersebut ke dalam kode
program.
Kode Program 6.1

// Mendefinisikan kelas induk


class Penyanyi {
public void bernyanyi() {
System.out.println("Karakteristik nadanya " +
"belum didefinisikan");
}
}
// Mendefinisikan kelas-kelas turunan dari kelas Penyanyi
class PenyanyiJazz extends Penyanyi {
// melakukan override terhadap method bernyanyi()
public void bernyanyi() {
System.out.println("Bernyanyi dengan irama Jazz");
}
}

class PenyanyiPop extends Penyanyi {


// melakukan override terhadap method bernyanyi()
public void bernyanyi() {
System.out.println("Bernyanyi dengan irama Pop");
}
}

class PenyanyiDangdut extends Penyanyi {


// melakukan override terhadap method bernyanyi()
public void bernyanyi() {
System.out.println("Bernyanyi dengan irama Dangdut");
}
}
Kode program 6.2 kelas pemanggil kode program 6.1
class DemoPolimorfisme1 {
public static void main(String[] args) {
Penyanyi p;
PenyanyiJazz musmujiono = new PenyanyiJazz();
PenyanyiPop audi = new PenyanyiPop();
PenyanyiDangdut inul = new PenyanyiDangdut();
p = musmujiono; // p mengacu pada objek PenyanyiJazz
// akan memanggil method pada kelas PenyanyiJazz
p.bernyanyi();
p = audi; // p mengacu pada objek PenyanyiPop
// akan memanggil method pada kelas PenyanyiPop
p.bernyanyi();
p = inul; // p mengacu pada objek PenyanyiDangdut
// akan memanggil method pada kelas PenyanyiDangdut
p.bernyanyi();
}
}
Apabila dijalankan program di atas akan memberikan hasil seperti berikut:
Bernyanyi dengan irama jazz
Bernyanyi dengan irama pop
Bernyanyi dengan irama dangdut
Seperti yang anda lihat, kita mendeklarasikan variable referensi ke tipe Penyanyi dengan nama p.
Sampai disini, kita belum mengetahui apakah p merupakan penyanyi jazz, penyanyi pop ataukah
penyanyi dangdut. Namun, pada saat p mengacu ke objek dari kelas PenyanyiJazz, kemudian
kita memanggil method bernanya() melalui referensi tersebut, maka method yang akan
dieksekusi adalah method bernyanyi() yang terdapat pada pada kelas PenyanyiJazz. Ini artinya,
method yang akan dipanggil oleh p akan tergantung dari objek yang sedang ditunjuk atau diacu
oleh p. Begitu pula apabila p sedang menunjuk ke objek dari kelas PenyanyiPop maupun
PenyanyiDangdut, method yang dipanggil pun akan disesuaikan dengan objek yang ada. Hal
semacam inilah yang dinamakan dengan polimorfisme. Artinya, cara yang dilakukan sama, yaitu
p.bernyanyi(), akan tetapi implementasinya berbeda-beda sesuai dengan tipe objek yang sedang
diacu. Penentuan objek mana yang akan diacu dilakukan pada saat run time sehingga proses ini
dikenal dengan istilah runtime polymorphism atau dynamic method dispatch (pengiriman
method secara dinamis).
Berikut contoh lain yang dapat diambil untuk menunjukkan konsep polimorfisme. Kali ini, kita
akan membuat kelas induk dengan nama Bentuk, yang akan diturunkan menjadi kelas
PersegiPanjang, BujurSangkar, Segitiga, dan Lingkaran. Dalam kelas Bentuk, kita
mendefinisikan method luas(). Method tersebut selanjutnya akan di override oleh setiap kelas
turunan yang ada. Berikut ini contoh kode programnya.
Kode Program 6.3
// Mendefinisikan kelas induk
class Bentuk {
public double luas() {
System.out.println("Tidak didefinisikan");
return 0;
}
}
class PersegiPanjang extends Bentuk {
private double panjang;
private double lebar;
PersegiPanjang(int p, int l) {
panjang = p;
lebar = l;
}
public double luas() {
System.out.println("Dalam objek persegi panjang:");
return (panjang * lebar);
}
}

class BujurSangkar extends Bentuk {


private double sisi;
BujurSangkar(int s) {
sisi = s;
}
public double luas() {
System.out.println("Dalam objek bujursangkar:");
return (sisi * sisi);
}
}

class Segitiga extends Bentuk {


private double alas;
private double tinggi;
Segitiga(int a, int t) {
alas = a;
tinggi = t;
}
public double luas() {
System.out.println("Dalam objek segitiga:");
return ((alas * tinggi)/2);
}
}

class Lingkaran extends Bentuk {


private double jarijari;
private final double PI = 3.1416;
Lingkaran(int r) {
jarijari = r;
}
public double luas() {
System.out.println("Dalam objek lingkaran:");
return (PI * jarijari * jarijari);
}
}
Kode Program 6.4 kelas pemanggil kode program 6.3
class DemoPolimorfisme2 {
public static void main(String[] args) {

Bentuk obj;

PersegiPanjang pp = new PersegiPanjang(5, 3);


BujurSangkar bs = new BujurSangkar(4);
Segitiga st = new Segitiga(4, 3);
Lingkaran lk = new Lingkaran(2);

// obj mengacu pada objek PersegiPanjang


obj = pp;
// akan memanggil method yang terdapat pada PersegiPanjang
System.out.println("Luas : " + obj.luas());
System.out.println();

// obj mengacu pada objek PersegiPanjang


obj = bs;
// akan memanggil method yang terdapat pada BujurSangkar
System.out.println("Luas : " + obj.luas());
System.out.println();

// obj mengacu pada objek PersegiPanjang


obj = st;
// akan memanggil method yang terdapat pada Segitiga
System.out.println("Luas : " + obj.luas());
System.out.println();

// obj mengacu pada objek PersegiPanjang


obj = lk;
// akan memanggil method yang terdapat pada Lingkaran
System.out.println("Luas : " + obj.luas());
System.out.println();
}
}

Pada kode di atas kita mendklarasikan variable referensi obj dengan tipe Bentuk sehingga dapat
mengacu ke objek-objek dari kelas turunan. Dengan demikian, pada saat pemanggilan method
luas(), hasil yang diperoleh pun akan berbeda tergantung dari tipe objek yang sedang diacu.

Anda mungkin juga menyukai