Sunday, December 18, 2016

Bab 8. Java Teori dan Implementasi



Bab. 8 Objek dan Kelas



8.1 Introduksi

Setelah belajar sejauh ini, Anda akan mampu menyelesaikan banyak masalah pemrograman menggunakan seleksi, loop, metode, dan array. Namun, fitur-fitur JAVA ini tidak cukup untuk mengembangkan antarmuka grafikal (GUI, graphical user interface) dan rekayasa perangkat lunak berskala besar. Dimisalkan Anda ingin mengembangkan suatu GUI seperti ditampilkan pada Gambar 8.1, bagaimanakah Anda memprogramnya?

Gambar 8.1 Objek-objek GUI diciptakan dari kelas

Bab ini diawali dengan pengenalan pemrograman berorientasi objek, yang akan memampukan Anda untuk mengembangkan GUI dan rekayasa perangkat lunak berskala besar.


8.2 Mendefinisikan Kelas untuk Objek
Pemrograman berorientasi objek (OOP, object-oriented programming) melibatkan pemrograman menggunakan objek. Suatu objek merepresentasikan suatu entitas dalam dunia nyata yang bisa secara mudah diidentifikasi. Sebagai contoh, seorang siswa, sebuah meja, suatu lingkaran, dan bahkan suatu pinjaman juga bisa dipandang sebagai objek. Suatu objek memiliki identitas, keadaan, dan watak yang unik.
·         Keadaan suatu objek (dikenal juga dengan atribut) direpresentasikan oleh bidang data dengan nilai-nilai terkini. Suatu objek Lingkaran, misalnya, memiliki bidang data radius, yang merupakan atribut yang mengkarakteristikkan Lingkaran. Suatu objek Persegi memiliki bidang data lebar dan tinggi, yang mengkarakteristikkan Persegi.
·         Watak suatu objek (dikenal juga dengan aksi) didefinisikan oleh metode. Memanggil suatu metode pada suatu objek berarti meminta objek untuk melakukan suatu aksi. Sebagai contoh, Anda bisa mendefinisikan suatu metode dapatLuas untuk objek-objek Lingkaran. Suatu objek Lingkaran dapat memanggil metode dapatLuas untuk memberikan nilai balik luas suatu lingkaran.
Objek-objek bertipe sama didefinisikan di dalam kelas yang sama. Suatu kelas merupakan suatu template, blueprint, atau kontrak yang mendefinisikan apa bidang data dan metode suatu objek. Suatu objek merupakan suatu instans dari suatu kelas. Anda bisa menciptakan banyak instans dari suatu kelas. Menciptakan instans disebut dengan instansiasi. Gambar 8.2 menunjukkan suatu kelas, bernama Lingkaran, dan tiga objeknya.

Gambar 8.2 Kelas merupakan suatu template untuk menciptakan objek-objek


Gambar 8.3 Kelas merupakan suatu konstruksi yang mendefinisikan objek-objek bertipe sama

Suatu kelas JAVA menggunakan variabel untuk mendefinisikan bidang data dan menggunakan metode untuk mendefinisikan aksi atau tindakan. Sebagai tambahan di dalam kelas, JAVA juga menyediakan metode-metode spesial, dikenal dengan konstruktor, yang dipanggil untuk menciptakan suatu objek baru. Suatu konstruktor dapat melakukan sembarang aksi, tetapi sebenarnya didesain untuk melakukan penginisialisasian, seperti menginisialisasi bidang data pada objek. Gambar 8.3 menunjukkan suatu contoh mendefinisikan suatu kelas.

Kelas Lingkaran berbeda dengan semua kelas yang telah Anda jumpai pada buku ini. Kelas Lingkaran tidak memiliki metode main dan oleh karena itu tidak bisa dijalankan; Kelas ini merupakan suatu definisi untuk objek-objek Lingkaran.

Ilustrasi objek dan template kelas pada Gambar 8.2 dapat distandarisasi menggunakan notasi UML (unified modeling language). Notasi ini, ditunjukkan pada Gambar 8.4, disebut dengan diagram kelas UML atau diagram kelas saja. Dalam diagram kelas, bidang data dinotasikan dengan

namaBidangData: tipeBidangData

Konstruktor dinotasikan dengan

NamaKelas(namaParameter: tipeParameter)

Metode dinotasikan dengan

namaMetode(namaParameter: tipeParameter): tipeNilaiBalik

Gambar 8.4 Kelas dan objek dapat direpresentasikan menggunakan notasi UML


8.3 Contoh: Mendefinisikan Kelas dan Menciptakan Objek
Bagian ini akan menyajikan dua contoh mendefinisikan kelas dan menggunakan kelas untuk menciptakan objek. Kode8.1 merupakan suatu program yang mendefinisikan kelas Lingkaran dan menggunakannya untuk menciptakan objek-objek. Untuk menghindari konflik penamaan dengan beberapa versi terperbaiki dari kelas Lingkaran, maka pada contoh ini diberi nama kelas Lingkaran1.

Program mengkonstruksi tiga objek lingkaran dengan radius 1.0, 25, dan 125 dan menampilkan radius dan luas tiap objek lingkaran.

Kode8.1 UjiLingkaran1.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
public class UjiLingkaran1 {
  /** Metode utama */
  public static void main(String[] args) {
    // Menciptakan suatu objek lingkaran1 dengan radius 1.0
    Lingkaran1 lingkaran1 = new Lingkaran1();
    System.out.println("Luas lingkaran dengan radius "
    + lingkaran1.radius + " adalah " + lingkaran1.dapatLuas());

    // Menciptakan suatu objek lingkaran2 dengan radius 25
    Lingkaran1 lingkaran2 = new Lingkaran1(25);
    System.out.println("Luas lingkaran dengan radius "
    + lingkaran2.radius + " adalah " + lingkaran2.dapatLuas() );
 
    // Menciptakan suatu objek lingkaran2 dengan radius 25
    Lingkaran1 lingkaran3 = new Lingkaran1(125);
    System.out.println("Luas lingkaran dengan radius "
    + lingkaran3.radius + " adalah " + lingkaran3.dapatLuas());

    // Memodifikasi radius lingkaran
    lingkaran2.radius = 100;
    System.out.println("Luas lingkaran dengan radius "
    + lingkaran2.radius + " adalah " + lingkaran2.dapatLuas());
  }
}

// Mendefinisikan kelas Lingkaran1 dengan dua konstruktor
class Lingkaran1 {
  double radius;

  /** Mengkonstruksi suatu objek Lingkaran1 dengan radius 1 */
  Lingkaran1(){
    radius = 1.0;
  }

  /** Mengkonstruksi suatu objek Lingkaran1 dengan radius tertentu */
  Lingkaran1(double radiusBaru){
    radius = radiusBaru;
  }

   /** Mengembalikan luas lingkaran */
   double dapatLuas(){
     return radius * radius * Math.PI;
   }
}

Keluaran

Luas lingkaran dengan radius 1.0 adalah 3.141592653589793
Luas lingkaran dengan radius 25.0 adalah 1963.4954084936207
Luas lingkaran dengan radius 125.0 adalah 49087.385212340516
Luas lingkaran dengan radius 100.0 adalah 31415.926535897932


Program memuat dua kelas. Yang pertama, UjiLingkaran1, adalah kelas utama. Satu-satunya tujuan kelas ini adalah untuk menguji kelas kedua, Lingkaran1. Ketika Anda menjalankan program ini, sistem runtime JAVA akan memanggil metode main dalam kelas utama.
Anda bisa menempatkan dua kelas di dalam satu file, tetapi hanya boleh satu kelas yang publik. Seperti yang Anda telah ketahui bahwa nama kelas publik harus sama dengan nama file. Oleh karena itu,  nama file adalah UjiLingkaran1.java, karena UjiLingkaran1 merupakan kelas publik.

Kelas utama memuat metode main (baris 3) yang menciptakan tiga objek. Sama seperti menciptakan suatu array, operator new digunakan untuk menciptakan suatu objek dari konstruktor. new Lingkaran1() menciptakan suatu objek dengan radius 1.0 (baris 5), new Lingkaran1(25) menciptakan suatu objek dengan radius 25 (baris 10), dan new Lingkaran1(125) menciptakan suatu objek dengan radius 125 (baris 15).

Ketiga objek (yang direferensikan oleh lingkaran1, lingkaran2, dan lingkaran3) memiliki data yang berbeda tetapi metode yang sama. Oleh karena itu, Anda bisa menghitung masing-masing luas lingkaran menggunakan metode dapatLuas(). Bidang-bidang data dapat diakses lewat referensi objek lingkaran1.radius, lingkaran2.radius, dan lingkaran3.radius. Objek dapat memanggil metodenya lewat referensi objek menggunakan lingkaran1.dapatLuas(), lingkaran1.dapatLuas(), dan lingkaran1.dapatLuas().

Ketiga objek independen satu sama lain. Radius lingkaran1 diubah menjadi 100 pada baris 100. Radius baru objek tersebut dan luas lingkaran ditampilkan pada baris 21-22.

Ada banyak cara dalam menulis program JAVA. Sebagai contoh, Anda bisa mengkombinasikan dua kelas menjadi satu, seperti yang ditunjukkan pada kode8.2.

Kode8.2 Lingkaran1.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
public class UjiLingkaran1 {
  /** Metode utama */
  public static void main(String[] args) {
    // Menciptakan suatu objek lingkaran1 dengan radius 1.0
    Lingkaran1 lingkaran1 = new Lingkaran1();
    System.out.println("Luas lingkaran dengan radius "
    + lingkaran1.radius + " adalah " + lingkaran1.dapatLuas());

    // Menciptakan suatu objek lingkaran2 dengan radius 25
    Lingkaran1 lingkaran2 = new Lingkaran1(25);
    System.out.println("Luas lingkaran dengan radius "
    + lingkaran2.radius + " adalah " + lingkaran2.dapatLuas() );
 
    // Menciptakan suatu objek lingkaran2 dengan radius 25
    Lingkaran1 lingkaran3 = new Lingkaran1(125);
    System.out.println("Luas lingkaran dengan radius "
    + lingkaran3.radius + " adalah " + lingkaran3.dapatLuas());

    // Memodifikasi radius lingkaran
    lingkaran2.radius = 100;
    System.out.println("Luas lingkaran dengan radius "
    + lingkaran2.radius + " adalah " + lingkaran2.dapatLuas());
  }
 
  double radius;

  /** Mengkonstruksi suatu objek Lingkaran1 dengan radius 1 */
  Lingkaran1(){
    radius = 1.0;
  }

  /** Mengkonstruksi suatu objek Lingkaran1 dengan radius tertentu */
  Lingkaran1(double radiusBaru){
    radius = radiusBaru;
  }

   /** Mengembalikan luas lingkaran */
   double dapatLuas(){
     return radius * radius * Math.PI;
   }
}

Sebagai tambahan pengalaman Anda, di sini disajikan suatu contoh lain, kelas TV. Setiap TV merupakan suatu objek dengan keadaan-keadaan (kanal sekarang, level volume sekarang, hidup, atau mati), dan watak-watak (ubah kanal, ubah volume, dan matikan/hidupkan). Anda bisa menggunakan suatu kelas untuk memodelkan TV. Diagram UML untuk kelas TV ditampilkan pada Gambar 8.5. Kode8.3 disajikan untuk memberikan program yang mendefinisikan kelas TV.

Gambar 8.5 Diagram kelas TV

Kode8.3 TV.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
public class TV {
  int kanal = 1; // kanal default 1
  int levelVolume = 1; // level volume default 1
  boolean hidup = false;  // TV secara default mati
      
  public TV() {
  }
      
  public void hidupKan() {
    hidup = true;
  }
      
  public void matiKan() {
    hidup = false;
  }
      
  public void setKanal(int kanalBaru) {
    if (hidup && kanalBaru >= 1 && kanalBaru <= 120)
      kanal = kanalBaru;
  }
   
  public void setVolume(int levelVolumeBaru) {
    if (hidup && levelVolumeBaru >= 1 && levelVolumeBaru <= 7)
      levelVolume = levelVolumeBaru;
  }
   
  public void kanalNaik() {
    if (hidup && kanal < 120)
      kanal++;
  }
   
  public void kanalTurun() {
    if (hidup && kanal > 1)
      kanal--;
  }
   
  public void volumeNaik() {
    if (hidup && levelVolume < 7)
      levelVolume++;
  }
   
  public void volumeTurun() {
    if (hidup && levelVolume > 1)
      levelVolume--;
  }
}

Perhatikan bahwa kanal dan level volume tidak berubah bila TV tidak hidup. Sebelum kanal dan level volume diubah, nilai sekarang dari keduanya diperiksa dulu untuk memastikan bahwa keduanya berada di dalam rentang yang diijinkan. Kode8.4 memberikan suatu program yang menggunakan kelas TV untuk menciptakan dua objek.

Kode8.4 UjiTV.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class UjiTV {
  public static void main(String[] args) {
    TV tv1 = new TV();
    tv1.hidupKan();
    tv1.setKanal(30);
    tv1.setVolume(3);

    TV tv2 = new TV();
    tv2.hidupKan();
    tv2.kanalNaik();
    tv2.kanalTurun();
    tv2.volumeNaik();

    System.out.println("kanal tv1 adalah " + tv1.kanal
    + " dan level volumenya adalah "+ tv1.levelVolume);
    System.out.println("kanal tv1 adalah " + tv2.kanal
    + " dan level volumenya adalah " + tv2.levelVolume);
  }
}


Program menciptakan dua objek pada baris 3 dan baris 8 dan memanggil metode-metode pada kedua objek tersebut untuk melakukan beberapa aksi untuk menetapkan kanal, level volume, menaikkan kanal dan level volume. Program menampilkan keadaan-keadaan objek pada baris 14-17. Metode-metode dipanggil menggunakan sintaks seperti tv1.hidupKan (baris 4). Bidang-bidang data diakses menggunakan sintaks seperti tv1.kanal (baris14).

Kedua contoh sebelumnya memberikan kepada Anda sedikit pengetahuan dan pengalaman tentang kelas dan objek. Anda tentu masih mempunyai banyak pertanyaan terkait dengan konstruktor, objek, variabel referensi, pengaksesan bidang data, dan pemanggilan metode. Hal-hal ini akan terjawab pada bagian-bagian selanjutnya.


8.4 Menciptakan Objek Menggunakan Konstruktor
Konstruktor merupakan bentuk spesial dari suatu objek, dengan tiga kekhususan sebagai berikut:
·         Suatu konstruktor harus memiliki nama sama dengan nama kelas.
·         Konstruktor tidak boleh memiliki nilai balik, bahkan void sekalipun.
·         Konstruktor dipanggil menggunakan operator new ketika suatu objek diciptakan. Konstruktor berperan untuk menginisialisasi objek.

Sama seperti metode, konstruktor dapat dioverload (beberapa konstruktor dapat mempunyai nama sama namun dengan sidik yang berbeda), sehingga memudahkan untuk menciptakan objek-objek dengan nilai-nilai inisial yang berbeda.

Adalah kesalahan yang umum terjadi untuk menempatkan katakunci void di depan suatu konstruktor. Sebagai contoh,

public void Lingkaran() {
}

Pada kasus ini Lingkaran() adalah suatu metode, bukan konstruktor.

Konstruktor digunakan untuk menciptakan objek. Untuk menciptakan suatu objek dari suatu kelas, konstruktor dipanggil menggunakan operator new, sebagai berikut:

new NamaKelas(argumen-argumen);

Sebagai contoh, new Lingkaran() menciptakan suatu objek dari kelas Lingkaran menggunakan konstruktor pertama yang didefinisikan di dalam kelas Lingkaran, dan new Lingkaran(25) menciptakan suatu objek dari kelas Lingkaran menggunakan konstruktor kedua yang didefinisikan di dalam kelas Lingkaran.

Suatu kelas biasanya menyediakan suatu konstruktor tanpa argumen (misalnya, Lingkaran()). Konstruktor semacam itu dikenal dengan konstruktor-tanpa-argumen.
Suatu kelas dapat pula didefinisikan tanpa konstruktor. Pada kasus ini, konstruktor-tanpa-argumen diciptakan secara implisit di dalam kelas oleh JAVA.


8.5 Mengakses Objek Lewat Variabel Referensi
Objek yang baru saja diciptakan dialokasikan di dalam memori. Objek tersebut dapat diakses lewat variabel referensi.

8.5.1 Variabel Referensi dan Tipe Referensi
Objek dapat diakses lewat variabel referensi, yang memuat referensi kepada objek. Variabel tersebut dideklarasikan menggunakan sintaks sebagai berikut:

NamaKelas varRefObjek;

Suatu kelas sebenarnya tipe yang didefinisikan programmer. Jadi, kelas adalah suatu tipe, yang berarti bahwa suatu variabel tipe kelas dapat mereferensi atau menunjuk suatu instans dari kelas. Statemen berikut ini mendeklarasikan variabel lingkaranKu menjadi bertipe Lingkaran.

Lingkaran lingkaranKu;

Variabel lingkaranKu dapat mereferensi suatu objek Lingkaran. Statemen selanjutnya menciptakan suatu objek dan menugaskan referensinya kepada lingkaranKu:

lingkaranKu = new Lingkaran();

Menggunakan sintaks di bawah ini, Anda bisa menggabungkan dalam satu statemen pendeklarasian suatu variabel referensi objek, penciptaan suatu objek, dan penugasan suatu referensi objek kepada variabel:

NamaKelas varRefObjek = new NamaKelas();

Berikut adalah suatu contoh:

Lingkaran lingkaranKu = new Lingkaran();

Variabel lingkaranKu memuat suatu referensi kepada suatu objek Lingkaran.

Suatu variabel referensi objek sebenarnya merupakan suatu referensi kepada objek yang ditunjuk. Jadi, dengan kata lain, suatu variabel referensi objek dan suatu objek adalah berbeda, tetapi dalam banyak kasus perbedaan ini bisa diabaikan. Jadi, demi kesederhanaan, dapat diperbolehkan untuk mengatakan bahwa lingkaranKu merupakan suatu objek Lingkaran, karena bila mengatakan lingkaranKu adalah suatu variabel yang memuat suatu referensi yang menunjuk ke suatu objek Lingkaran merupakan hal yang cukup melelahkan.

Perhatikan bahwa array diperlakukan sebagai objek dalam JAVA. Array diciptakan menggunakan operator new. Suatu variabel array sebenarnya memuat suatu referensi yang menunjuk ke suatu array.


8.5.2 Mengakses Bidang Data dan Metode Suatu Objek
Setelah suatu objek diciptakan, datanya dapat diakses dan metodenya dapat dipanggil melalui operator dot (.), yang juga dikenal dengan operator akses anggota objek:
·         varRefObjek.bidangData mereferensi atau menunjuk suatu bidang data di dalam suatu objek.
·         varRefObjek.namaMetode(argumen) memanggil suatu metode pada suatu objek.
Sebagai contoh, lingkaranKu.radius mereferensi data radius dalam lingkaranKu, dan lingkaranKu.dapatLuas() memanggil metode dapatLuas() pada lingkaranKu.

Bidang data radius disebut dengan variabel instans, karena independen pada instans tertentu. Dengan alasan yang sama, metode dapatLuas() disebut dengan metode instans, karena Anda hanya dapat memanggilnya hanya pada instans tertentu saja.

Ingat bahwa Anda pernah menggunakan Math.namaMetode(argumen) (misalnya, Math.pow(3,2.1)) untuk memanggil suatu metode dalam kelas Math. Dapatkah Anda memanggil dapatLuas() menggunakan Lingkaran.dapatLuas()? Jawabannya adalah tidak, karena semua metode di dalam kelas Math merupakan metode statik, yang didefinisikan menggunakan katakunci static. Akan tetapi, dapatLuas() merupakan suatu metode instans, jadi nonstatik dan harus dipanggil dari suatu objek menggunakan sintaks varRefObjek.namaMetode(argumen) (misalnya, lingkaranKu.dapatLuas()). Penjelasan berikutnya diberikan pada bagian 8.7.

Kadang-kala Anda bisa menciptakan suatu objek tanpa perlu secara eksplisit menugaskannya kepada suatu variabel referensi, seperti contoh ini:

new Lingkaran();

atau

System.out.println("Luas adalah " + new Lingkaran(5).dapatLuas());


8.5.3 Mereferensi Bidang Data dan Nilai null
Bidang data dapat berupa tipe referensi. Sebagai contoh, kelas Mahasiswa berikut ini memuatu suatu bidang data nama yang bertipe String (tipe referensi). String merupakan suatu tipe referensi yang didefinisikan di dalam kelas JAVA.

class Mahasiswa {
  String nama; // nama memiliki nilai default null
  int umur; // umur memiliki nilai default 0
  boolean apaJurusan; // apaJurusan memiliki nilai default false
  char jenisKelamin; // jenisKelamin memiliki nilai default '\u0000'
}

Jika suatu bidang data bertipe referensi yang tidak menunjuk sembarang objek, maka JAVA menginisialisasinya dengan nilai null. Nilai null merupakan suatu literal sama seperti true atau false. Jika true dan false merupakan literal untuk tipe boolean, maka null adalah literal untuk tipe referensi.

Nilai default null diberikan suatu bidang data bertipe referensi, 0 untuk bertipe numerik, false untuk bertipe boolean, dan ‘\0000’ untuk bertipe char. Akan tetapi, JAVA tidak menugaskan nilai default bagi variabel lokal. Kode berikut ini menampilkan nilai-nilai default bagi bidang-bidang data nama, usia, apaJurusan, dan jenisKelamin pada objek Mahasiswa:

class Uji {
  public static void main(String[] args) {
    Mahasiswa mahasiswa = new Mahasiswa();
    System.out.println("nama? "+ mahasiswa.nama);
    System.out.println("usia? "+  mahasiswa.usia);
    System.out.println("apaJurusan? "+  mahasiswa.apaJurusan);
    System.out.println("jenis kelamin? "+ mahasiswa.jenisKelamin);
  }
}
Kode berikut ini akan menghasilkan error kompilasi, karena variabel-variabel lokal tidak diinisialisasi:

class Test {
  public static void main(String[] args) {
    int x; // x tidak memiliki nilai default
    String y; // y tidak memiliki nilai default
    System.out.println("x = " + x);
    System.out.println("y = " + y);
}
}


8.5.4 Perbedaan Antara Variabel Tipe Primitif dan Tipe Referensi
Setiap variabel merepresentasikan suatu lokasi memori yang menampung suatu nilai. Ketika Anda mendeklarasikan suatu variabel, Anda memberitahukan kepada kompiler tipe nilai yang dapat dimuat oleh suatu variabel. Untuk variabel tipe primitif, nilainya adalah tipe primitif. Untuk variabel tipe referensi, nilainya adalah suatu referensi yang mengindikasikan alamat suatu objek. Sebagai contoh, seperti yang ditunjukkan pada Gambar 8.6, nilai variabel int, i, adalah nilai int, 1, dan nilai objek Lingkaran, c, memuat suatu referensi yang menunjuk dimana isi objek Lingkaran disimpan di dalam memori.

Gambar 8.6 Suatu variabel tipe primitif memuat suatu nilai tipe primitif, dan suatu variabel tipe referensi memuat suatu referensi yang menunjuk dimana suatu objek disimpan dalam memori

Ketika Anda menugaskan suatu variabel kepada variabel lain, variabel yang lain itu memiliki nilai yang sama dengan variabel pertama. Untuk variabel tipe primitif, nilai riil suatu variabel ditugaskan kepada variabel lain. Untuk tipe referensi, referensi suatu variabel ditugaskan kepada variabel lain. Seperti ditampilkan pada Gambar 8.7, statemen penugasan i = j menyalin konten j kepada i untuk variabel tipe primitif. Seperti ditampilkan pada Gambar 8.8, statemen penugasan c1 = c2 menyalin referensi c2 kepada c1 untuk variabel tipe primitif. Setelah penugasan, variabel c1 dan c2 menunjuk kepada objek yang sama.

Gambar 8.7 Variabel primitif j disalin kepada variabel i


Gambar 8.8 Variabel referensi c2 disalin kepada variabel c1

Seprti ditunjukkan pada Gambar 8.8, setelah statemen penugasan c1 = c2, c1 menunjuk ke objek yang sama dengan yang ditunjuk oleh c1. Objek yang sebelumnya direferensi oleh c1 tidak lagi berguna dan sekarang menjadi sampah. Sampah seperti ini menempati memori. Sistem runtime JAVA secara otomatis membersihkan sampah ini dan mengosongkan memori tersebut. Proses ini disebut juga dengan pemungutan sampah atau garbage collection.

Jika Anda mengetahui bahwa suatu objek tidak lagi dibutuhkan, Anda bisa secara eksplisit menugaskan nilai null kepada suatu variabel referensi yang menunjuk objek itu. JVM secara otomatis akan mengosongkan memori jika suatu objek tidak direferensi oleh sembarang variabel referensi.


8.6 Menggunakan Kelas dari Pustaka JAVA
Kode8.1 mendefinisikan kelas Lingkaran1 dan menciptakan beberapa objek dari kelas tersebut. Anda juga bisa menggunakan kelas dari pustaka JAVA untuk mengembangkan program Anda. Bagian ini memberikan beberapa contoh kelas di dalam pustaka JAVA.

8.6.1 Kelas Date
Pada kode2.8, TampilWaktuSekarang.java, Anda telah belajar bagaimana mendapatkan waktu saat ini menggunakan System.currentTimeMillis(). Anda menggunakan operator pembagian dan modulus untuk mendapatkan detik, menit, dan jam saat ini. JAVA menyediakan suatu enkapsulasi bebas-sistem untuk tanggal dan waktu dalam kelas java.util.Date, seperti yang ditampilkan pada Gambar 8.9.

Gambar 8.9 Suatu objek Date merepresentasikan tanggal dan waktu spesifik

Anda bisa menggunakan konstruktor tanpa-argumen dalam kelas Date untuk menciptakan suatu instans untuk waktu dan tanggal sekarang, metode getTime() untuk jumlah waktu dalam mili detik sejak 1 Januari 1970, dan metode toString() untuk memberikan tanggal dan waktu dalam string. Sebagai contoh, kode berikut ini

java.util.Date tanggal = new java.util.Date();
System.out.println("Jumlah waktu sejak 1 Januari 1970 adalah " +
  tanggal.getTime() + " milidetik");
System.out.println(tanggal.toString());

menampilkan keluaran:

Jumlah waktu sejak 1 Januari 1970 adalah 1100647310284 milidetik
Mon Nov 5 14:33:30 EST 2012

kelas Date memiliki konstruktor lain, Date(long elapseTime), yang dapat digunakan untuk mengkonstruksi suatu objek Date pada waktu yang diberikan, terhitung sejak 1 Januari 1970.


8.6.2 Kelas Random
Anda telah menggunakan Math.random() untuk mendapatkan suatu nilai acak bertipe double dengan rentang 0.0 sampai 1.0. Cara lain dalam membangkitkan angka acak adalah dengan menggunakan kelas java.util.Random, seperti yang ditampilkan pada Gambar 8.10, yang dapat membangkitkan suatu nilai acak int, long, double, float, dan boolean.

Gambar 8.10 Suatu objek Random dapat digunakan untuk membangkitkan nilai-nilai acak


Ketika Anda menciptakan suatu objek Random, Anda harus menentukan seed atau menggunakan seed default. Konstruktor tanpa-argmen menciptakan suatu objek Random menggunakan selisih waktu sekarang sebagai seed. Jika dua objek Random memiliki seed yang sama, maka akan dihasilkan nilai acak yang sama. Sebagai contoh, kode berikut ini menciptakan dua objek Random dengan seed yang sama, 3:

Random acak1 = new Random(3);
System.out.print("Dari acak1: ");
for (int i = 0; i < 10; i++)
  System.out.print(acak1.nextInt(1000) + " ");

Random acak2 = new Random(3);
System.out.print("\nDari acak2: ");
for (int i = 0; i < 10; i++)
  System.out.print(acak2.nextInt(1000) + " ");

Kode tersebut menghasilkan runtun nilai acak int yang sama:

Dari acak1: 734 660 210 581 128 202 549 564 459 961
Dari acak2: 734 660 210 581 128 202 549 564 459 961


8.6.3 Menampilkan Komponen GUI
Ketika Anda mengembangkan program untuk menciptakan antarmuka grafikal (GUI), Anda akan menggunakan kelas-kelas JAVA seperti JFrame, JButton, JradioButton, JComboBox, dan JList. Kode8.5 merupakan suatu contoh dua jendela menggunakan kelas JFrame. Keluaran program ditampilkan pada 8.11.

Gambar 8.11 Program menciptakan dua jendela menggunakan kelas JFrame

Kode8.5 UjiFrame.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import javax.swing.JFrame;

public class UjiFrame {
  public static void main(String[] args) {
    JFrame frame1 = new JFrame();
    frame1.setTitle("Jendela 1");
    frame1.setSize(200, 150);
    frame1.setLocation(200, 100);
    frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame1.setVisible(true);

    JFrame frame2 = new JFrame();
    frame2.setTitle("Jendela 2");
    frame2.setSize(200, 150);
    frame2.setLocation(410, 100);
    frame2.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame2.setVisible(true);
  }
}

Program ini menciptakan dua objek kelas JFrame (baris 5 dan 12) dan kemudian menggunakan metode-metode setTitle, setSize, setLocation, setDefaultCloseOperation, dan setVisible untuk menetapkan watak-watak objek. Metode setTitle menetapkan suatu judul pada jendela (baris 6 dan 13). Metode setSize menetapkan lebar dan tinggi jendela (baris 7 dan 14). Metode setLocation menetapkan lokasi pojok kiri-atas jendela (baris 8 dan 15). Metode setDefaultCloseOperation menghentikan program ketika frame ditutup (baris 9 dan 16). Metode setVisible untuk menampilkan jendela.

 Anda bisa menambahkan komponen-komponen GUI, seperti tombol, label, bidang teks, kotak periksa, dan kotak combo dalam jendela.

Kode8.6 KomponenGUI.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
import javax.swing.*;

public class KomponenGUI {
  public static void main(String[] args) {
    // Menciptakan suatu tombol dengan teks YA
    JButton jbtYA = new JButton("YA");

    // Menciptakan suatu tombol dengan teks Batal
    JButton jbtBatal = new JButton("Batal");

    // Meciptakan suatu label dengan teks "Masukkan nama Anda: "
    JLabel jlblNama = new JLabel("Masukkan nama Anda: ");

    // Menciptakan suatu bidang teks dengan teks "Ketik nama di sini"
    JTextField jtfNama = new JTextField("Ketik nama di sini");

    // Menciptakan suatu kotak periksa dengan teks Tebal
    JCheckBox jchkTebal = new JCheckBox("Tebal");

    // Menciptakan suatu kotak periksa dengan teks Miring
    JCheckBox jchkMiring = new JCheckBox("Miring");

    // Menciptakan suatu kotak radio dengan teks Merah
    JRadioButton jrbMerah = new JRadioButton("Merah");

    // Menciptakan suatu kotak radio dengan teks Kuning
    JRadioButton jrbKuning = new JRadioButton("Kuning");

    // Menciptakan suatu kotak combo dengan beberapa pilihan
    JComboBox jcboWarna = new JComboBox(new String[]{"Sangat Pintar",
     "Pintar", "Cukup", "Kurang"});

    // Menciptakan suatu panel pada komponen-komponen
    JPanel panel = new JPanel();
    panel.add(jbtYA); // Menambah tomobol YA pada panel
    panel.add(jbtBatal); // Menambah tombol Batal pada panel
    panel.add(jlblNama); // Menambah label pada label
    panel.add(jtfNama); // Menambah bidang teks pada panel
    panel.add(jchkTebal); // Menambah kotak periksa pada panel
    panel.add(jchkMiring); // Menambah kotak periksa pada panel
    panel.add(jrbMerah); // Menambah kotak radio pada panel
    panel.add(jrbKuning); // Menambah kotak radio pada panel
    panel.add(jcboWarna); // Menambah kotak combo pada panel

    JFrame frame = new JFrame(); // Menciptakan suatu frame
    frame.add(panel); // Menambah panel pada frame
    frame.setTitle("Tampilkan Komponen GUI");
    frame.setSize(450, 100);
    frame.setLocation(200, 100);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setVisible(true);
  }
}

Keluarannya adalah




yang sama dengan apa yang ditampilkan pada Gambar 8.1.


8.7 Variabel, Konstanta, dan Metode Statik
Bidang data radius dalam kelas Lingkaran pada kode8.1 dikenal sebagai variabel instans. Suatu variabel instans terikat dengan instans kelas tertentu; variabel ini tidak dipakai bersama oleh objek-objek kelas yang sama. Sebagai contoh, dimisalkan bahwa Anda menciptakan objek-objek berikut ini:

Lingkaran lingkaran1 = new Lingkaran();
Lingkaran lingkaran2 = new Lingkaran (5);

radius dalam lingkaran1 independen terhadap radius dalam lingkaran2 dan disimpan pada lokasi yang berbeda. Perubahan yang dilakukan terhadap radius dalam lingkaran1 tidak berpengaruh terhadap radius dalam lingkaran2.

Jika Anda menginginkan semua instans suatu kelas menggunakan bersama bidang data, maka Anda bisa menggunakan variabel statik, yang juga dikenal dengan variabel kelas. Variabel statik menyimpan nilai di dalam lokasi memori yang digunakan bersama. Karena lokasi digunakan bersama, jika suatu objek mengubah nilai suatu variabel statik, maka semua objek dalam kelas yang sama akan terpengaruh. JAVA juga mendukung keberadaan metode statik, seperti variabel statik. Metode statik dipangil tanpa harus menciptakan suatu instans dari kelas.


Gambar 8.12 Variabel instans independen satu sama lain, dan variabel/metode statik dipakai bersama

Kelas Lingkaran dapat dimodifikasi dengan menambahkan suatu variabel statik jumlahObjek untuk menghitung jumlah objek yang diciptakan. Ketika objek pertama dari kelas ini diciptakan, jumlahObjek menjadi 1. Ketika objek kedua dari kelas ini diciptakan, jumlahObjek menjadi 2. Diagram kelas UML atas kelas Lingkaran ditampilkan pada Gambar 8.12. Kelas Lingkaran mendefinisikan variabel instans radius dan variabel statik jumlahObjek, metode-metode instans dapatRadius, tetapkanRadius, dan dapatLuas, dan metode statik dapatJumlahObjek.

Untuk mendeklarasikan suatu variabel statik atau mendefinisikan suatu metode statik, Anda perlu menempatkan pemodifikasi static dalam deklarasi variabel atau metode.

static int jumlahObjek;
static int dapatJumlahObjek() {
  return jumlahObjek;
}

Konstanta di dalam kelas dipakai secara bersama oleh semua objek pada kelas yang sama. Jadi, konstanta harus dideklarasikan final static. Sebagai contoh, konstanta PI dalam kelas Math didefinisikan sebagai:

final static double PI = 3.14159265358979323846;

Kelas lingkaran yang baru, Kelas2, dideklarasikan pada kode8.7:

Kode8.7 Lingkaran2.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
public class Lingkaran2 {
  /** Radius lingkaran */
  double radius;

  /** Jumlah objek yang diciptakan */
  static int jumlahObjek = 0;

  /** Mencipatakan suatu objek Lingkaran dengan radius 1 */
  Lingkaran2() {
    radius = 1.0;
    jumlahObjek++;
  }

  /** Mencipatakan suatu objek Lingkaran dengan radius ditentukan */
  Lingkaran2(double radiusBaru) {
    radius = radiusBaru;
    jumlahObjek++;
  }

  /** Memberikan nilai balik jumlahObjek */
  static int dapatJumlahObjek() {
    return jumlahObjek;
  }

  /** Memberikan nilai balik luas lingkaran */
  double dapatLuas() {
    return radius * radius * Math.PI;
  }
}

Metode dapatJumlahObjek pada kelas Lingkaran2 merupakan suatu metode statik. Contoh lain metode statik adalah showMessageDialog dan showInputDialog dalam kelas JOptionPane dan semua metode dalam kelas Math. Metode main juga merupakan metode statik.
Metode-metode instans (misalnya, dapatLuas()) dan data instans (misalnya, radius) hanya dapat digunakan setelah instans diciptakan. Baik metode instans maupun data instans dapat diakses melalui variabel referensi. Metode statik (misalnya, dapatJumlahObjek()) dan data statik (misalnya, jumlahObjek) dapat diakses dari instans maunpun dari nama kelasnya.

Program pada kode8.8 mendemonstrasikan bagaimana menggunakan variabel/metode instans/statik dan mengilustrasikan pengaruh penggunaannya.

Kode8.8 UjiLingkaran2.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
public class UjiLingkaran2 {
  /** Metode Utama */
  public static void main(String[] args) {
    System.out.println("Sebelum menciptakan objek-objek");
    System.out.println("Jumlah objek Lingkaran adalah " +
      Lingkaran2.jumlahObjek);

    // Menciptakan c1
    Lingkaran2 c1 = new Lingkaran2();

    // Menampilkan c1 dan SEBELUM c2 diciptakan
    System.out.println("\nSetelah menciptakan c1");
    System.out.println("c1: radius (" + c1.radius +
      ") dan jumlah objek Lingkaran (" +
      c1.jumlahObjek + ")");

    // Menciptakan c2
    Lingkaran2 c2 = new Lingkaran2(5);

    // Memodifikasi c1
    c1.radius = 9;

    // Menampilkan c1 dan c2 SETELAH c2 diciptakan
    System.out.println("\nSetelah menciptakan c2 dan memodifikasi c1");
    System.out.println("c1: radius (" + c1.radius +
      ") dan jumlah objek Lingkaran (" +
      c1.jumlahObjek + ")");
    System.out.println("c2: radius (" + c2.radius +
      ") dan jumlah objek Lingkaran (" +
      c2.jumlahObjek + ")");
  }
}

Keluaran

Sebelum menciptakan objek-objek
Jumlah objek Lingkaran adalah 0

Setelah menciptakan c1
c1: radius (1.0) dan jumlah objek Lingkaran (1)

Setelah menciptakan c2 dan memodifikasi c1
c1: radius (9.0) dan jumlah objek Lingkaran (2)
c2: radius (5.0) dan jumlah objek Lingkaran (2)
Ketika Anda mengkompilasi UjiLingkaran2.java, kompiler JAVA secara otomatis mengkompile Lingkaran2.java jika belum dikompilasi.

Variabel dan metode statik dapat diakses tanpa perlu menciptakan objek terlebih dahulu. Baris 6 menampilkan jumlah objek, yang bernilai 0, karena belum ada objek yang diciptakan.

Metode main menciptakan dua objek, c1 dan c2 (baris 9 dan 18). Variabel instans radius dalam c1 dimodifikasi sehingga bernilai 9 (baris 21). Perubahan ini tidak mempengaruhi variabel instans radius dalam c2, karena kedua variabel instans independen satu sama lain. Variabel statik jumlahObjek menjadi 1 setelah c1 diciptakan (baris 9), dan menjadi 2 setelah c2 diciptakan (baris 18).

Perhatikan bahwa PI merupakan suatu konstanta yang didefinisikan dalam kelas Math, dan Math.PI mereferensi konstanta. c1.jumlahObjek dapat pula digantikan dengan Lingkaran2.jumlahObjek. Hal ini akan mempermudah pembacaan program, karena pembaca akan mengerti bahwa jumlahObjek adalah variabel statik.

Variabel dan metode statik dapat digunakan dari metode instans atau statik di dalam kelas. Akan tetapi, variabel dan metode instans hanya bisa digunakan dari metode instans, bukan dari metode statik, karena variabel dan metode statik tidak milik objek tertentu. Jadi, kode berikut ini adalah salah.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class Siantar {
  int i = 5;
  static int k = 2;

  public static void main(String[] args) {
    int j = i; // Salah karena i adalah suatu variabel instans
    m1(); // Salah karena m1() adalah suatu metode instans
  }

  public void m1() {
    // Benar karena variabel dan metode instans dan statik
    // dapat digunakan dalam suatu metode instans
    i = i + k + m2(i, k);
  }

  public static int m2(int i, int j) {
    return (int)(Math.pow(i, j));
  }
}

Perhatikan bila Anda mengganti kode pada baris 5-8, maka program menjadi benar, karena bidang data instans i dan metode instans m1() dapat diakses dari suatu objek siantar (baris 6-7):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class Siantar {
  int i = 5;
  static int k = 2;

  public static void main(String[] args) {
    Siantar siantar = new Siantar();
    int j = siantar.i;  // OK, siantar.i mengakses variabel instans objek
    siantar.m1(); // OK karena siantar.m1() memanggil metode instans objek
  }

  public void m1() {
    // Benar karena variabel dan metode instans dan statik
    // dapat digunakan dalam suatu metode instans
    i = i + k + m2(i, k);
  }

  public static int m2(int i, int j) {
    return (int)(Math.pow(i, j));
  }
}


8.8 Pemodifikasi Visibilitas
Anda bisa menggunakan pemodifikasi visibilitas public untuk kelas, metode, dan bidang data untuk menandakan bahwa mereka bisa diakses dari kelas manapun. Jika pemodifikasi visibilitas tidak digunakan, maka secara default kelas, metode, dan bidang data dapat diakses oleh sembarang kelas dalam package yang sama. Hal ini dikenal dengan akses-paket.

Selain pemodifikasi public, JAVA juga menyediakan pemodifikasi private dan protected untuk anggota-anggota kelas. Bagian ini akan mengenalkan pemodifikasi private, sedangkan pemodifikasi protected akan dikenalkan pada Bab. 11.

Pemodifikasi private membuat metoda dan bidang data hanya bisa diakses dari dalam kelas sendiri.  Gambar 8.13 mengilustrasikan bagaimana metode public dan bidang data public dalam kelas C1 dapat diakses dari suatu kelas C2 di dalam paket yang sama dan dari kelas C3 dalam paket yang berbeda.


Gambar 8.13 Pemodifikasi private membatasi akses dari kelas lain, pemodifikasi default membatasi akses dari paket lain, dan pemodifikasi public tidak membatas akses bagi siapapun

Jika suatu kelas tidak didefinisikan public, maka artinya hanya bisa diakses dari dalam paket yang sama. Seperti ditunjukkan pada Gambar 8.14, C1 dapat diakses dari C2, bukan dari C3.


Gambar 8.14 Suatu kelas nonpublik memiliki akses-paket

