Kelas A dapat memiliki referensi ke obyek dari kelas- kelas lain sebagai anggota. Kadang-kadang disebut sebagai hubungan “has-a”. Sebagai contoh, sebuah objek kelas Karyawan perlu mengetahui tanggal lahir dan tanggal mulai bekerja, sehingga perlu memasukkan dua referensi ke obyek Tanggal sebagai anggota dari objek Karyawan. Salah satu bentuk penggunaan kembali perangkat lunak (software reuse) adalah komposisi, di mana kelas memiliki referensi anggota untuk objek kelas lainnya.
Atribut (field) Statik – Juga disebut sebagai variabel kelas – Merepresentasikan informasi/data kelas secara luas – Digunakan ketika: semua objek kelas harus berbagi nilai data yang sama dari variabel instan atau variabel instan harus dapat diakses, bahkan ketika objek belum diinstansiasi – Dapat diakses melalui nama kelas atau nama objek dan operator titik (.) – Harus diberi nilai inisialisasi ketika dideklarasi, atau kompiler akan menginisialisasi dengan nilai default (0 untuk int)
Gunakan variabel statik ketika semua objek dari sebuah kelas harus mendapatkan nilai data yang sama dari variabel di saat yang sama. Variabel dan metode statik kelas dapat digunakan secara langsung, walaupun tidak ada instansiasi objek dari kelas tersebut. Pemanggilan metode statik dapat menggunakan nama kelas diikuti operator titik (.), dan hal itu menandakan bahwa metode yang dipanggil merupakan metode statik.
Metode statik tidak dapat mengakses anggota kelas non-statik, juga didalamnya tidak dapat digunakan referensi this. Sebuah kesalahan kompilasi akan terjadi ketika metode statik memanggil metode non-statik di kelas yang sama dengan hnya menggunakan nama metode. Demikian pula, kesalahan kompilasi terjadi jika metode statis mencoba untuk mengakses variabel instan di kelas yang sama dengan hanya menggunakan nama variabel.
Deklarasi import statik – Memungkinkan programmer mengimport anggota statik layaknya dideklarasikan pada kelas pemakai. – Import statik tunggal Import statik tunggal: import static namaPaket.namaKelas.namaAnggotaStatik; – import statik sesuai kebutuhan import static namaPaket.namaKelasStatik.*; import semua anggota statik dari kelas tertentu
Prinsip Pemrograman – Kode program harus dapat mengontrol bahwa hanya boleh melakukan perubahan nilai data jika memang diperlukan. Sehingga dibutuhkan layaknya variabel yang harus bernilai konstan. – Keyword final Untuk mendeklarasikan layaknya variabel yang nilai datanya tidak dapat dimodifikasi (konstan) sebagai konstanta. Variabel final dapat diinisialisasi saat dideklarasi. Jika tidak diinisialisasi ketika deklarasi, maka harus diinisialisasi di semua konstruktor.
Mendeklarasikan variabel instan final dapat membantu menegakkan prinsip dasar dalam pemrograman. Jika variabel instan memiliki nilai data yang tidak harus diubah, maka dapat dideklarasikan sebagai variabel final untuk mencegah terjadinya modifikasi.
Dalam java, dikenal 2 buah jenis memory, yaitu : 1.Stack (tempat local variable dan tumpukan method) 2.Heap (tempat instance variable dan object) Perhatikan contoh program berikut:
1. public class A { 2. B b1 = new B(); 3. String s = "halo"; 4. int i = 10; public static void main(String[] args) { 7. A a = new A(); 8. a.myMethod(); 9. } private void myMethod() { 12. System.out.println(s); 13. } 14. } 15. class B {}
Pada contoh program di atas: – Yang terletak di stack : Metode main() Metode myMethod() Variabel reference a (baris 7) – Yang terletak di heap : Variable reference b1 (baris 2) Variable reference s (baris 3) Variabel i (baris 4) Object dari kelas B (baris 2) Object String dengan nilai “halo” (baris 3) Object dari kelas A (baris 7)
Garbage Collector – Sebuah objek dialokasi di memori ketika dibuat. – JVM selalu menandai objek untuk garbage collector ketika tidak ada lagi yang mereferensi ke objek tersebut. – Garbage collector dari JVM akan mengatur memori objek diatas agar dapat digunakan yang lain.
Pembahasan garbage collector ini dibatasi hanya pada object-object non String. Garbage collector (GC) menyediakan solusi otomatis dalam pengelolaan memory. Pada kebanyakan kasus, GC membebaskan programer dari mengatur logic memory management dalam aplikasi.
Tugas utama GC adalah menyediakan free space pada heap sebanyak mungkin, tapi tidak ada jaminan bahwa di heap ada memory yang cukup untuk agar program java berjalan. Hal ini dilakukan dengan menemukan dan menghapus object pada heap yang sudah tidak direference oleh variable apapun. Kapan GC dijalankan? – Ditentukan oleh JVM. – Melalui program, programer dapat menyarankan JVM untuk menjalankan GC, tetapi yang memutuskan tetap GC. – Biasanya JVM akan menjalankan GC bila dirasa free memory sedang rendah. – Algorithma GC tidak dapat dibaca dan diubah. – Program Java masih bisa terjadi run out of memory, bila terlalu banyak objek dialokasikan di memori,meskipun ada GC.
Suatu objet layak di-dealokasi dari memori, ketika tidak ada thread yang dapat mengakses objek tersebut. 4 hal yang membuat suatu object layak didealokasi dari memori: 1.Memberikan nilai null pada variable reference. 2.Mereferensi suatu variable referensi ke objek lain. 3.Objek yang direferensi oleh variabel lokal. 4.Isolating reference.
Memberikan nilai null pada variable reference. public class GC1 { public static void main(String[] args) { Object o = new Object(); o = null; // memberi nilai null pada variabel referensi }
Mereferensi variable referensi ke objek lain. public class GC2 { public static void main(String[] args) { Object o1 = new Object(); Object o2 = new Object(); o2 = o1; // mereferensi variabel ke object lain }
Objek yang direferensi oleh variabel lokal. public class GC3 { public static void main(String[] args) { myMethod(); } public static void myMethod() { Object o = new Object(); // objek yang direferensi oleh variabel lokal o di atas // memenuhi syarat dihapus GC begitu methode ini selesai dijalankan. // do something!! }
Objek yang direferensi oleh variabel lokal. public class GC3 { public static void main(String[] args) { myMethod(); } public static void myMethod() { Object o = new Object(); // objek yang direferensi oleh variabel lokal o di atas // memenuhi syarat dihapus GC begitu methode ini selesai dijalankan. // do something!! }
Isolating reference. class X { X x; } public class GC4 { public static void main(String[] args) { X x1 = new X(); //membuat object X x2 = new X(); //membuat object // 2 statement di bawah membuat "circular reference" x1.x = x2; x2.x = x1; // 2 statement di bawah membuat dua buah object // kelas X yang dibuat diatas tidak dapat di // reference oleh thread manapun, meskupun // kedua object itu saling membuat "circular reference" x1 = null; x2 = null; }
Melalui kode program, programmer dapat meminta JVM melakukan GC. JVM akan berusaha melakukan GC, meski tidak ada jaminan akan terpenuhi. Ada 2 cara untuk meminta JVM melakukan GC, yaitu: 1.Menggunakan metode System.gc() 2.Metode gc() dari instansiasi kelas Runtime
Metode finalize – Semua kelas di Java memiliki metode finalize sebagai warisan dari kelas Object – metode finalize akan dipanggil oleh garbage collector (gc) ketika melakukan terminasi terhadap objek. – metode finalize tidak ber-parameter dan mempunyai pengembalian bertipe void.
Java menyediakan suatu mekanisme untuk menjalankan suatu kode sebelum suatu objek dihapus oleh GC. Metode tersebut adalah metode finalize yang diturunkan dari kelas Object. Karena kita tidak dapat mengantungkan pada GC untuk menghapus suatu object, maka kode yang terdapat di metode finalize tidak dijamin akan dijalankan. Metode finalize maksimal dijalankan 1 kali (yang berarti dapat tidak dijalankan)
Untuk mendefinisikan serangkaian konstanta yang direpresentasikan sebagai identifikasi unik. Tipe enum – Dideklarasikan dengan menggunakan keyword enum Daftar konstanta enum dipisahkan dengan koma Deklarasikan kelas enum dengan batasan sebagai berikut: – tipe enum secara implisit berbentuk final – konstanta enum secara implisit statik – Mencoba untuk membuat obyek dari tipe enum dengan menggunakan new akan mengakibatkan kesalahan kompilasi – Konstanta enum dapat digunakan di mana saja layaknya nilai data, seperti untuk nilai konstanta pada case dalam pernyataan switch dan dapat dipakai dalam pernyataan pengulangan for. – Konstruktor enum Sebagaimana dalam konstruktor kelas, dapat mempunyai parameter maupun di-”overload”.
ENUMERASI ( lanjutan ) Deklarasi enum sederhana adalah sbb.: Untuk mengakses suatu enum adalah sbb.: enum NamaEnum { //enumerated list namaKonstanta1, namaKonstanta2, namaKonstantaN; } NamaEnum var = NamaEnum.konstantaEnum;
Contoh ENUMERASI-1
ENUMERASI ( lanjutan ) Sebuah enum dapat diubah menjadi suatu kelas biasa dengan setiap enumerated list pada enum adalah variabel bermodifier public static final dengan tipe data kelas tersebut. Enumerasi yang dideklarasikan dalam bentuk kelas tidak dianjurkan untuk dipakai dalam implementasi program. (Hanya untuk pemberian pemahaman).
enum Diubah Menjadi class
Penggunaan KlsLampuLaluLintas
ENUMERASI ( lanjutan ) Metode statik “values” – Dibuat oleh kompilator pada setiap enum – Mengembalikan sebuah array konstanta enum dalam urutan sesuai deklarasinya Metode statik pada kelas EnumSet – Memiliki dua parameter, konstanta enum pertama sebagai nilai awal dan kedua sebagai nilai akhir – Mengembalikan sebuah EnumSet berisi konstanta dalam kisaran kedua parameter di atas, termasuk: – Nilai peningkatan (penambahan) pada pernyataan for untuk digunakan dalam iterasi melalui konstanta array EnumSet