Maklumat am tentang pembina
Конструктор
ialah struktur yang serupa dengan kaedah, yang tujuannya adalah untuk mencipta contoh kelas. Ciri-ciri pereka:
- Nama pembina mesti sepadan dengan nama kelas (mengikut konvensyen, huruf pertama ditulis dengan huruf besar, biasanya kata nama);
- Terdapat pembina dalam mana-mana kelas. Walaupun anda tidak menulis satu, pengkompil Java akan mencipta pembina lalai, yang akan kosong dan tidak melakukan apa-apa selain memanggil pembina superclass.
- Pembina adalah serupa dengan kaedah, tetapi ia bukan kaedah, ia tidak dianggap sebagai ahli kelas. Oleh itu, ia tidak boleh diwarisi atau ditindih dalam subkelas;
- Pembina tidak diwarisi;
- Terdapat beberapa pembina dalam kelas. Dalam kes ini, pembina dikatakan terlebih beban;
- Jika kelas tidak mentakrifkan pembina, pengkompil secara automatik menambah pembina tanpa parameter kepada kod;
- Pembina tidak mempunyai jenis pulangan; ia tidak boleh menjadi jenis
void
; jika jenis dikembalikan void
, maka ia bukan lagi pembina tetapi kaedah, walaupun kebetulan dengan nama kelas.
- Operator dibenarkan dalam constructor
return
, tetapi hanya kosong, tanpa sebarang nilai pulangan;
- Pembina membenarkan penggunaan pengubah suai akses; anda boleh menetapkan salah satu pengubah suai:
public
, protected
, private
atau tanpa pengubah suai.
- Pembina tidak boleh mempunyai pengubah suai
abstract
, final
, native
, static
atau synchronized
;
- Kata kunci
this
merujuk kepada pembina lain dalam kelas yang sama. Jika digunakan, panggilan kepadanya mestilah baris pertama pembina;
- Kata kunci
super
memanggil pembina kelas induk. Jika digunakan, rujukan kepadanya mestilah baris pertama pembina;
- Jika pembina tidak membuat panggilan kepada
super
pembina kelas nenek moyang (dengan atau tanpa argumen), pengkompil secara automatik menambah kod untuk memanggil pembina kelas nenek moyang tanpa hujah;
Pembina lalai
Terdapat pembina dalam mana-mana kelas. Walaupun anda tidak menulis satu, pengkompil Java akan mencipta pembina lalai. Pembina ini kosong dan tidak melakukan apa-apa selain memanggil pembina superclass. Itu. jika anda menulis:
public class Example {}
maka ini bersamaan dengan menulis:
public class Example
{
Example()
{
super;
}
}
Dalam kes ini, kelas leluhur tidak dinyatakan secara eksplisit, dan secara lalai, semua kelas Java mewarisi kelas,
Object
jadi pembina kelas dipanggil
Object
. Jika kelas mentakrifkan pembina dengan parameter, tetapi tidak ada pembina terlebih beban tanpa parameter, maka memanggil pembina tanpa parameter adalah ralat. Walau bagaimanapun, dalam Java sejak versi 1.5, adalah mungkin untuk menggunakan pembina dengan argumen panjang berubah-ubah. Dan jika terdapat pembina yang mempunyai hujah panjang berubah-ubah, maka memanggil pembina lalai tidak akan menjadi ralat. Ia tidak akan berlaku kerana hujah panjang boleh ubah boleh kosong. Sebagai contoh, contoh berikut tidak akan dikompil, tetapi jika anda menyahkomen pembina dengan hujah panjang boleh ubah, ia akan menyusun dan berjalan dengan jayanya dan menghasilkan baris kod berjalan
DefaultDemo dd = new DefaultDemo()
; pembina akan dipanggil
DefaultDemo(int ... v)
. Sememangnya, dalam kes ini adalah perlu untuk menggunakan JSDK 1.5. Fail
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 pembina tidak dikomen:
DefaultDemo(int ...)
Walau bagaimanapun, dalam kes biasa di mana kelas tidak mentakrifkan mana-mana pembina sama sekali, memanggil pembina lalai (tanpa parameter) akan diperlukan, kerana penggantian pembina lalai berlaku secara automatik.
Penciptaan objek dan pembina
Apabila mencipta objek, tindakan berikut dilakukan secara berurutan:
- Kelas objek dicari antara kelas yang telah digunakan dalam program. Jika ia tidak ada, maka ia dicari dalam semua katalog dan perpustakaan yang tersedia untuk program. Setelah kelas ditemui dalam direktori atau perpustakaan, medan statik kelas dibuat dan dimulakan. Itu. Untuk setiap kelas, medan statik dimulakan sekali sahaja.
- Memori diperuntukkan untuk objek.
- Medan kelas sedang dimulakan.
- Pembina kelas melaksanakan.
- Pautan ke objek yang dicipta dan dimulakan terbentuk. Rujukan ini ialah nilai ungkapan yang mencipta objek. Objek juga boleh dibuat dengan memanggil kaedah
newInstance()
kelas java.lang.Class
. Dalam kes ini, pembina tanpa senarai parameter digunakan.
Pembina yang berlebihan
Pembina kelas yang sama boleh mempunyai nama yang sama dan tandatangan yang berbeza. Sifat ini dipanggil gabungan atau lebihan beban. Jika kelas mempunyai berbilang pembina, maka beban lebih pembina hadir.
Pembina Berparameter
Tandatangan pembina ialah bilangan dan jenis parameter, serta urutan jenisnya dalam senarai parameter pembina. Jenis pulangan tidak diambil kira. Pembina tidak mengembalikan sebarang parameter. Pernyataan ini menerangkan, dalam erti kata lain, bagaimana Java membezakan antara pembina atau kaedah yang terlebih beban. Java membezakan kaedah terlebih beban bukan dengan jenis pemulangannya, tetapi dengan bilangan, jenis, dan urutan jenis parameter input. Pembina tidak boleh memulangkan type
void
, jika tidak ia akan bertukar menjadi kaedah biasa, walaupun ia serupa dengan nama kelas. Contoh berikut menunjukkan ini. Fail
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();
}
}
Akibatnya, program akan mengeluarkan:
Constructor
Ini sekali lagi membuktikan bahawa pembina adalah kaedah tanpa parameter pulangan. Walau bagaimanapun, pembina boleh diberikan satu daripada tiga pengubah
public
, ,
private
atau
protected
. Dan contoh sekarang akan kelihatan 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();
}
}
Ia dibenarkan untuk menulis operator dalam constructor
return
, tetapi hanya satu kosong, tanpa sebarang nilai pulangan. Fail
ReturnDemo.java
class ReturnDemo
{
public ReturnDemo()
{
System.out.println("Constructor");
return;
}
public static void main(String s[])
{
ReturnDemo r = new ReturnDemo();
}
}
Pembina diparameterkan dengan argumen panjang boleh ubah
Java SDK 1.5 memperkenalkan alat yang telah lama ditunggu-tunggu - hujah pembolehubah panjang untuk pembina dan kaedah. Sebelum ini, bilangan dokumen yang berubah-ubah telah diproses dalam dua cara yang menyusahkan. Yang pertama daripada mereka direka untuk memastikan bilangan maksimum hujah dihadkan kepada bilangan yang kecil dan diketahui terlebih dahulu. Dalam kes ini, adalah mungkin untuk mencipta versi lebihan kaedah, satu untuk setiap versi senarai argumen yang dihantar kepada kaedah. Kaedah kedua direka untuk sesuatu yang tidak diketahui terlebih dahulu dan sejumlah besar hujah. Dalam kes ini, hujah diletakkan dalam tatasusunan, dan tatasusunan ini dihantar kepada kaedah. Argumen panjang pemboleh ubah paling kerap terlibat dalam manipulasi berikutnya dengan permulaan pembolehubah. Adalah mudah untuk menggantikan ketiadaan beberapa hujah pembina atau kaedah yang dijangkakan dengan nilai lalai. Argumen panjang boleh ubah ialah tatasusunan, dan dianggap sebagai tatasusunan. Sebagai contoh, pembina untuk kelas
Checking
dengan bilangan argumen yang berubah-ubah akan kelihatan seperti ini:
class Checking
{
public Checking(int ... n)
{
}
}
Gabungan aksara ... memberitahu pengkompil bahawa bilangan pembolehubah argumen akan digunakan dan argumen ini akan disimpan dalam tatasusunan yang nilai rujukannya terkandung dalam pembolehubah n. Pembina boleh dipanggil dengan bilangan argumen yang berbeza, termasuk tiada hujah sama sekali. Argumen diletakkan secara automatik dalam tatasusunan dan melalui n. Jika tiada argumen, panjang tatasusunan ialah 0. Senarai parameter, bersama-sama dengan argumen panjang berubah-ubah, juga boleh termasuk parameter mandatori. Dalam kes ini, parameter yang mengandungi bilangan pembolehubah argumen mestilah yang terakhir dalam senarai parameter. Sebagai contoh:
class Checking
{
public Checking(String s, int ... n)
{
}
}
Had yang sangat jelas melibatkan bilangan parameter panjang berubah-ubah. Mesti ada hanya satu parameter panjang ubah dalam senarai parameter. Memandangkan dua parameter panjang berubah-ubah, adalah mustahil untuk pengkompil menentukan di mana satu parameter berakhir dan yang lain bermula. Sebagai contoh:
class Checking
{
public Checking(String s, int ... n, double ... d)
{
}
}
Fail
Checking.java
Sebagai contoh, terdapat peralatan yang mampu mengecam plat lesen kereta dan mengingati nombor petak kawasan yang dilawati oleh setiap kereta pada siang hari. Ia adalah perlu untuk memilih daripada jumlah jisim kereta yang direkodkan yang pada siang hari melawat dua petak yang diberikan, katakan 22 dan 15, mengikut peta kawasan. Adalah wajar bahawa kereta boleh melawat banyak dataran pada siang hari, atau mungkin hanya satu. Jelas sekali, bilangan petak yang dilawati dihadkan oleh kelajuan fizikal kereta. Mari kita buat program kecil di mana pembina kelas akan mengambil sebagai hujah nombor kereta sebagai parameter wajib dan bilangan petak yang dilawati bagi kawasan itu, yang bilangannya boleh berubah-ubah. Pembina akan menyemak sama ada kereta telah muncul dalam dua petak; jika ada, maka paparkan nombornya pada skrin.
Menghantar parameter kepada pembina
Terdapat dua jenis parameter dalam bahasa pengaturcaraan:
- jenis asas (primitif);
- rujukan kepada objek.
Istilah panggilan mengikut nilai bermakna pembina menerima nilai yang dihantar kepadanya oleh modul panggilan. Sebaliknya, panggilan melalui rujukan bermakna pembina menerima alamat pembolehubah daripada pemanggil. Java menggunakan panggilan mengikut nilai sahaja. Mengikut nilai parameter dan mengikut nilai pautan parameter. Java tidak menggunakan panggilan melalui rujukan untuk objek (walaupun ramai pengaturcara dan pengarang beberapa buku mendakwa ini). Apabila menghantar objek ke Java, parameter dihantar
bukan melalui rujukan , tetapi
dengan nilai rujukan objek ! Dalam kedua-dua kes, pembina menerima salinan nilai semua parameter. Pembina tidak boleh lakukan dengan parameter inputnya:
- pembina tidak boleh mengubah nilai parameter input jenis utama (primitif);
- pembina tidak boleh menukar rujukan parameter input;
- pembina tidak boleh menetapkan semula rujukan parameter input kepada objek baharu.
Pembina boleh lakukan dengan parameter inputnya:
- menukar keadaan objek yang diluluskan sebagai parameter input.
Contoh berikut membuktikan bahawa dalam Java, parameter input kepada pembina diluluskan oleh nilai rujukan objek. Contoh ini juga menggambarkan bahawa pembina tidak boleh menukar rujukan parameter input, tetapi sebenarnya menukar rujukan salinan parameter input. Fail
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 program ialah:
name1=Alice
name2=Mary
Jika Java menggunakan panggilan dengan rujukan untuk menghantar objek sebagai parameter, pembina akan menukar
name1
dan dalam contoh ini
name2
. Pembina sebenarnya tidak akan menukar rujukan objek yang disimpan dalam
name1
dan pembolehubah
name2
. Ini menunjukkan bahawa parameter pembina dimulakan dengan salinan rujukan ini. Kemudian pembina menukar salinan. Apabila pembina menyelesaikan kerjanya, pembolehubah x dan y dimusnahkan, dan pembolehubah asal
name1
terus
name2
merujuk kepada objek sebelumnya.
Menukar parameter yang dihantar kepada pembina.
Pembina tidak boleh mengubah suai parameter yang diluluskan bagi jenis asas. Walau bagaimanapun, pembina boleh mengubah suai keadaan objek yang diluluskan sebagai parameter. Sebagai contoh, pertimbangkan program berikut: Fail
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 program ialah:
x=3000
value=1000
Jelas sekali, kaedah ini tidak akan mengubah parameter jenis utama. Oleh itu, selepas memanggil pembina, nilai pembolehubah
value
kekal sama dengan
1000
. Pada asasnya tiga perkara berlaku:
- Pembolehubah
x
dimulakan dengan salinan nilai parameter value
(iaitu, nombor 1000
).
- Nilai pembolehubah
x
adalah tiga kali ganda - ia kini bersamaan dengan 3000
. Walau bagaimanapun, nilai pembolehubah value
kekal sama dengan 1000
.
- Pembina ditamatkan dan pembolehubah
x
tidak lagi digunakan.
Dalam contoh berikut, gaji pekerja berjaya dinaikkan tiga kali ganda kerana nilai rujukan objek diluluskan sebagai parameter kepada kaedah. Fail
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 program ialah:
s1.value=3000
s2.value=1000
Nilai rujukan objek digunakan sebagai parameter. Apabila melaksanakan baris
Salary2 s2 = new Salary2(s1)
; pembina
Salary2(Salary x)
akan memberikan nilai rujukan kepada objek berubah
s1
, dan pembina akan meningkatkan tiga kali ganda gaji secara berkesan untuk
s1.value
, memandangkan salinan
(Salary x)
yang dibuat di dalam pembina menunjuk kepada objek berubah
s1
.
Pembina diparameterkan oleh primitif.
Jika parameter pembina terlebih beban menggunakan primitif yang boleh disempitkan (contohnya
int <- double
), maka memanggil kaedah dengan nilai yang disempitkan adalah mungkin, walaupun pada hakikatnya tidak ada kaedah yang terlebih beban dengan parameter sedemikian. Contohnya: Fail
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 program ialah:
d=30.0
Walaupun kelas
Primitive
tidak mempunyai pembina yang mempunyai parameter jenis
int
, pembina dengan parameter input akan berfungsi
double
. Sebelum memanggil pembina, pembolehubah
i
akan dikembangkan dari jenis
int
ke jenis
double
. Pilihan yang bertentangan, apabila pembolehubah
i
akan jenis
double
, dan pembina hanya akan mempunyai parameter
int
, dalam keadaan ini akan membawa kepada ralat kompilasi.
Panggilan dan pengendali pembinanew
Pembina sentiasa dipanggil oleh operator
new
. Apabila pembina dipanggil dengan operator
new
, pembina sentiasa menjana rujukan kepada objek baharu. Adalah mustahil untuk memaksa pembina untuk membentuk rujukan kepada objek yang sudah sedia ada dan bukannya rujukan kepada objek baru, kecuali dengan menggantikan objek yang dinyahsiri. Dan dengan pengendali baharu, bukannya rujukan kepada objek baharu, adalah mustahil untuk membentuk rujukan kepada objek yang sudah sedia ada. Contohnya: Fail
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 program ialah:
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 dicipta. Seterusnya, jika menggunakan baris
Salary3 s2 = new Salary3(s1)
; atau rentetan
Salary3 s3 = new Salary3(s1)
; adalah mungkin untuk membuat pautan ke objek yang sedia ada, kemudian
s1.value s2.value
mereka
s3.value
akan menyimpan nilai yang sama
1000
. Sebenarnya dalam talian
Salary3 s2 = new Salary3(s1)
; objek baru untuk pembolehubah akan dibuat
s2
dan keadaan objek untuk pembolehubah akan berubah
s1
dengan menghantar nilai rujukannya kepada objek dalam parameter pembina. Ini boleh disahkan oleh hasil keluaran. Dan apabila melaksanakan baris
Salary3 s3 = new Salary3(s1)
; objek BARU untuk pembolehubah akan dicipta
s3
dan keadaan objek untuk pembolehubah akan berubah semula
s1
.
Pembina dan blok permulaan, urutan tindakan apabila memanggil pembina
Bahagian
Mencipta Objek dan Pembina menyenaraikan tindakan umum yang dilakukan semasa mencipta objek. Antaranya ialah proses memulakan medan kelas dan menyusun pembina kelas, yang seterusnya juga mempunyai susunan dalaman:
- Semua medan data dimulakan kepada nilai lalainya (0, palsu atau nol).
- Semua pemula medan dan blok pemulaan dilaksanakan mengikut susunan yang disenaraikan dalam perisytiharan kelas.
- Jika pembina lain dipanggil pada baris pertama pembina, maka pembina yang dipanggil dilaksanakan.
- Badan pembina dilaksanakan.
Pembina berkaitan dengan permulaan kerana di Jawa terdapat tiga cara untuk memulakan medan dalam kelas:
- tetapkan nilai dalam pengisytiharan;
- tetapkan nilai dalam blok permulaan;
- tetapkan nilainya dalam pembina.
Sememangnya, anda perlu menyusun kod permulaan supaya mudah difahami. 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);
}
}
Dalam contoh di atas, pembolehubah dimulakan dalam susunan berikut: pembolehubah statik dimulakan dahulu
x
dengan
y
nilai lalai. Seterusnya, blok permulaan statik dilaksanakan. Kemudian pembolehubah dimulakan
i
kepada nilai lalai dan pembolehubah dimulakan
z
. Seterusnya, pereka mula bekerja. Memanggil pembina kelas tidak seharusnya bergantung pada susunan medan diisytiharkan. Ini boleh membawa kepada ralat.
Pembina dan warisan
Pembina tidak diwarisi. Sebagai contoh:
public class Example
{
Example()
{
}
public void sayHi()
{
system.out.println("Hi");
}
}
public class SubClass extends Example
{
}
Kelas
SubClass
secara automatik mewarisi kaedah
sayHi()
yang ditakrifkan dalam kelas induk. Pada masa yang sama, pembina
Example()
kelas induk tidak diwarisi oleh keturunannya
SubClass
.
Kata kunci this
dalam pembina
Pembina digunakan
this
untuk merujuk kepada pembina lain dalam kelas yang sama, tetapi dengan senarai parameter yang berbeza. Jika pembina menggunakan kata kunci
this
, maka ia mesti berada pada baris pertama; mengabaikan peraturan ini akan mengakibatkan ralat pengkompil. Contohnya: Fail
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 program ialah:
Mary
John
Dalam contoh ini terdapat dua pembina. Yang pertama menerima hujah rentetan. Yang kedua tidak menerima sebarang hujah, ia hanya memanggil pembina pertama menggunakan nama lalai "John". Oleh itu, anda boleh menggunakan pembina untuk memulakan nilai medan secara eksplisit dan secara lalai, yang selalunya diperlukan dalam program.
Kata kunci super
dalam pembina
Pembina digunakan
super
untuk memanggil pembina superclass. Jika pembina menggunakan
super
, maka panggilan ini mesti berada pada baris pertama, jika tidak, pengkompil akan membuang ralat. Di bawah ialah contoh: Fail
SuperClassDemo.java
public class SuperClassDemo
{
SuperClassDemo()
{
}
}
class Child extends SuperClassDemo
{
Child()
{
super();
}
}
Dalam contoh mudah ini, pembina
Child()
mengandungi panggilan
super()
yang mencipta instance class
SuperClassDemo
, sebagai tambahan kepada class
Child
. Kerana
super
ia mestilah pernyataan pertama yang dilaksanakan dalam pembina subkelas, pesanan ini sentiasa sama dan tidak bergantung pada sama ada
super()
. Jika ia tidak digunakan, maka pembina lalai (tiada parameter) setiap superclass, bermula dengan kelas asas, akan dilaksanakan terlebih dahulu. Program berikut menunjukkan apabila pembina dilaksanakan. Fail
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();
}
}
Output daripada program ini:
Inside A constructor.
Inside B constructor.
Inside C constructor.
Pembina dipanggil mengikut susunan subordinasi kelas. Ini masuk akal. Memandangkan superclass tidak mempunyai pengetahuan tentang mana-mana subkelas, sebarang permulaan yang perlu dilakukan adalah berasingan. Jika boleh, ia harus mendahului sebarang permulaan yang dilakukan oleh subkelas. Sebab tu kena buat dulu.
Pembina yang boleh disesuaikan
Mekanisme pengenalpastian jenis masa jalan ialah salah satu prinsip teras yang berkuasa bagi bahasa Java yang melaksanakan polimorfisme. Walau bagaimanapun, mekanisme sedemikian tidak melindungi pembangun daripada pemutus jenis yang tidak serasi dalam beberapa kes. Kes yang paling biasa ialah manipulasi sekumpulan objek, pelbagai jenis yang tidak diketahui terlebih dahulu dan ditentukan pada masa berjalan. Memandangkan ralat yang dikaitkan dengan ketidakserasian jenis hanya boleh muncul pada peringkat masa jalan, ini menjadikannya sukar untuk dicari dan dihapuskan. Pengenalan jenis tersuai dalam Java 2 5.0 mengalihkan beberapa ralat ini daripada masa jalan ke masa menyusun dan menyediakan beberapa keselamatan jenis yang hilang. Tidak ada keperluan untuk tuangan jenis eksplisit apabila bergerak dari jenis
Object
kepada jenis konkrit. Perlu diingat bahawa alat penyesuaian jenis berfungsi hanya dengan objek dan tidak digunakan pada jenis data primitif yang terletak di luar pepohon warisan kelas. Dengan jenis tersuai, semua lakonan dilakukan secara automatik dan di belakang tabir. Ini membolehkan anda melindungi daripada ketidakpadanan jenis dan menggunakan semula kod dengan lebih kerap. Jenis tersuai boleh digunakan dalam pembina. Pembina boleh diperibadikan walaupun kelas mereka bukan jenis tersuai. Sebagai contoh:
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();
}
}
Oleh kerana pembina
GenConstructor
menentukan parameter jenis tersuai yang mesti merupakan kelas terbitan daripada class
Number
, ia boleh dipanggil dari mana-mana
GO TO FULL VERSION