Suatu pemodifikasi visibilitas menentukan bagaimana bidang data dan metode dalam suatu kelas dapat diakses dari dua kelas. Tidak ada batasan akses terhadap bidang data dan metode dari dalam kelas sendiri. Seperti ditampilkan pada Gambar 8.15b, suatu objek foo dari kelas Foo tidak dapat mengakses anggota privat, karena foo berada dalam kelas Test. Seperti ditunjukkan pada Gambar 8.15a, suatu objek foo dari kelas Foo dapat mengakses anggota privat, karena foo didefinisikan di dalam kelasnya sendiri.


Gambar 8.15 Suatu objek dapat mengakses anggota-anggota privat jika didefinisikan di dalam kelas sendiri.


8.9 Enkapsulasi Bidang Data
Bidang data radius dan jumlahObjek dalam kelas Lingkaran2 pada kode8.7 dapat dimodifikasi secara langsung (misalnya, lingkaranKu.radius = 5 atau Lingkaran2.jumlahObjek = 10). Hal ini merupakan tindakan pemrograman yang tidak baik, karena dua alasan:
·         Pertama, data bisa berubah. Sebagai contoh, jumlahObjek dimaksudkan untuk menghitung jumlah objek yang diciptakan, tetapi bisa saja jumlahObjek diubah secara tidak sengaja (misalnya, Lingkaran2.jumlahObjek = 10).
·         Kedua, kelas menjadi susah dipelihara. Seandainya Anda ingin memodifikasi kelas Lingkaran2 untuk memastikan bahwa radius harus nonnegatif setelah beberapa program menggunakannya. Anda harus mengubah bukan saja kelas Lingkaran2 tetapi juga program-program yang menggunakannya, karena bisa saja klien mengubah radius secara langsung (misalnya, lingkaranKu.radius = - 5).

Untuk mencegah pemodifikasian atas bidang data, Anda harus mendeklarasikan bidang data privat, menggunakan pemodifikasi private. Hal ini dikenal dengan enkapsulasi bidang data.

Suatu bidang data privat tidak dapat diakses oleh suatu objek dari luar kelas yang mendefinisikan bidang data privat. Tetapi seringkali klien ingin memakai dan mengubah bidang data. Agar bidang data privat dapat diakses, Anda bisa menyediakan suatu metode dapat untuk mendapatkan nilainya. Agar bidang data privat dapat diperbarui, Anda juga bisa menyediakan suatu metode tetapkan untuk menetapkan suatu nilai baru.

Suatu metode dapat memiliki sidik berikut ini:

public tipeNilaiBalik dapatNamaData()

Suatu metode tetapkan memiliki sidik berikut ini:

public tipeNilaiBalik tetapkanNamaData()
Jika tipeNilaiBalik adalah boolean, metode dapat harus didefinisikan dengan konvensi berikut ini:

public boolean apaNamaData()

Suatu kelas lingkaran yang baru dengan suatu bidang data privat dibuat, yang dinamakan Lingkaran3, untuk mengilustrasikan bagaimana enkapsulasi bidang data bekerja. Kelas baru ini didefinisikan pada kode8.9:

Kode8.9 Lingkaran3.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
public class Lingkaran3 {
  /** Radius lingkaran */
  private double radius = 1;

  /** Jumlah objek yang diciptakan */
  private static int jumlahObjek = 0;

  /** Menciptakan suatu lingkaran dengan radius 1 */
  public Lingkaran3() {
    jumlahObjek++;
  }

  /** Menciptakan suatu lingkaran dengan radius tertentu */
  public Lingkaran3(double radiusBaru) {
    radius = radiusBaru;
    jumlahObjek++;
  }

  /** Memberikan nilai balik radius */
  public double dapatRadius(){
    return radius;
  }

  /** Menetapkan nilai radius baru */
  public void tetapkanRadius(double radiusBaru){
    radius = (radiusBaru >= 0) ? radiusBaru : 0;
  }

  /** Mengembalikan jumlahObjek */
  public static int dapatJumlahObjek(){
    return jumlahObjek;
  }

  /** Mengembalikan luas lingkaran */
  public double dapatLuas() {
    return radius * radius * Math.PI;
  }
}


Metode dapatRadius (baris 20-22) mengembalikan radius, dan metode tetapkanRadius (baris 25-27) menetapkan suatu nilai radius yang baru kepada objek. Jika nilai radius yang baru negatif, maka nilai radius menjadi 0 kepada objek. Karena metode-metode ini satu-satunya jalan untuk mengakses dan memodifikasi radius, maka Anda harus memonitor dan mengendalikan bagaimana bidang data ini diakses. Jika Anda ingin mengubah implementasi metode-metode ini, Anda tidak perlu mengubah program klien. Hal ini membuat pemeliharaan kelas lebih gampang dilakukan.

Kode8.10 memberikan suatu program klien yang menggunakan kelas Lingkaran3 untuk menciptakan suatu objek Lingkaran3, lingkaranKu, dan memodifikasi radius menggunakan metode tetapkanRadius.

Kode8.10 UjiLingkaran3.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class UjiLingkaran3 {
  /** Metode utama */
  public static void main(String[] args) {
    // Menciptakan suatu lingkaran dengan radius 5.0
    Lingkaran3 lingkaranKu = new Lingkaran3(5.0);
    System.out.println("Luas lingkaran dengan radius "
     + lingkaranKu.dapatRadius() + " adalah " + lingkaranKu.dapatLuas());

    // Menambah radius lingkaranKu sebesar 10%
    lingkaranKu.tetapkanRadius(lingkaranKu.dapatRadius() * 1.1);
    System.out.println("Luas lingkaran dengan radius "
     + lingkaranKu.dapatRadius() + " adalah " + lingkaranKu.dapatLuas());

    System.out.println("Jumlah objek yang diciptakan adalah "
     + Lingkaran3.dapatJumlahObjek());
  }
}

Keluaran

Luas lingkaran dengan radius 5.0 adalah 78.53981633974483
Luas lingkaran dengan radius 5.5 adalah 95.03317777109125
Jumlah objek yang diciptakan adalah 1

Bidang data radius dideklarasikan privat. Data privat hanya bisa diakses dari dalam kelas sendiri. Anda tidak bisa menggunakan lingkaranKu.radius dari suatu program klien. Suatu error kompilasi akan terjadi bila Anda mencoba untuk mengakses data privat dari program klien.

Karena jumlahObjek dideklarasikan privat, maka tidak bisa dimodifikasi. Hal ini menghindari pengubahan yang tidak diinginkan. Sebagai contoh, pengguna tidak bisa menetapkan jumlahObjek bernilai 100. Satu-satunya cara membuat jumlahObjek bernilai 100 adalah dengan menciptakan 100 objek dari kelas Lingkaran3.


8.10 Melewatkan Objek Kepada Metode
Anda bisa melewatkan objek kepada metode. Seperti melewatkan array kepada metode, melewatkan objek sebenarnya adalah melewatkan referensi objek. Kode berikut ini melewatkan objek lingkaranKu sebagai suatu argumen kepada metode tampilLingkaran:

1
2
3
4
5
6
7
8
9
10
11
12
public class Uji {
  public static void main(String[] args) {
    // Lingkaran3 didefinisikan dalam kode8.9
    Lingkaran3 lingkaranKu = new Lingkaran3(5.0);
    tampilLingkaran(lingkaranKu);
  }

  public static void tampilLingkaran(Lingkaran3 c){
    System.out.println("Luas lingkaran dengan radius "
     + c.dapatRadius() + " adalah " + c.dapatLuas());
  }
}

JAVA menggunakan satu mode pelewatan argumen: pelewatan dengan nilai. Pada kode sebelumnya, nilai lingkaranKu dilewatkan kepada metode tampilLingkaran. Nilai ini adalah suatu referensi kepada suatu objek Lingkaran3.

Berikutnya akan didemonstrasikan perbedaan antara pelewatan nilai primitif dengan pelewatan nilai referensi pada kode 8.11:

Kode8.11 UjiPelewatanObjek.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public class UjiPelewatanObjek {
   /** Metode utama */
   public static void main(String[] args) {
     // Menciptakan suatu objek Lingkaran3 dengan radius 1
     Lingkaran3 lingkaranKu = new Lingkaran3(1);

    // Menampilkan luas lingkaran untuk radius 1, 2, 3, 4, dan 5.
    int n = 5;
    tampilLuas(lingkaranKu, n);

    // Melihat lingkaranKu.radius dan kali
    System.out.println("\n" + "Radius = " + lingkaranKu.dapatRadius());
    System.out.println("n = " + n);
  }

  /** Menampilkan suatu tabel luas dengan radius */
  public static void tampilLuas(Lingkaran3 c, int kali){
    System.out.println("Radius \t\tLuas");
    while (kali >= 1) {
      System.out.println(c.dapatRadius() + "\t\t" + c.dapatLuas());
      c.tetapkanRadius(c.dapatRadius() + 1);
      kali--;
    }
  }
}

Keluaran

Radius      Luas
1.0     3.141592653589793
2.0     12.566370614359172
3.0     28.274333882308138
4.0     50.26548245743669
5.0     78.53981633974483

Radius = 6.0
n = 5

Kelas Lingkaran3 didefinisikan pada kode8.9. Program melewatkan suatu objek Lingkaran3, lingkaranKu, dan suatu nilai integer n untuk memanggil tampilLuas(lingkaranKu, n) pada baris 9, yang menampilkan suatu tabel untuk radius 1, 2, 3, 4, dan 5.

Ketika melewatkan suatu argumen tipe primitif, nilai argumen yang dilewatkan. Pada kasus ini, nilai n(5) dilewatkan kepada kali. Dalam metode tampilLuas, isi kali diubah; tetapi hal ini tidak berpengaruh kepada n.

Ketika melewatkan suatu argumen tipe referensi, referensi objek yang dilewatkan. Pada kasus ini, c memuat suatu referensi kepada objek yang juga direferensikan oleh lingkaranKu. Oleh karena itu, mengubah data objek melalui c di dalam metode tampilLuas akan berdampak sama dengan pengubahan data objek di luar metode tampilLuas melalui variabel lingkaranKu.


8.11 Array Objek
Pada Bab. 6, array dengan elemen-elemen primitif diciptakan. Anda juga bisa menciptakan array objek. Sebagai contoh, statemen berikut ini mendeklarasikan dan menciptakan suatu array yang memuast sepuluh objek Lingkaran:

Lingkaran[] arrayLingkaran = new Lingkaran [10];

Untuk menginisialisasi arrayLingkaran, Anda bisa menggunakan suatu loop for seperti ini:

for (int i = 0; i < arrayLingkaran.length; i++) {
  arrayLingkaran [i] = new Lingkaran ();
}

Array objek merupakan suatu array variabel referensi. Jadi, memanggil arrayLingkaran[1].dapatLuas() melibatkan dua pereferensian, seperti ditunjukkan pada Gambar 8.16. arrayLingkaran mereferensi atau menunjuk semua array. arrayLingkaran[1] mereferensi suatu objek Lingkaran.

Gambar 8.16 Dalam suatu array objek, setiap elemen array memuat suatu referensi kepada suatu objek

Kode8.12 memberikan suatu contoh yang mendemonstrasikan bagaimana menggunakan suatu array objek. Program menciptakan arrayLingkaran, suatu array yang memuat 5 objek Lingkaran3, menginisialisasi radius lingkaran dengan nilai acak dan menampilkan total luas lingkaran di dalam array.
  

Kode8.12 TotalLuas.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
public class TotalLuas {
  /** Metode utama */
  public static void main(String[] args) {
    // Mendeklarasikan lingkaranArray
    Lingkaran3[] arrayLingkaran;

    // Menciptakan arrayLingkaran
    arrayLingkaran = ciptaArrayLingkaran();

    // Menampilkan arrayLingkaran dan total luas lingkaran
    tampilArrayLingkaran(arrayLingkaran);
  }

  /** Menciptakan suatu array yang memuat objek-objek Lingkaran3 */
  public static Lingkaran3[] ciptaArrayLingkaran(){
    Lingkaran3[] arrayLingkaran = new Lingkaran3[5];

    for (int i = 0; i < arrayLingkaran.length; i++) {
      arrayLingkaran[i] = new Lingkaran3(Math.random() * 100);
    }

    // Mengembalikan array yang memuat objek-objek Lingkaran3
    return arrayLingkaran;
  }

  /** Menampilkan suatu array Lingkaran3 dan total luas */
  public static void tampilArrayLingkaran(Lingkaran3[] arrayLingkaran){
    System.out.printf("%-30s%-15s\n", "Radius", "Luas");
    for (int i = 0; i < arrayLingkaran.length; i++) {
      System.out.printf("%-30f%-15f\n", arrayLingkaran[i].dapatRadius(),
      arrayLingkaran[i].dapatLuas());
    }

    System.out.println("—————————————————————————————————————————");

    // Menghitung dan menampilkan luas
    System.out.printf("%-30s%-15f\n", "Total luas lingkaran adalah ",
    jumlah(arrayLingkaran));
  }

  /** Menjumlahkan luas lingkaran */
  public static double jumlah(Lingkaran3[] arrayLingkaran){
    // menginisialisasi jum
    double jum = 0;

    // Menambah luas kepada jum
    for (int i = 0; i < arrayLingkaran.length; i++)
      jum += arrayLingkaran[i].dapatLuas();

    return jum;
  }
}

Keluaran

Radius                        Luas          
78.759956                     19487.709595  
64.171537                     12937.035172  
98.967677                     30770.647045  
12.883886                     521.487149    
12.550941                     494.882879    
—————————————————————————————————————————
Total luas lingkaran adalah   64211.761840  

Program memanggil ciptaArrayLingkaran (baris 8) untuk menciptakan suatu array yang memuat lima objek Lingkaran3. Radius lingkaran secara acak dibangkitkan menggunakan metode Math.random() pada baris 19.

Metode ciptaArrayLingkaran memberikan nilai balik berupa suatu array yang memuat objek-objek Lingkaran3 (baris 23). Array tersebut dilewatkan kepada metode tampilArrayLingkaran, yang menampilkan radius dan luas setiap lingkaran dan total luas keseluruhan lingkaran

Penjumlahan semua luas lingkaran dihitung menggunakan metode jumlah (baris 38), yang mengambil array objek Lingkaran3 sebagai argumen dan memberikan nilai balik total luas, jum, yang bertipe double.

No comments:

Post a Comment