Penghapusan Obyek

Suatu obyek yang mengalokasi resource memori yang sudah tidak di-refer oleh siapapun akan dihapuskan sendiri oleh Java agar memori bisa direalokasi! Garbabe collection tsb. dilakukan secara background sementara proses berjalan. Jika dikehendaki maka penghapusan suatu obyek dapat dipercepat dengan memberi null pada variabel yang me-refer-nya.

Untuk obyek yang mengalokasi resource lain, penghapusan dinyatakan oleh metoda finalizer baru kemudian Java melakukan garbage collection. Contoh resource: file descriptor, socket. Note: finalizer adalah metoda obyek tanpa argumen.
Subclass dan Inheritance
Suatu kelas obyek baru yang memiliki sifat suatu kelas K yang sudah ada plus sejumlah sifat tambahan dapat didefinisikan sebagai kelas anak dari K.

Contoh: kelas LingkaranGrafis memiliki sifat-sifat kelas Lingkaran, tetapi juga memiliki metoda untuk penggambaran grafis.

“Pewarisan” sifat ini dilakukan dengan class extention (notasi extends)

Contoh TANPA Inheritance. Didefinisikan suatu kelas LingkaranGrafis yang meniru sifat-sifat Lingkaran dengan membuat obyek Lingkaran di dalamnya di tambah beberapa sifat baru.
public class LingkaranGrafis {
double x,y,r;
public lingkaran c;
public double luas(} {
return c.luas();
}
public double keliling() {
return c.keliling();
}
// variabel/metoda yang baru
public Color outline, fill;
public void gambarkan(DrawWindow dw) {
….
}
….
}

Contoh: DENGAN Inheritance.
public class LingkaranGrafis extends Lingkaran {
public Color outline, fill;
public void gambarkan(DrawWindow dw) {

}

}

Kelas Final (Final Class) adalah kelas yang tidak dapat di-inherit lagi (dpl. tidak dapat dibuat subclass-nya). Deklarasi kelas final adalah dengan menambahkan keyword final sebelum nama kelasnya.Tujuan dengan spesifikasi ini agar compiler dapat mengoptimasikan pemanggilan kelas.

Setiap kelas selalu memiliki superclass-nya kecuali kelas Object yang merupakan superclass dari setiap kelas dalam Java (termasuk Java API). Metoda-metoda kelas Object dapat dipanggil oleh setiap obyek Java. Jika suatu kelas tidak didefinisikan dengan extends maka kelas tersebut memiliki superclass langsung Object.

Suatu kelas dapat memanfaatkan konstruktor dari super class-nya dengan prefiks keyword super (mengganti nama superclass).
public class LingkaranGrafis extends Lingkaran {
public Color outline, fill;
….
Public LingkaranGrafis(double x, double y,
double r, Color outine, Color fill) {
super(x,y,r);
this.outline = outline;
this.fill = fill;
}
….
}
Pemanggilan konstruktor superclass tersebut dibatasi untuk hanya dilakukan dalam konstruktor class ybs. dan harus muncul sebagai statement pertama (setelah tanda { ). Pemanggilan tsb. bahkan diperlukan jika data yang diakses bersifat private (akan dibicarakan nanti).

Secara default saat suatu obyek diciptakan, Java akan menjalankan konstruktor-nya, serta konstruktor dari setiap superclass-nya.Urutannya adalah mulai dari konstruktor kelas obyek paling atas (Object) ke kelas obyek ybs.
Contoh: Saat obyek LingkaranGrafis diciptakan, Java menjalankan konstr. Object, lalu konstr. Lingkaran, dan baru kemudian konstr. LingkaranGrafis.
Apabila dalam kelas obyek tsb. tidak mendefinisikan konstruktor maka Java akan membuatkan konstruktor default-nya yang bersifat public. Jika pada LingkaranGrafis tidak ada konstr. maka seolah-olah Java menambahkan baris:
public LingkaranGrafis() { super(); }
Note: Tetapi jika superclass-nya juga tidak memiliki konstruktor maka akan terjadi compiler error!

Jika konstruktor didefinisikan dengan
keyword public: semua kelas lain bisa mengaksesnya
keyword protected: hanya subclass-nya yang bisa mengaksesnya
keyword private: tidak ada kelas lain yang bisa mengaksesnya
Jika tidak mau bersifat public, maka hindari konstr. default dengan mendefinisikanya!

Apakah juga hal yang terjadi pada konstruktor, terjadi pula pada finalizer? TIDAK! Apabila obyek dari suatu kelas hendak di hapuskan dengan memanggil finalizer-nya, dan jika superclass-nya juga memiliki finalizer, maka finalizer superclass ini pun harus dipanggil juga membentuk rantai perintah finalizer.

Jika terdefinisi suatu variabel dalam suatu kelas yang bernama sama dengan variabel. yang ada dalam superclass-nya, bagaimanakah hubungannya? Keduanya berbeda! Variabel tersebut disebut shadowed variable. Untuk dapat membedakannya maka perlu diberikan identitas “pemiliknya”, yaitu miliknya dengan referensi keyword this (misalnya variable x,ditulis this.x) dan milik superclass dengan referensi keyword super (misalnya variable x,ditulis super.x) atau dengan cara casting (Misalnya nama kelas superclassnya adalah Y, casting ditulis((Y) this).x).

Contoh: Jika C subclass dari B, Bsubclass dari A, x adalah var. shadowed var. x di B, dan juga var. x di A
// semua code ini dalam metoda di kelas C
x // variabel x dalam kelas C
this.x // variabel x dalam kelas C
super.x // variabel x dalam kelas B
((B) this).x // variabel x dalam kelas B
((A) this).x // variabel x dalam kelas A
// super.super.x tidak boleh digunakan
Dalam hal metoda, jika mendefinisikan ulang suatu metoda yang muncul di superclass di dalamkelasybs. maka yang terjadi adalah overriding. Perbedaannya adalah bahwa yang berlaku adalah metoda kelas dari obyek tersebut (walaupun melalui casting!).
Contoh: jika dibentuk subclass Elips dari Lingkaran maka metoda luas dan keliling dari Lingkaran perlu di-overrriding sesuai dengan sifat kelas Elips
Jika suatu etoda mendapat prefiks keyword final, maka metoda tersebut tidak dapat di-overriden (note: demikian halnya metoda static dan private tidak bisa di-overriden, mengapa?)

Jika kita menganggap bahwa suatu metoda tidak akan dioverrid lagi maka kita perlu mendefinisikannya final guna memungkinkan compiler melakukan optimisasi. Penjelasannya adalah berkaitan dengan mekanisme Dynamic Method Lookup (DML) yang dilakukan Java sebagai berikut.

Karena adanya metoda/variabel yang bisa ter-overriden dalam suatu “keluarga” (kelas + semua subclass-nya) maka interpreter-lah yang bertugas mengidentifikasi metoda yang sebenarnya (bukan compiler!) pada saat run dengan DML. Sementara suatu akses pada metoda final dilakukan secara langsung, akses metoda biasa yang dilakukan melalui DML pasti menjadi lebih lambat .

Method overriding dan variable shadowing berbeda secara konseptual, namun sintaks Java untuk memanggilnya sama. Yaitu menggunakan keyword super.
class A {
int i = 1;
int f() { return i;}
}

class B extends A {
int i;
int f() { i = super.i + 1; return super.f() + i;}
}

Sebelumnya sudah disinggung bahwa metoda finalize superclass tidak otomatis dipanggil seperti halnya pada konstruktor, jadi perlu terjadi rantai rinalizer. Namun tidak dijelaskan mengapa itu perlu dilakukan. Pendefinisian metoda finalize dalam suatu kelas di mana dalam superclass-nya sudah terdefinisi metoda finalize juga maka terjadi overriding metoda tsb.

Finalizer milik superclass harus dipanggil di baris terakhir dari metoda finalizer tsb.:
super.finalize()
baca lainya……….>>>>>

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: