Informasi umum tentang konstruktor
Конструктор
adalah struktur yang mirip dengan metode, yang tujuannya adalah untuk membuat turunan kelas. Ciri-ciri seorang desainer:
- Nama konstruktor harus sesuai dengan nama kelas (menurut konvensi, huruf pertama menggunakan huruf kapital, biasanya kata benda);
- Ada konstruktor di kelas mana pun. Bahkan jika Anda tidak menulisnya, kompiler Java akan membuat konstruktor default, yang akan kosong dan tidak melakukan apa pun selain memanggil konstruktor superkelas.
- Konstruktor mirip dengan metode, tetapi konstruktor bukanlah suatu metode, bahkan tidak dianggap sebagai anggota kelas. Oleh karena itu, ia tidak dapat diwariskan atau ditimpa dalam suatu subkelas;
- Konstruktor tidak diwariskan;
- Mungkin ada beberapa konstruktor dalam satu kelas. Dalam hal ini, konstruktor dikatakan kelebihan beban;
- Jika suatu kelas tidak mendefinisikan konstruktor, kompiler secara otomatis menambahkan konstruktor tanpa parameter ke kode;
- Konstruktor tidak memiliki tipe pengembalian; ia bahkan tidak bisa menjadi tipe
void
; jika suatu tipe dikembalikan void
, maka ia bukan lagi konstruktor melainkan sebuah metode, meskipun kebetulan dengan nama kelasnya.
- Operator diperbolehkan di konstruktor
return
, tetapi hanya kosong, tanpa nilai kembalian apa pun;
- Konstruktor mengizinkan penggunaan pengubah akses; Anda dapat menyetel salah satu pengubah:
public
, protected
, private
atau tanpa pengubah.
- Konstruktor tidak boleh memiliki pengubah
abstract
, final
, native
, static
atau synchronized
;
- Kata kunci
this
mengacu pada konstruktor lain di kelas yang sama. Jika digunakan, panggilan ke sana harus berupa baris pertama konstruktor;
- Kata kunci
super
memanggil konstruktor kelas induk. Jika digunakan, referensinya harus berupa baris pertama konstruktor;
- Jika konstruktor tidak melakukan panggilan ke
super
konstruktor kelas leluhur (dengan atau tanpa argumen), kompiler secara otomatis menambahkan kode untuk memanggil konstruktor kelas leluhur tanpa argumen;
Konstruktor bawaan
Ada konstruktor di kelas mana pun. Bahkan jika Anda tidak menulisnya, kompiler Java akan membuat konstruktor default. Konstruktor ini kosong dan tidak melakukan apa pun selain memanggil konstruktor superkelas. Itu. jika Anda menulis:
public class Example {}
maka ini setara dengan menulis:
public class Example
{
Example()
{
super;
}
}
Dalam hal ini, kelas leluhur tidak ditentukan secara eksplisit, dan secara default, semua kelas Java mewarisi kelas tersebut,
Object
sehingga konstruktor kelas disebut
Object
. Jika suatu kelas mendefinisikan konstruktor dengan parameter, tetapi tidak ada konstruktor yang kelebihan beban tanpa parameter, maka memanggil konstruktor tanpa parameter adalah sebuah kesalahan. Namun, di Java sejak versi 1.5, dimungkinkan untuk menggunakan konstruktor dengan argumen panjang variabel. Dan jika ada konstruktor yang memiliki argumen panjang variabel, maka memanggil konstruktor default tidak akan menjadi kesalahan. Itu tidak akan terjadi karena argumen panjang variabel boleh kosong. Misalnya, contoh berikut tidak akan dikompilasi, tetapi jika Anda menghapus komentar pada konstruktor dengan argumen panjang variabel, maka akan dikompilasi dan dijalankan dengan sukses dan menghasilkan sebaris kode yang berjalan
DefaultDemo dd = new DefaultDemo()
; konstruktor akan dipanggil
DefaultDemo(int ... v)
. Wajar saja dalam hal ini perlu menggunakan JSDK 1.5. Mengajukan
DefaultDemo.java
class DefaultDemo
{
DefaultDemo(String s)
{
System.out.print("DefaultDemo(String)");
}
public static void main(String args[])
{
DefaultDemo dd = new DefaultDemo();
}
}
Hasil keluaran program dengan konstruktor tidak diberi komentar:
DefaultDemo(int ...)
Namun, dalam kasus umum di mana kelas tidak mendefinisikan konstruktor sama sekali, pemanggilan konstruktor default (tanpa parameter) akan diperlukan, karena substitusi konstruktor default terjadi secara otomatis.
Pembuatan objek dan konstruktor
Saat membuat objek, tindakan berikut dilakukan secara berurutan:
- Kelas objek dicari di antara kelas-kelas yang sudah digunakan dalam program. Jika tidak ada, maka dicari di semua katalog dan perpustakaan yang tersedia untuk program tersebut. Setelah kelas ditemukan di direktori atau perpustakaan, bidang statis kelas tersebut dibuat dan diinisialisasi. Itu. Untuk setiap kelas, bidang statis diinisialisasi hanya sekali.
- Memori dialokasikan untuk objek.
- Bidang kelas sedang diinisialisasi.
- Konstruktor kelas dijalankan.
- Tautan ke objek yang dibuat dan diinisialisasi terbentuk. Referensi ini adalah nilai ekspresi yang menciptakan objek. Sebuah objek juga dapat dibuat dengan memanggil metode
newInstance()
kelas java.lang.Class
. Dalam hal ini, konstruktor tanpa daftar parameter digunakan.
Konstruktor kelebihan beban
Konstruktor dari kelas yang sama dapat memiliki nama yang sama dan tanda tangan yang berbeda. Properti ini disebut kombinasi atau kelebihan beban. Jika suatu kelas memiliki banyak konstruktor, maka terjadi kelebihan beban konstruktor.
Konstruktor Berparameter
Tanda tangan konstruktor adalah jumlah dan tipe parameter, serta urutan tipenya dalam daftar parameter konstruktor. Jenis pengembalian tidak diperhitungkan. Konstruktor tidak mengembalikan parameter apa pun. Pernyataan ini menjelaskan, dalam arti tertentu, bagaimana Java membedakan antara konstruktor atau metode yang kelebihan beban. Java membedakan metode yang kelebihan beban bukan berdasarkan tipe pengembaliannya, tetapi berdasarkan jumlah, tipe, dan urutan tipe parameter input. Konstruktor bahkan tidak dapat mengembalikan suatu tipe
void
, jika tidak maka akan berubah menjadi metode biasa, meskipun mirip dengan nama kelasnya. Contoh berikut menunjukkan hal ini. Mengajukan
VoidDemo.java
class VoidDemo
{
VoidDemo()
{
System.out.println("Constructor");
}
void VoidDemo()
{
System.out.println("Method");
}
public static void main(String s[])
{
VoidDemo m = new VoidDemo();
}
}
Hasilnya, program akan menampilkan:
Constructor
Ini sekali lagi membuktikan bahwa konstruktor adalah metode tanpa parameter kembalian. Namun, konstruktor dapat diberikan salah satu dari tiga pengubah
public
, ,
private
atau
protected
. Dan contohnya sekarang akan terlihat seperti ini: File
VoidDemo2.java
class VoidDemo2
{
public VoidDemo2()
{
System.out.println("Constructor");
}
private void VoidDemo2()
{
System.out.println("Method");
}
public static void main(String s[])
{
VoidDemo2 m = new VoidDemo2();
}
}
Diperbolehkan menulis operator dalam konstruktor
return
, tetapi hanya operator kosong, tanpa nilai balik apa pun. Mengajukan
ReturnDemo.java
class ReturnDemo
{
public ReturnDemo()
{
System.out.println("Constructor");
return;
}
public static void main(String s[])
{
ReturnDemo r = new ReturnDemo();
}
}
Konstruktor diparameterisasi dengan argumen panjang variabel
Java SDK 1.5 memperkenalkan alat yang telah lama ditunggu-tunggu - argumen dengan panjang variabel untuk konstruktor dan metode. Sebelumnya, sejumlah dokumen diproses dengan dua cara yang tidak nyaman. Yang pertama dirancang untuk memastikan bahwa jumlah maksimum argumen dibatasi pada sejumlah kecil dan diketahui sebelumnya. Dalam hal ini, dimungkinkan untuk membuat versi metode yang kelebihan beban, satu versi untuk setiap versi daftar argumen yang diteruskan ke metode tersebut. Metode kedua dirancang untuk sesuatu yang tidak diketahui sebelumnya dan sejumlah besar argumen. Dalam hal ini, argumen ditempatkan dalam sebuah array, dan array ini diteruskan ke metode. Argumen panjang variabel paling sering terlibat dalam manipulasi selanjutnya dengan inisialisasi variabel. Akan lebih mudah untuk mengganti tidak adanya beberapa konstruktor atau argumen metode yang diharapkan dengan nilai default. Argumen panjang variabel adalah array, dan diperlakukan sebagai array. Misalnya, konstruktor untuk kelas
Checking
dengan sejumlah argumen yang bervariasi akan terlihat seperti ini:
class Checking
{
public Checking(int ... n)
{
}
}
Kombinasi karakter ... memberi tahu kompiler bahwa sejumlah variabel argumen akan digunakan, dan argumen ini akan disimpan dalam array yang nilai referensinya terkandung dalam variabel n. Konstruktor dapat dipanggil dengan sejumlah argumen berbeda, termasuk tanpa argumen sama sekali. Argumen secara otomatis ditempatkan dalam array dan melewati n. Jika tidak ada argumen, panjang array adalah 0. Daftar parameter, bersama dengan argumen panjang variabel, juga dapat menyertakan parameter wajib. Dalam hal ini, parameter yang berisi sejumlah variabel argumen harus menjadi yang terakhir dalam daftar parameter. Misalnya:
class Checking
{
public Checking(String s, int ... n)
{
}
}
Batasan yang sangat jelas berkaitan dengan jumlah parameter panjang variabel. Hanya boleh ada satu parameter panjang variabel dalam daftar parameter. Dengan adanya dua parameter panjang variabel, kompiler tidak mungkin menentukan di mana satu parameter berakhir dan parameter lainnya dimulai. Misalnya:
class Checking
{
public Checking(String s, int ... n, double ... d)
{
}
}
File
Checking.java
Misalnya, terdapat peralatan yang mampu mengenali pelat nomor mobil dan mengingat jumlah kuadrat area yang dikunjungi setiap mobil pada siang hari. Penting untuk memilih dari total massa mobil yang tercatat yang pada siang hari mengunjungi dua kotak tertentu, katakanlah 22 dan 15, menurut peta area. Wajar jika sebuah mobil dapat mengunjungi banyak alun-alun pada siang hari, atau mungkin hanya satu. Jelasnya, jumlah kotak yang dikunjungi dibatasi oleh kecepatan fisik mobil. Mari kita buat program kecil di mana konstruktor kelas akan menggunakan nomor mobil sebagai parameter wajib dan jumlah kuadrat area yang dikunjungi, yang jumlahnya dapat bervariasi. Konstruktor akan memeriksa apakah sebuah mobil telah muncul dalam dua kotak; jika sudah, maka tampilkan nomornya di layar.
Melewati parameter ke konstruktor
Pada dasarnya ada dua jenis parameter dalam bahasa pemrograman:
- tipe dasar (primitif);
- referensi ke objek.
Istilah panggilan berdasarkan nilai berarti bahwa konstruktor menerima nilai yang diteruskan kepadanya oleh modul pemanggil. Sebaliknya, panggilan dengan referensi berarti konstruktor menerima alamat variabel dari pemanggil. Java hanya menggunakan panggilan berdasarkan nilai. Berdasarkan nilai parameter dan nilai tautan parameter. Java tidak menggunakan panggilan dengan referensi untuk objek (walaupun banyak pemrogram dan penulis beberapa buku menyatakan hal ini). Saat meneruskan objek ke Java, parameter diteruskan
bukan berdasarkan referensi , tetapi
berdasarkan nilai referensi objek ! Dalam kedua kasus tersebut, konstruktor menerima salinan nilai semua parameter. Konstruktor tidak dapat melakukan parameter masukannya:
- konstruktor tidak dapat mengubah nilai parameter input tipe utama (primitif);
- konstruktor tidak dapat mengubah referensi parameter masukan;
- konstruktor tidak dapat menetapkan ulang referensi parameter masukan ke objek baru.
Konstruktor dapat melakukan parameter masukannya:
- mengubah keadaan objek yang diteruskan sebagai parameter input.
Contoh berikut membuktikan bahwa di Java, parameter input ke konstruktor diteruskan berdasarkan nilai referensi objek. Contoh ini juga mencerminkan bahwa konstruktor tidak dapat mengubah referensi parameter masukan, tetapi sebenarnya mengubah referensi salinan parameter masukan. Mengajukan
Empoyee.java
class Employee
{
Employee(String x, String y)
{
String temp = x;
x = y;
y = temp;
}
public static void main(String args[])
{
String name1 = new String("Alice");
String name2 = new String("Mary");
Employee a = new Employee(name1, name2);
System.out.println("name1="+name1);
System.out.println("name2="+name2);
}
}
Output dari program ini adalah:
name1=Alice
name2=Mary
Jika Java menggunakan panggilan dengan referensi untuk meneruskan objek sebagai parameter, konstruktor akan bertukar
name1
dan dalam contoh ini
name2
. Konstruktor tidak akan menukar referensi objek yang disimpan dalam variabel
name1
dan
name2
. Hal ini menunjukkan bahwa parameter konstruktor diinisialisasi dengan salinan referensi ini. Kemudian konstruktor menukar salinannya. Ketika konstruktor menyelesaikan pekerjaannya, variabel x dan y dimusnahkan, dan variabel asli
name1
terus
name2
merujuk ke objek sebelumnya.
Mengubah parameter yang diteruskan ke konstruktor.
Konstruktor tidak dapat mengubah parameter tipe dasar yang diteruskan. Namun, konstruktor dapat mengubah keadaan objek yang diteruskan sebagai parameter. Misalnya, perhatikan program berikut: File
Salary1.java
class Salary1
{
Salary1(int x)
{
x = x * 3;
System.out.println("x="+x);
}
public static void main(String args[])
{
int value = 1000;
Salary1 s1 = new Salary1(value);
System.out.println("value="+value);
}
}
Output dari program ini adalah:
x=3000
value=1000
Jelasnya, metode ini tidak akan mengubah parameter tipe utama. Oleh karena itu, setelah memanggil konstruktor, nilai variabel
value
tetap sama dengan
1000
. Pada dasarnya tiga hal terjadi:
- Variabel
x
diinisialisasi dengan salinan nilai parameter value
(yaitu angka 1000
).
- Nilai variabelnya
x
menjadi tiga kali lipat - sekarang sama dengan 3000
. Namun nilai variabelnya value
tetap sama 1000
.
- Konstruktor berakhir dan variabel
x
tidak lagi digunakan.
Pada contoh berikut, gaji karyawan berhasil ditingkatkan tiga kali lipat karena nilai referensi objek diteruskan sebagai parameter ke metode. Mengajukan
Salary2.java
class Salary2
{
int value = 1000;
Salary2()
{
}
Salary2(Salary2 x)
{
x.value = x.value * 3;
}
public static void main(String args[])
{
Salary2 s1 = new Salary2();
Salary2 s2 = new Salary2(s1);
System.out.println("s1.value=" +s1.value);
System.out.println("s2.value="+s2.value);
}
}
Output dari program ini adalah:
s1.value=3000
s2.value=1000
Nilai referensi objek digunakan sebagai parameter. Saat menjalankan baris
Salary2 s2 = new Salary2(s1)
; konstruktor
Salary2(Salary x)
akan meneruskan nilai referensi ke variabel object
s1
, dan konstruktor akan secara efektif melipatgandakan gaji for
s1.value
, karena bahkan salinan
(Salary x)
yang dibuat di dalam konstruktor menunjuk ke variabel object
s1
.
Konstruktor diparameterisasi oleh primitif.
Jika parameter konstruktor yang kelebihan beban menggunakan primitif yang dapat dipersempit (misalnya
int <- double
), maka pemanggilan metode dengan nilai yang dipersempit dimungkinkan, meskipun faktanya tidak ada metode yang kelebihan beban dengan parameter seperti itu. Misalnya: Berkas
Primitive.java
class Primitive
{
Primitive(double d)
{
d = d + 10;
System.out.println("d="+d);
}
public static void main(String args[])
{
int i = 20;
Primitive s1 = new Primitive(i);
}
}
Output dari program ini adalah:
d=30.0
Meskipun kelas tersebut
Primitive
tidak memiliki konstruktor yang memiliki parameter tipe
int
, konstruktor dengan parameter masukan akan berfungsi
double
. Sebelum memanggil konstruktor, variabel
i
akan diperluas dari tipe
int
ke tipe
double
. Pilihan sebaliknya, ketika variabel
i
bertipe
double
, dan konstruktor hanya memiliki parameter
int
, dalam situasi ini akan menyebabkan kesalahan kompilasi.
Panggilan konstruktor dan operatornew
Konstruktor selalu dipanggil oleh operator
new
. Ketika konstruktor dipanggil dengan operator
new
, konstruktor selalu menghasilkan referensi ke objek baru. Tidak mungkin memaksa konstruktor untuk membentuk referensi ke objek yang sudah ada alih-alih referensi ke objek baru, kecuali dengan mengganti objek yang sedang dideserialisasi. Dan dengan operator baru, alih-alih referensi ke objek baru, tidak mungkin membuat referensi ke objek yang sudah ada. Misalnya: Berkas
Salary3.java
class Salary3
{
int value = 1000;
Salary3()
{
}
Salary3(Salary3 x)
{
x.value = x.value * 3;
}
public static void main(String args[])
{
Salary3 s1 = new Salary3();
System.out.println("First object creation: "+s1.value);
Salary3 s2 = new Salary3(s1);
System.out.println("Second object creation: "+s2.value);
System.out.println("What's happend with first object?:"+s1.value);
Salary3 s3 = new Salary3(s1);
System.out.println("Third object creation: "+s3.value);
System.out.println("What's happend with first object?:"+s1.value);
}
}
Output dari program ini adalah:
First object creation: 1000
Second object creation: 1000
What's happend with first object?: 3000
Third object creation: 1000
What's happend with first object?: 9000
Pertama, menggunakan baris
Salary3 s1 = new Salary3()
; objek baru dibuat. Selanjutnya jika menggunakan baris
Salary3 s2 = new Salary3(s1)
; atau string
Salary3 s3 = new Salary3(s1)
; dimungkinkan untuk membuat tautan ke objek yang sudah ada, lalu
s1.value s2.value
objek tersebut
s3.value
akan menyimpan nilai yang sama
1000
. Sebenarnya di baris
Salary3 s2 = new Salary3(s1)
; objek baru untuk variabel akan dibuat
s2
dan status objek untuk variabel akan diubah
s1
dengan meneruskan nilai referensinya ke objek di parameter konstruktor. Hal ini dapat dibuktikan dengan hasil keluarannya. Dan saat menjalankan baris
Salary3 s3 = new Salary3(s1)
; objek BARU untuk variabel akan dibuat
s3
dan keadaan objek untuk variabel akan berubah lagi
s1
.
Konstruktor dan blok inisialisasi, urutan tindakan saat memanggil konstruktor
Bagian
Membuat Objek dan Konstruktor mencantumkan tindakan umum yang dilakukan saat membuat objek. Diantaranya adalah proses inisialisasi bidang kelas dan pengerjaan konstruktor kelas, yang pada gilirannya juga memiliki tatanan internal:
- Semua bidang data diinisialisasi ke nilai defaultnya (0, false, atau null).
- Semua inisialisasi bidang dan blok inisialisasi dijalankan sesuai urutan yang tercantum dalam deklarasi kelas.
- Jika konstruktor lain dipanggil pada baris pertama konstruktor, maka konstruktor yang dipanggil akan dieksekusi.
- Tubuh konstruktor dieksekusi.
Konstruktor berhubungan dengan inisialisasi karena di Java ada tiga cara untuk menginisialisasi field di kelas:
- menetapkan nilai dalam deklarasi;
- menetapkan nilai di blok inisialisasi;
- tetapkan nilainya di konstruktor.
Tentu saja, Anda perlu mengatur kode inisialisasi agar mudah dimengerti. Kelas berikut diberikan sebagai contoh:
class Initialization
{
int i;
short z = 10;
static int x;
static float y;
static
{
x = 2000;
y = 3.141;
}
Initialization()
{
System.out.println("i="+i);
System.out.println("z="+z);
z = 20;
System.out.println("z="+z);
}
}
Pada contoh di atas, variabel diinisialisasi dengan urutan sebagai berikut: variabel statis diinisialisasi terlebih dahulu
x
dengan
y
nilai default. Selanjutnya, blok inisialisasi statis dijalankan. Kemudian variabel diinisialisasi
i
ke nilai default dan variabel diinisialisasi
z
. Selanjutnya, desainer mulai bekerja. Memanggil konstruktor kelas tidak boleh bergantung pada urutan deklarasi bidang. Hal ini dapat menyebabkan kesalahan.
Konstruktor dan warisan
Konstruktor tidak diwariskan. Misalnya:
public class Example
{
Example()
{
}
public void sayHi()
{
system.out.println("Hi");
}
}
public class SubClass extends Example
{
}
Kelas
SubClass
secara otomatis mewarisi metode
sayHi()
yang ditentukan di kelas induk. Pada saat yang sama, konstruktor
Example()
kelas induk tidak diwarisi oleh turunannya
SubClass
.
Kata kunci this
dalam konstruktor
Konstruktor digunakan
this
untuk merujuk ke konstruktor lain di kelas yang sama, namun dengan daftar parameter yang berbeda. Jika konstruktor menggunakan kata kunci
this
, maka kata kunci tersebut harus berada di baris pertama; mengabaikan aturan ini akan mengakibatkan kesalahan kompiler. Misalnya: Berkas
ThisDemo.java
public class ThisDemo
{
String name;
ThisDemo(String s)
{
name = s;
System.out.println(name);
}
ThisDemo()
{
this("John");
}
public static void main(String args[])
{
ThisDemo td1 = new ThisDemo("Mary");
ThisDemo td2 = new ThisDemo();
}
}
Output dari program ini adalah:
Mary
John
Dalam contoh ini ada dua konstruktor. Yang pertama menerima argumen string. Yang kedua tidak menerima argumen apa pun, ia hanya memanggil konstruktor pertama menggunakan nama default "John". Dengan demikian, Anda dapat menggunakan konstruktor untuk menginisialisasi nilai bidang secara eksplisit dan default, yang sering kali diperlukan dalam program.
Kata kunci super
dalam konstruktor
Konstruktor digunakan
super
untuk memanggil konstruktor superclass. Jika konstruktor menggunakan
super
, maka panggilan ini harus berada di baris pertama, jika tidak, kompiler akan menimbulkan kesalahan. Di bawah ini contohnya: File
SuperClassDemo.java
public class SuperClassDemo
{
SuperClassDemo()
{
}
}
class Child extends SuperClassDemo
{
Child()
{
super();
}
}
Dalam contoh sederhana ini, konstruktor
Child()
berisi panggilan
super()
yang membuat turunan kelas
SuperClassDemo
, selain kelas
Child
. Karena
super
ini harus menjadi pernyataan pertama yang dieksekusi dalam konstruktor subkelas, urutan ini selalu sama dan tidak bergantung pada apakah
super()
. Jika tidak digunakan, maka konstruktor default (tanpa parameter) setiap superclass, dimulai dari kelas dasar, akan dieksekusi terlebih dahulu. Program berikut menunjukkan kapan konstruktor dieksekusi. Mengajukan
Call.java
class A
{
A()
{
System.out.println("Inside A constructor.");
}
}
class B extends A
{
B()
{
System.out.println("Inside B constructor.");
}
}
class C extends B
{
C()
{
System.out.println("Inside C constructor.");
}
}
class Call
{
public static void main(String args[])
{
C c = new C();
}
}
Keluaran dari program ini:
Inside A constructor.
Inside B constructor.
Inside C constructor.
Konstruktor dipanggil dalam urutan subordinasi kelas. Ini masuk akal. Karena superkelas tidak memiliki pengetahuan tentang subkelas mana pun, inisialisasi apa pun yang perlu dilakukannya bersifat terpisah. Jika memungkinkan, ini harus mendahului inisialisasi apa pun yang dilakukan oleh subkelas. Makanya sebaiknya dilakukan dulu.
Konstruktor yang dapat disesuaikan
Mekanisme identifikasi tipe run-time adalah salah satu prinsip inti bahasa Java yang kuat yang mengimplementasikan polimorfisme. Namun, mekanisme seperti itu tidak melindungi pengembang dari tipe casting yang tidak kompatibel dalam beberapa kasus. Kasus yang paling umum adalah manipulasi sekelompok objek, yang berbagai jenisnya tidak diketahui sebelumnya dan ditentukan pada saat run time. Karena kesalahan yang terkait dengan ketidakcocokan tipe hanya dapat muncul pada tahap runtime, hal ini membuat kesalahan tersebut sulit ditemukan dan dihilangkan. Pengenalan tipe khusus di Java 2 5.0 memindahkan beberapa kesalahan ini dari waktu proses ke waktu kompilasi dan menyediakan beberapa keamanan tipe yang hilang. Tidak diperlukan pengecoran tipe eksplisit ketika berpindah dari tipe
Object
ke tipe beton. Perlu diingat bahwa alat penyesuaian tipe hanya berfungsi dengan objek dan tidak berlaku untuk tipe data primitif yang berada di luar pohon pewarisan kelas. Dengan tipe khusus, semua pemeran dilakukan secara otomatis dan di belakang layar. Hal ini memungkinkan Anda melindungi terhadap ketidakcocokan tipe dan menggunakan kembali kode lebih sering. Tipe khusus dapat digunakan di konstruktor. Konstruktor dapat dikustomisasi meskipun kelasnya bukan tipe khusus. Misalnya:
class GenConstructor
{
private double val;
<T extends Number> GenConstructor(T arg)
{
val = arg.doubleValue();
}
void printValue()
{
System.out.println("val: "+val);
}
}
class GenConstructorDemo
{
public static void main(String args[])
{
GenConstructor gc1 = new GenConstructor(100);
GenConstructor gc2 = new GenConstructor(123.5F);
gc1.printValue();
gc2.printValue();
}
}
Karena konstruktor
GenConstructor
menentukan parameter tipe khusus yang harus merupakan kelas turunan dari class
Number
, maka dapat dipanggil dari mana saja
GO TO FULL VERSION