Skip to main content

Java Classes and Objects: A Deeper Look

Pada post kali ini, kita ingin melihat lebih dalam pada pembuatan class, mengontrol akses kepada member dari sebuah class dan membuat constructors. Kita juga ingin mendiskusikan composition - sebuah kemampuan yang bisa membuat suatu kelas memiliki referensi kepada objek dari kelas-kelas lainnya sebagai member.

8.2 TIME CLASS CASE STUDY

Time1 Class Declaration

Contoh awal ini kita memiliki 2 kelas, Time1 dan Time1Test. Kelas Time1 merepresentasikan waktu hari ini. Kelas Time1Test adalah kelas aplikasi dimana main membuat satu objek kelas Time1 dan memanggil method-nya.

Fig. 8.1. Time1 class declaration maintains the time in a 24-hour format.


/**
 * // Fig. 8.1: Time.java
 * // Time1 class declaratoin maintains the time in 24-hour format.
 *
 * @author Ramadhan Arif Hardijansyah
 * @version 0.1 10 October 2020
 */
public class Time1
{
    private int hour;   // 0 - 23
    private int minute; // 0 - 59
    private int second; // 0 - 59

    /* set a new time value using universal time; ensure that the data remains consistent by setting invalid values to zero */
    public void setTime(int h, int m, int s)
    {
        hour = ((h >= 0 && h < 24)? h : 0);    // validate hour
        minute = ((m >= 0 && m < 60)? m : 0);   // validate minute
        second = ((s >= 0 && s < 60)? s : 0);   // validate second
    } // end method setTime

    // convert to String in universal-time format (HH:MM:SS)
    public String toUniversalString() {
        return String.format("%02d:%02d:%02d", hour, minute, second);
    } // end method toUniversalString

    // convert to String in standard-time format (H:MM:SS AM or PM)
    public String toString() {
        return String.format("%d:%02d:%02d %s", ((hour == 0 || hour == 12)? 12 : hour % 12), minute, second, ((hour < 12)? "AM" : "PM"));
    } // end method toString
}

Fig. 8.2. Time1 object used in an application.


/**
 * Write a description of class Time1Test here.
 *
 * @author Ramadhan Arif Hardijansyah
 * @version 0.1 11 October 2020
 */
public class Time1Test
{
    public static void main(String[] args)
    {
        // create and initialize a Time1 object
        Time1 time = new Time1(); // invokes Time1 constructor

        // output string representation of the time
        System.out.print("The initial universaltime is: ");
        System.out.println(time.toUniversalString());
        System.out.print("The initial standard time is: ");
        System.out.println(time.toString());
        System.out.println();

        // change time and output updated time
        time.setTime(13, 27, 6);
        System.out.print("Universal time after setTime is: ");
        System.out.println(times.toUniversalString());
        System.out.print("Standard time after setTime is: ");
        System.out.println(time.toString());
        System.out.println();

        // set time with invalid values; output updated time
        time.setTime(99, 99, 99);
        System.out.println("After attempting invalid settings:");
        System.out.print("Universal time: ");
        System.out.println(time.toUniversalString());
        System.out.print("Standard time: ");
        System.out.println(time.toString());
    } // end main
}

Berikut ini adalah diagram kelas Time Class Case Study dan hasil keluaran Terminal Window di BlueJ.

8.3 CONTROLLING ACCESS TO MEMBERS

Fig. 8.3 mendemonstrasikan bahwa anggota kelas private tidak bisa secara langsung diakses diluar kelas. Fungsi main pada kelas MemberAccessTest mencoba untuk mengakses secara langsung variable instance hour, minute, and second dari waktu objek Time1. Ketika program dikompilasi, kompiler menghasilkan pesan kesalahan yang menyatakan bahwa anggota private tidak dapat diakses.

Fig. 8.3. Private members of class Time1 are not accessible.

// Fig. 8.3: MemberAccessTest.java
// Private members of class Time1 are not accessible.
public class MemberAccessTest
{
    public static void main(String[] args)
    {
        Time1 time = new Time1(); // create and initialize Time1 object

        time.hour = 7;      // error: hour has private access in Time1
        time.minute = 15;   // error: minute has private access in Time1
        time.second = 30;   // error: second has private access in Time1

        time.getClass();
    } // end main
} // end class MemberAccessTest

Dan berikut ini adalah diagram kelas dan screenshot editor kelas MemberAccessTest yang menunjukkan terdapat kesalahan kompilasi.

8.4 REFERRING TO THE CURRENT OBJECT’S MEMBERS WITH THE THIS REFERENCE

Setiap objek bisa mengakses referensi ke dirinya sendiri dengan kata kunci this. Ketika metode non-static dipanggil untuk sebuah objek tertentu, metode secara implisit menggunakan kata kunci this untuk merujuk ke variable instance objek metode lainnya.

Fig. 8.4. this used implicitly and explicitly to refer to members of an object.

// Fig. 8.4: ThisTest.java
// this used implicitly and explicitly to refer to members of an object.

public class ThisTest {
    public static void main(String[] args) {
        SimpleTime time = new SimpleTime(15, 30, 19);
        System.out.println(time.buildString());
    } // end main
} // end class ThisTest

/**
 * SimpleTime
 * , this class demonstrates the "this" reference
 */
class SimpleTime {

    private int hour;       // 0-23
    private int minute;     // 0-59
    private int second;     // 0-59

    /**
     * If the constructor uses parameter names identical to instance variable names the "this" reference is required to distinguish between naems
     * @param hour
     * @param minute
     * @param second
     */
    public SimpleTime(int hour, int minute, int second) {
        this.hour = hour;       // set "this" object's hour
        this.minute = minute;   // set "this" object's minute
        this.second = second;   // set "this" object's second
    } // end SimpleTime constructor

    /**
     * use explicit and implicit "this" to call toUniversalString
     * @return String
     */
    public String buildString() {
        return String.format("%24s: %s\n%24s: %s", "this.toUniversalString()", this.toUniversalString(), "toUniversalString()", toUniversalString());
    } // end method buildString

    /**
     * convert to String in universal-time format (HH:MM:SS)
     * @return String
     */
    public String toUniversalString() {
        /*
        "this" is not required here to access instance variables, because method doesn't have local variables with the same names as instance variables
        */
        return String.format("%02d:%02d:%02d", this.hour, this.minute, this.second);
    } // end method toUniversalString
} // end class SimpleTime
Berikut ini adalah diagram kelas dan hasil keluaran Terminal Window pada BlueJ.

8.5 TIME CLASS CASE STUDY: OVERLOADED CONSTRUCTORS

Anda bisa mendeklarasikan constructor anda sendiri untuk menentukan bagaimana objek dari sebuah kelas diinisialisasi. Berikut merupakan demonstrasi sebuah kelas dengan beberapa overloaded constructor yang memungkinkan objek untuk diinisialisasi dengan cara yang berbeda. Untuk meng-overload sebuah constructor, cukup berikan beberapa deklarasi konstruktor yang berbeda dengan signature yang berbeda.

Fig. 8.5. Time2 class with overloaded constructors.

// Fig. 8.5: Time2.java
// Time2 class declaration with overloaded constructors. 

public class Time2
{ 
    private int hour;   // 0 - 23
    private int minute; // 0 - 59
    private int second; // 0 - 59 

    // Time2 no-argument constructor: initializes each instance variable
    // to zero; ensures that Time2 objects start in a consistent state
    public Time2()
    { 
        this(0, 0, 0); // invoke Time2 constructor with three arguments
    }

    // Time2 constructor: hour supplied, minute and second defaulted to 0
    public Time2(int h)
    {
        this(h, 0, 0); // invoke Time2 constructor with three arguments
    }

    // Time2 constructor: hour and minute supplied, second defaulted to 0
    public Time2(int h, int m)
    {
        this(h, m, 0); // invoke Time2 constructor with three arguments
    }

    // Time2 constructor: hour, minute, and second supplied
    public Time2(int h, int m, int s)
    {
        setTime(h, m, s); // invoke setTime to validate time
    }

    // Time2 constructor: another Time2 object supplied
    public Time2(Time2 time)
    {
        // invoke Time2 three-argument constructor
        this(time.getHour(), time.getMinute(), time.getSecond());
    }

    // Set Methods
    // set a new time value using universal time; ensure that
    // the data remains consistent by setting invalid values to zero
    public void setTime(int h, int m, int s)
    {
        setHour(h);
        setMinute(m);
        setSecond(s);
    }

    // validate and set hour
    public void setHour(int h)
    {
        hour = ((h >= 0 && h < 24)? h : 0);
    }

    // validate and set minute
    public void setMinute(int m)
    {
        minute = ((m >= 0 && m < 60)? m : 0);
    }

    // validate and set second
    public void setSecond(int s)
    {
        second = ((s >= 0 && s < 60)? s : 0);
    }

    // Get Methods
    // get hour value
    public int getHour()
    {
        return hour;
    }

    // get minute value
    public int getMinute()
    {
        return minute;
    }

    // get second value
    public int getSecond()
    {
        return second;
    }

    // convert to Sttring in universal-time format (HH:MM:SS)
    public String toUniversalString()
    {

        return String.format("%02d:%02d:%02d", getHour(), getMinute(), getSecond());
    }

    // convert to String in standard-time formatt (H:MM:SS AM or PM)
    public String toString()
    {

        return String.format("%d:%02d:%02d %s", ((getHour() == 0 || getHour() == 12)? 12 : getHour() % 12), getMinute(), getSecond(), (getHour() < 12? "AM" : "PM"));

    }
}

Fig. 8.6. Overloaded constructors used to initialize Time2 objects.

// Fig. 8.6: Time2Test.java
// Overloaded constructors used to initialize Timez objects. 

public class Time2Test 
{ 
    public static void main(String args[]) 
    {
        Time2 t1 = new Time2();             // 00:00:00
        Time2 t2 = new Time2(2);            // 02:00:00
        Time2 t3 = new Time2(21, 34);       // 21:34:00
        Time2 t4 = new Time2(12, 25, 42);   // 12:25:42
        Time2 t5 = new Time2(27, 74, 99);   // 00:00:00
        Time2 t6 = new Time2(t4);           // 12:25:42

        System.out.println("Constructed with:");
        System.out.println("t1: all arguments defaulted");
        System.out.printf("   %s\n", t1.toUniversalString());
        System.out.printf("   %s\n", t1.toString());

        System.out.println("t2: hour specified; minute and second defaulted");

        System.out.printf("   %s\n", t2.toUniversalString());
        System.out.printf("   %s\n", t2.toString());

        System.out.println("t3: hour and minute specified; second defaulted");

        System.out.printf("   %s\n", t3.toUniversalString());
        System.out.printf("   %s\n", t3.toString());

        System.out.println("t4: hour, minute and second specified");
        System.out.printf("   %s\n", t4.toUniversalString());
        System.out.printf("   %s\n", t4.toString());

        System.out.println("t5: a11 invaIid values specified");
        System.out.printf("   %s\n", t5.toUniversalString());
        System.out.printf("   %s\n", t5.toString()); 

        System.out.println("t6: Time2 object t4 specified");
        System.out.printf("   %s\n", t6.toUniversalString());
        System.out.printf("   %s\n", t6.toString());
    } // end main
} // end class Time2Test 
Berikut merupakan diagram kelas dan keluaran output dari BlueJ.

8.6 DEFAULT AND NO-ARGUMENT CONSTRUCTORS

Setiap kelas harus memiliki setidaknya satu konstruktor. Jika kelas anda mendeklarasikan konstruktor, kompiler tidak akan membuat konstruktor default. Pada kasus ini, untuk menentukan inisialisasi defaultt untuk objek kelas anda, anda harus mendeklarasikan sebuah konstruktor tanpa argumen seperti pada baris 12-15 dari Fig. 8.5. Seperti konstruktor default, konstruktor tanpa argumen dipanggil dengan tanda kurung kosong. Perhatikan bahwa konstruktor tanpa argumen Time2 secara eksplisit menginisialisasi objek Time2 dengan meneruskan ke konstruktor tiga-argumen dengan nilai 0 untuk setiap parameter. Karena nol adalah nilai default untuk variable instance int, konstruktor tanpa argumen dalam contoh ini sebenarnya dapat dideklarasikan dengan isi kosong. Dalam kasus ini, setiap variabel instance akan menerima nilai defaultnya ketika konstruktor tanpa arugmen dipanggil.

Sekian post tentang pembuatan class dan objek yang lebih dalam. Semoga bermanfaat.

Comments

Popular posts from this blog

Java Exception Handling

Postingan ini membahas sebuah program tambahan tentang exception handling . Disini seolah-olah bertindak sebagai tester. Dan program yang akan dimodifikasi adalah program SimpleCalculator . Program SimpleCalculator adalah sebuah program kalkulator sederhana yang menggunakan switch..case dalam Java. Program bisa melakukan operasi pertambahan, pengurangan, perkalian, dan pembagian. Program SimpleCalculator ini dibuat menggunakan bahasa pemrograman Java dan bisa di-compile menggunakan IDE BlueJ. Dalam aplikasi ini, dicoba untuk ditambahkan catch exception untuk mengetes bagimana pembagian suatu angka dengan angka nol. Dicari modul kelas yang merupakan operasi pembagian dan dimodifikasi agar bisa mengetes operasi pembagian dengan penyebut angka nol. Exception Handling Exception Handling adalah sebuah proses menanggapi terjadinya exception, menangani runtime error seperti ClassNotFound, IO, SQL, Remote , dsb.  Exception adalah suatu kondisi tidak normal yang membutuhkan pemrosesan khu

Website Registrasi Kuliah Tatap Muka

  Postingan berikut menjelaskan dokumentasi proses pembuatan website registrasi kuliah tatap muka. Website di-hosting menggunakan github pages yang dapat meng-host  static webpages . Link Website Catalog Product:  https://dani-ramadhan7.github.io/registrasi/index.html Langkah-Langkah Pembuatan Website Registrasi Kuliah Tatap Muka 1. Ikuti langkah-langkah pada website pembelajaran. Salah satu website yang cukup bagus untuk dipelajari adalah  belajarphp.net/tutorial-validasi-form-menggunakan-html-dan-javascript/ . Coba untuk menulis ulang contoh kode pada modul pembelajaran atau langsung memilih bagian-bagian kode yang diinginkan untuk digunakan. 2. Buat file html baru, buat page html dengan acuan modul pembelajaran. Lakukan modifikasi dan penambahan. HTML JavaScript 3. Untuk desain, digunakan file css sebagaimana yang digunakan pada website, yakni menggunakan  https://stackpath.bootstrapcdn.com/bootstrap/

Website Pendaftaran Siswa Baru

Postingan berikut menjelaskan dokumentasi website Pendaftaran Siswa Baru. Website di-hosting di local PC menggunakan XAMPP serta menggunakan MySQL untuk menangani database dari para pendaftarnya. Halaman Utama Pendaftar dapat melakukan pendaftaran pada menu Daftar Baru atau melihat list pendaftar pada bagian Pendaftar. Formulir Pendaftaran Siswa Baru Disini, siswa dapat mengisikan formulir pendaftaran dan men-submit. Menu Pendaftar Menu Pendaftar isi menyajikan tabel yang berisi siswa yang telah mendaftar. Dapat dilakukan tindakan Edit atau Hapus pada setiap baris. Formulir Edit Siswa Formulir Edit Siswa menyajikan formulir untuk mengedit data siswa yang telah mendaftar. Setelah melakukan edit, dapat menekan tombol Simpan untuk menyimpan data siswa yang telah diperbarui. Source Code Untuk source code dari website Pendaftaran Siswa Baru ini adalah sebagai berikut. Link GitHub Gist:  https://gist.github.com/dani-ramadhan7/7838e42982a0488fcc170