Thursday, March 29, 2018

7. Kelas Java Tingkat Lanjut Bagian Dua



Penggunaan katakunci this sebenarnya opsional. Jika Anda tidak mencantumkannya secara eksplisit, maka kompilator akan menyisipkannya untuk Anda. Sebagai contoh, jika Anda menuliskan:

class Contoh {
   public void m1( ) {
   ...
   }

   public void m2( ) {
      m1();
   }
}

maka kompilator akan menginterpretasikan definisi di atas sebagai:

class Contoh {
   public void m1( ) {
   ...
   }

   public void m2( ) {
      this.m1();
   }
}

Inilah alasan mengapa Anda memanggil sebuah metode dari metode lain pada kelas yang sama tanpa menggunakan notasi atau operasi dot.

Metode untuk ketiga operasi aritmatika lain didefinisikan dengan cara yang sama:

public Pecahan bagi(Pecahan pecah) {
   int a, b, c, d;
   Pecahan sisa;

   a = this.getNumerator();
   b = this.getDenominator();

   c = pecah.getNumerator();
   d = pecah.getDenominator();

   sisa = new Pecahan(a*d, b*c);

   return sisa;
}

public Pecahan kali(Pecahan pecah) {
   int a, b, c, d;
   Pecahan hasil;

   a = this.getNumerator();
   b = this.getDenominator();

   c = pecah.getNumerator();
   d = pecah.getDenominator();

   hasil = new Pecahan(a*c, b*d);

   return hasil;
}

public Pecahan kurang(Pecahan pecah) {
   int a, b, c, d;
   Pecahan selisih;

   a = this.getNumerator();
   b = this.getDenominator();

   c = pecah.getNumerator();
   d = pecah.getDenominator();

   selisih = new Pecahan(a*d  b*c, b*d);

   return selisih;
}

Anda bisa saja mendefinisikan empat metode aritmatika sebagai metode void, tidak menghasilkan nilai balik berupa objek Pecahan. Tetapi, dengan melakukannya, Anda tidak memiliki fleksibilitas. Karena metode yang didefinisikan adalah metode penghasil-objek, maka Anda dapat menuliskan:

f3 = f1.jumlah(f2); 

yang merefleksikan ekspresi matematik secara natural:

f3 = f1 + f2

Selain itu, karena metode jumlah() menghasilkan sebuah objek Pecahan sebagai hasil penjumlahannya, Anda bisa menuliskan statemen untuk penjumlahan jamak. Misalnya, ekspresi matematik:

f4 = f1 + f2 + f3

dapat dituliskan sebagai:

f4 = f1.jumlah(f2.jumlah(f3));

dimana penjumlahan atas f2 dan f3 dilewatkan sebagai argumen kepada metode jumlah() dari objek f1. Anda dapat pula menuliskan ekspresi tersebut dengan:

f4 = f1.jumlah(f2).jumlah(f3);

karena f1.jumlah(f2) mereferensi ke sebuah objek Pecahan tak-bernama, dan Anda bisa memanggil metode jumlah() dari objek tak-bernama ini dengan objek f3 sebagai argumennya.

Anda bisa menguji keempat operasi aritmatika tersebut dengan cara berikut:

//Menguji kelas Pecahan untuk keempat operasi aritmatika
public class UjiPecahan3 {
   public static void main(String args[]) {
      Pecahan f1, f2, f3;
    
      f1 = new Pecahan(1, 2);
      f2 = new Pecahan(1, 4);
      
      //Menguji operasi penjumlahan
      f3 = f1.jumlah(f2);
   
      System.out.println("Penjumlahan atas " + f1.toString() + " dan " +
    f2.toString() + " adalah " + f3.toString());
      
      //Menguji operasi perkalian
      f3 = f1.kali(f2);
   
      System.out.println("Perkalian atas " + f1.toString() + " dan " +
    f2.toString() + " adalah " + f3.toString());

      //Menguji operasi pembagian
      f3 = f1.bagi(f2);
   
      System.out.println("Pembagian atas " + f1.toString() + " dengan " +
    f2.toString() + " adalah " + f3.toString());

      //Menguji operasi pengurangan
      f3 = f1.kurang(f2);
   
      System.out.println("Selisih " + f1.toString() + " dari " +
    f2.toString() + " adalah " + f3.toString());            
 }
}

Jika dijalankan, program di atas menghasilkan keluaran berikut:

Penjumlahan atas 1/2 dan 1/4 adalah 6/8
Perkalian atas 1/2 dan 1/4 adalah 1/8
Pembagian atas 1/2 dengan 1/4 adalah 4/2
Selisih 1/2 dari 1/4 adalah 2/8

Anda juga bisa menguji keempat operasi matematika tersebut untuk operasi-operasi jamak sebagai berikut:

//Menguji kelas Pecahan untuk keempat operasi aritmatika
public class UjiPecahan3 {
   public static void main(String args[]) {
      Pecahan f1, f2, f3, f4;
    
      f1 = new Pecahan(1, 2);
      f2 = new Pecahan(1, 4);
      f3 = new Pecahan(2, 3);
      
      //Menguji operasi penjumlahan jamak
      f4 = f1.jumlah(f2).jumlah(f3);
   
      System.out.println("Penjumlahan atas " + f1.toString() + " dan " +
    f2.toString() + " dan dijumlah lagi dengan " + f3.toString() + " dan " + 
          f4.toString());
           
      //Menguji operasi perkalian jamak
      f4 = f1.kali(f2).kali(f3);
   
      System.out.println("Perkalian atas " + f1.toString() + " dan " +
         f2.toString() + " dan dikali lagi " + f3.toString() + " dan " + f4.toString());

      //Menguji operasi pembagian
      f4 = f1.bagi(f2).bagi(f3);
   
      System.out.println("Pembagian atas " + f1.toString() + " dibagi oleh " +
         f2.toString() + " dan dibagi lagi oleh " + f3.toString() + " adalah " + 
         f4.toString());

      //Menguji operasi pengurangan jamak
      f4 = f1.kurang(f2).kurang(f3);
   
      System.out.println("Pengurangan atas " + f1.toString() + " dari " +
         f2.toString() + " dan dikurangi lagi dari " + f3.toString() + " adalah " + 
         f4.toString());           
   }
}

Jika dijalankan, program di atas menghasilkan keluaran berikut:

Penjumlahan atas 1/2 dan 1/4 dan dijumlah lagi dengan 2/3 dan 34/24
Perkalian atas 1/2 dan 1/4 dan dikali lagi 2/3 dan 2/24
Pembagian atas 1/2 dibagi oleh 1/4 dan dibagi lagi oleh 2/3 adalah 12/4
Pengurangan atas 1/2 dari 1/4 dan dikurangi lagi dari 2/3 adalah -10/24


Penggunaan Lain dari Operator this
Perhatikan deklarasi kelas berikut:

class CDMusik {
   private String artis;
   private String judul;
   private String id;

   public CDMusik(String nama1, String nama2) {
      artis = nama1;
      judul = nama2;
      id = artis.substring(0,2) + "-" + judul.substring(0,9);
   }

   ...
}

Konstruktor memiliki dua argumen String, satu untuk artis dan satu lagi untuk judul. Anggota id untuk objek CDMusik ditetapkan dua huruf pertama dari nama artis yang diikuti dengan tanda-hubung dan sembilan huruf pertama dari judul.

Sekarang, perhatikan apa yang terjadi jika Anda mencantumkan (katakanlah, secara tidak sengaja) sebuah deklarasi lokal untuk pengenal id seperti ini:

public CDMusik(String nama1, String nama2) {
   String id;
      
   artis = nama1;
   judul = nama2;

   id = artis.substring(0,2) + "-" + judul.substring(0,9);
}

Karena ada deklarasi lokal yang cocok untuk id, pengenal itu merujuk ke variabel lokal, bukan anggota data ketiga dari kelas lagi. Ketika sebuah pengenal dijumpai pada suatu metode, aturan-aturan berikut berlaku:

  1. Jika ada deklarasi variabel atau parameter yang cocok, maka pengenal merujuk ke variabel lokal atau parameter.
  2. Jika tidak ada, dan jika ada deklarasi anggota data kelas yang cocok, maka pengenal merujuk ke anggota data tersebut.
  3. Jika aturan nomor 1 dan 2 tidak terjadi, maka akan terjadi error kompilasi.

Mengapa kompilator Java tidak menangkap error semacam itu? Mengapa seseorang ingin menggunakan pengenal sama untuk anggota data kelas dan variabel lokal atau parameter lokal? Anda direkomendasikan untuk tidak melakukannya. Anda sebaiknya menggunakan pengenal berbeda untuk anggota data kelas dan untuk variabel lokal. Tetapi ada situasi dimana Anda ingin menggunakan pengenal yang sama untuk anggota data kelas dan untuk variabel lokal. Pada konstruktor CDMusik, Anda mendeklarasikan nama1 dan nama2 untuk menghindari konflik penamaan. Untuk menghindari konflik penamaan, Anda bisa memanfaatkan katakunci this sebagai berikut:

public CDMusik(String artis, String judul) {
   this.artis = artis;
   this.judul = judul;
   id = artis.substring(0,2) + "-" + judul.substring(0,9);
}

Dengan mengikuti aturan-aturan yang telah dijelaskan di atas, pengenal artis merujuk ke parameter metode. Untuk mereferensi anggota data artis dari dalam konstruktor ini, Anda mengawali pengenal artis dengan katakunci this, menggunakan notasi dot, sebagai this.artis. Pada konstruktor modifikasi tersebut, Anda tidak menggunakan katakunci this untuk mereferensi anggota data id karena itu tidak diperlukan. Penggunaannya opsional, jadi Anda bisa saja menuliskannya dengan:

this.id = artis.substring(0,2) + "-" + judul.substring(0,9);

untuk membuat kode tampak konsisten. Katakunci this dapat selalu dipakai untuk mereferensi anggota-anggota data dari objek penerima, meskipun tidak ada konflik penamaan.


SOAL DAN JAWABAN:
Tuliskan sebuah statemen tunggal dan implementasikan dalam sebuah kelas uji untuk mengekspresikan operasi pecahan berikut, menggunakan metode-metode dari kelas Pecahan:

f5 = (f1 + f2) / (f3  f4)

JAWAB:
Berikut adalah program untuk menguji ekspresi di atas:

//Menguji kelas Pecahan
public class UjiPecahan {
   public static void main(String args[]) {
      Pecahan f1, f2, f3, f4, f5;
   
      f1 = new Pecahan(1, 2);
   f2 = new Pecahan(1, 3);
   f3 = new Pecahan(2, 3);
   f4 = new Pecahan(2, 11);
   
   //Jawaban
   f5 = (f1.jumlah(f2)).bagi(f3.kurang(f4));
  
      System.out.println("f5 = (f1 + f2) / (f3 – f4)" + " = " + f5.toString());
 }
}


Jika metode jumlah() didefinisikan sebagai berikut:

public void jumlah(Pecahan pecah) {
   int a, b, c, d;

   a = this.getNumerator();   //membaca num dan denom
   b = this.getDenominator(); //dari objek penerima

   c = pecah.getNumerator();   //membaca num dan denom
   d = pecah.getDenominator(); //dari objek pecah

   setNumerator(a*d + b*c); //memperbarui num dan denom
   setDenominator(b*d);    //dari objek penerima
}

Apa yang salah dengan memanggil metode sebagai berikut?


f3 = f1.jumlah(f2);

JAWAB:
Hasil dari f1.jumlah(f2) bukanlah objek Pecahan, jadi tidak bisa ditugaskan kepada objek f3. Jika ini dilakukan, maka akan dihasilkan error kompilasi.

Berikut adalah kelas Pecahan2 dimana di dalamnya metode jumlah() didefinisikan seperti yang diberikan pada soal ini:

//Mendemonstrasikan kelas Pecahan2
class Pecahan2 {
private int numerator;
private int denominator;

// Konstruktor dua-parameter
public Pecahan2(int num, int denom) {
   setNumerator(num);
   setDenominator(denom);
}
 
// Aksesor
public int getDenominator( ) {
   return denominator;
}
 
// Aksesor
public int getNumerator( ) {
   return numerator;
}
 
// Mutator
public void setDenominator(int denom) {
   if (denom == 0) {
      //Error fatal
      System.err.println("Error Fatal");
      System.exit(1);
   }
  
   denominator = denom;
}
  
// Mutator
public void setNumerator(int num) {
   numerator = num;
}
  
public String toString( ) {
   return getNumerator() + "/" + getDenominator();
}

public void jumlah(Pecahan2 pecah) {
    int a, b, c, d;

    a = this.getNumerator();   //membaca num dan denom
    b = this.getDenominator(); //dari objek penerima

    c = pecah.getNumerator();   //membaca num dan denom
    d = pecah.getDenominator(); //dari objek pecah

    setNumerator(a*d + b*c); //memperbarui num dan denom
    setDenominator(b*d);    //dari objek penerima
 }
}

Dengan definisi metode jumlah() seperti di atas, operasi penjumlahan pecahan dapat dilakukan seperti berikut:

//Menguji kelas Pecahan2
public class UjiPecahan2 {
   public static void main(String args[]) {
      Pecahan2 f1, f2, f3;
      int pemb, peny;
 
      f1 = new Pecahan2(1, 7);
      f2 = new Pecahan2(2, 3);
   
   //Dalam soal, error terjadi karena
      //jumlah() tidak menghasilkan nilai balik
      //berupa sebuah objek Pecahan
      //f3 = f1.jumlah(f2);
      
      //Jadi, yang dilakukan adalah memanggil metode jumlah() dari objek f1
      //dengan objek f2 sebagai argumennya. Hasil penjumlahan tersimpan
      //pada anggota data numerator dan denominator dari objek f1
      f1.jumlah(f2);
      
      //Sekarang, objek f1 menyimpan hasil penjumlahan tersebut dengan pembuktian ini
      pemb = f1.getNumerator();
      peny = f1.getDenominator();
      System.out.println("Pembilang dari f1" + " = " + pemb);
      System.out.println("Penyebut dari f1" + " = " + peny);
      
     //Untuk memberikan anggota data objek dari f1 kepada f3
     f3 = f1; 
     
     System.out.println("Pembilang dari f3" + " = " + f3.getNumerator());
     System.out.println("Penyebut dari f3" + " = " + f3.getDenominator());
 }
}


Tuliskanlah statemen-statemen untuk menugaskan penjumlahan atas pecahan f1 dan f2 kepada pecahan f3, menggunakan metode jumlah() yang didefinisikan pada nomor 2.

JAWAB:

f1.jumlah(f2);
//Cara kedua menugaskan anggota data f1 kepada f3 adalah:
f3.setDenominator(f1.getDenominator());
f3.setNumerator(f1.getNumerator());
     
System.out.println("Pembilang dari f3" + " = " + f3.getNumerator());
System.out.println("Penyebut dari f3" + " = " + f3.getDenominator());


Selanjutnya  >>>


No comments: