Friday, March 16, 2018

5. Pengantar Kelas Bagian 3



Seperti yang dapat Anda lihat, kotakKu1 dan kotakKu2 telah diinisialisasi oleh konstruktor Kotak() ketika kedua objek itu diciptakan. Karena konstruktor memberikan nilai sama untuk setiap dimensi, 10 dikali 10 dikali 10, baik kotakKu1 dan kotakKu2 akan memiliki volume yang sama. Statemen println() di dalam Kotak() hanya untuk menampilkan nilai volume. Kebanyakan konstruktor tidak menampilkan apapun.

Sebelum melanjutkan, Anda perlu mengamati operator new. Seperti Anda ketahui, ketika Anda mengalokasikan sebuah objek, Anda menggunakan bentuk umum berikut:

var-kelas = new namakelas();

Sekarang Anda dapat memahami mengapa kurung diperlukan setelah nama kelas. Apa yang sebenarnya terjadi adalah bahwa konstruktor untuk kelas tersebut sedang dipanggil. Jadi, baris kode

Kotak kotakKu1 = new Kotak();

new Kotak() sedang memanggil konstruktor Kotak(). Ketika Anda tidak secara eksplisit mendefinisikan sebuah konstruktor untuk kelas, maka Java menciptakan konstruktor default untuk kelas itu. Konstruktor default secara otomatis menginisialisasi semua variabel kelas menjadi nilai defaultnya, yaitu nol, null, dan false untuk tipe numerik, tipe referensi, dan tipe boolean.


Konstruktor Terparameterisasi
Ketika konstruktor Kotak() pada contoh sebelumnya memang menginisialisasi objek Kotak, hal itu tidak terlalu berguna karena semua kotak memiliki dimensi yang sama. Apa yang diperlukan adalah sebuah cara untuk menciptakan objek-objek Kotak dengan dimensi-dimensi berbeda. Solusi mudahnya adalah dengan menambahkan parameter pada konstruktor. Sebagai contoh, versi berikut dari kelas Kotak mendefinisikan sebuah konstruktor berparameter yang menetapkan dimensi-dimensi dari sebuah kotak seperti ditetapkan oleh parameter-parameter konstruktor. Perhatikan bagaimana objek-objek Kotak diciptakan.

//program ini menggunakan konstruktor terparameterisasi untuk menginisialisasi objek
class Kotak {
   double lebar;
   double tinggi;
   double dalam;
   
   //Ini konstruktor untuk kelas Kotak
   Kotak(double w, double h, double d) {
      lebar = w;
      tinggi = h;
      dalam = d;
   }
   
   // menampilkan volume kotak
   double volume() {
      return lebar*tinggi*dalam;
   }
}

public class DemoKotak7 {
   public static void main(String args[]) {
      /* mendeklarasikan, mengalokasikan dan menginisialisasi
         objek-objek Kotak */
      Kotak kotakKu1 = new Kotak(10, 20, 15);
      Kotak kotakKu2 = new Kotak(3, 6, 9);
   
      double vol;
   
      // Menghitung volume kotak pertama
      vol=kotakKu1.volume();
      System.out.println("Volume Kotak 1 = " + vol);
  
      // Menghitung volume kotak kedua
      vol = kotakKu2.volume();
      System.out.println("Volume Kotak 2 = " + vol);
   }
}

Jika dijalankan, keluaran program ini adalah:

Volume Kotak 1 = 3000.0
Volume Kotak 2 = 162.0

Seperti yang dapat Anda lihat, setiap objek diinisialisasi seperti yang ditetapkan pada parameter-parameter pada konstruktornya. Sebagai contoh, pada baris kode berikut:

Kotak kotakKu1 = new Kotak(10, 20, 15);

Nilai 10, 20, dan 15 dilewatkan kepada konstruktor Kotak() ketika operator new menciptakan objek. Jadi, salinan dari lebar, tinggi, dan dalam dari objek kotakKu1 akan memuat nilai 10, 20, dan 15.


Katakunci this
Adakalanya sebuah metode perlu mengakses objek yang memanggilnya. Untuk melakukannya, Java mendefinisikan katakunci this. Katakunci ini dapat dipakai di dalam sembarang metode yang ingin mengakses objek yang memanggilnya. Jadi, this merupakan sebuah referensi ke objek yang memanggil metode tersebut.

Untuk lebih memahami apa guna this ini, perhatikan versi berikut dari Kotak():

// Penggunaan this.
Kotak(double w, double h, double d) {
   this.lebar = w;
   this.tinggi = h;
   this.dalam = d;
}

Penggunaan this bisa pula diterapkan bukan hanya pada konstruktor tetapi juga pada metode kelas, seperti berikut:

//program ini menggunakan konstruktor terparameterisasi untuk menginisialisasi objek
class Kotak {
   double lebar;
   double tinggi;
   double dalam;
   
   //Ini konstruktor untuk kelas Kotak menggunakan this
   Kotak(double w, double h, double d) {
      this.lebar = w;
      this.tinggi = h;
      this.dalam = d;
   }
   
   // menampilkan volume kotak menggunakan this
   double volume() {
      return this.lebar*this.tinggi*this.dalam;
   }
}

public class DemoKotak8 {
   public static void main(String args[]) {
   /* mendeklarasikan, mengalokasikan dan menginisialisasi
   objek-objek Kotak */
      Kotak kotakKu1 = new Kotak(10, 20, 15);
      Kotak kotakKu2 = new Kotak(3, 6, 9);
   
   double vol;
   
      // Menghitung volume kotak pertama
      vol=kotakKu1.volume();
      System.out.println("Volume Kotak 1 = " + vol);
  
      // Menghitung volume kotak kedua
      vol = kotakKu2.volume();
      System.out.println("Volume Kotak 2 = " + vol);
   }
}


Kelas Tumpukan
Meskipun kelas Kotak berguna untuk mengilustrasikan elemen-elemen dasar dari sebuah kelas, kelas itu memiliki nilai praktis yang kecil. Untuk menunjukkan kekuatan sesungguhnya dari kelas, bab ini akan memberikan contoh yang lebih kompleks. Seperti yang Anda ingat tentang pemrograman berorientasi-objek (PBO) yang telah didiskusikan pada Bab 1, salah satu keuntungan yang paling penting dari PBO adalah enkapsulasi data dan kode yang memanipulasi data tersebut. Seperti yang telah Anda lihat, Anda sedang menciptakan sebuah tipe data baru yang mendefinisikan baik data yang sedang dimanipulasi maupun metode yang dipakai untuk memanipulasinya. Jadi, Anda dapat menggunakan kelas melalui metode-metodenya tanpa perlu khawatir tentang detil implementasi kelas atau tentang bagaimana data sebenarnya ditangani di dalam kelas.

Untuk mempraktekkan konsep ini lebih jauh lagi, Anda akan mempelajari contoh enkapsulasi pada tumpukan. Tumpukan menyimpan data dengan pengurutan FILO (first-in last-out). Jadi, tumpukan seperti layaknya tumpukan piring di meja. Piring pertama yang diletakkan di meja akan menjadi piring terakhir yang akan diambil. Tumpukan dikendalikan melalui dua operasi, yang dinamakan dengan push dan pop. Untuk menempatkan sebuah item di atas tumpukan, Anda akan menggunakan push. Untuk mengambil sebuah item dari tumpukan, Anda menggunakan pop. Seperti yang akan Anda lihat, adalah cukup mudah untuk mengenkapsulasi mekanisme tumpukan ini.

Berikut adalah sebuah kelas dengan nama Tumpukan yang mengimplementasikan sebuah tumpukan sampai dengan sepuluh integer:

// Kelas ini mendefinisikan sebuah tumpukan integer yang dapat memuat 10 integer
class Tumpukan {
   int tumpuk[] = new int[10];
   int nitem;

   // Menginisialisasi tumpukan
   Tumpukan() {
    nitem = -1;
   }

   // Menempatkan item ke atas tumpukan
   void push(int item) {
      if(nitem==9)
         System.out.println("Tumpukan penuh.");
      else
       tumpuk[++nitem] = item;
   }
   
   // Mengambil item dari tumpukan
   int pop() {
      if(nitem < 0) {
         System.out.println("Tumpukan kosong.");
         return 0;
      }
      else
         return tumpuk[nitem--];
   }
}

Seperti yang dapat Anda lihat, kelas Tumpukan mendefinisikan dua data dan tiga metode. Tumpukan integer dimuat oleh array tumpuk. Array ini diindeks oleh variabel nitem, yang selalu memuat indeks dari atas tumpukan. Konstruktor Tumpukan() menginsialisasi nitem dengan -1, yang mengindikasikan bahwa tumpukan dalam kondisi kosong. Metode push() menempatkan sebuah item ke atas tumpukan. Untuk mengambil sebuah item, diperlukan metode pop().

Kelas UjiTumpukan, yang ditunjukkan di sini, mendemonstrasikan kelas Tumpukan. Kelas ini menciptakan dua tumpukan integer, menempatkan sejumlah nilai ke atas tiap tumpukan, dan kemudian mengambil nilai-nilai tersebut dari tumpukan-tumpukan tersebut:

public class UjiTumpukan {
   public static void main(String args[]) {
      Tumpukan tumpukan1 = new Tumpukan();
      Tumpukan tumpukan2 = new Tumpukan();
  
      // menempatkan sejumlah nilai ke atas tumpukan
      for(int i=0; i<10; i++) tumpukan1.push(i);
      for(int i=10; i<20; i++) tumpukan2.push(i);
  
      // mengambil nilai-nilai dari tumpukan
      System.out.println("Tumpukan pada tumpukan1:");
      for(int i=0; i<10; i++)
         System.out.println(tumpukan1.pop());
  
      System.out.println("Tumpukan pada tumpukan2:");
      for(int i=0; i<10; i++)
         System.out.println(tumpukan2.pop());
   }
}

Program ini menghasilkan keluaran berikut:

Tumpukan pada tumpukan1:
9
8
7
6
5
4
3
2
1
0
Tumpukan pada tumpukan2:
19
18
17
16
15
14
13
12
11
10



No comments: