Program ContohInteger;
Uses CRT;
Var y : Integer;
p : Real;
X : Real;
Begin
y := 5;
p := 6;
x := y + p;
End.
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.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.
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.
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;
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.
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.
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.
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).
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.
Maka program hanya akan menampilkan angka 1 sampai 50, karena pada saat i mencapai 50,
program dihentikan oleh perintah break.
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
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.
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.
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;
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.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.
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);
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
class DemoPublicDanPrivate {
public static void main(String[] args) {
TingkatAkses obj = new TingkatAkses();
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)
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());
}
}
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) {
obj.showData();
obj.setA(100);
System.out.println("Nilai a : " + obj.getA());
}
}
class DemoProtected2 {
public static void main(String[] args) {
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.
class DemoSuper3 {
public static void main(String[] args) {
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
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());
}
}
Pada saat program di atas dijalankan, hasil keluaran yang akan diberikan sebagai berikut:
Pada saat membentuk objek dari kelas A
Constructor dari kelas A
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();
}
}
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();
}
}
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");
}
}
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.
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.
//kelas final
final class Turunan2 extends Turunan1 {
//badan kelas turunan2
}
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
Bentuk obj;
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.