JavaRush /Java Blog /Random-ID /Konstruktor kelas. Jawa JDK 1.5
articles
Level 15

Konstruktor kelas. Jawa JDK 1.5

Dipublikasikan di grup Random-ID
Konstruktor kelas.  Jawa JDK 1.5 - 1

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, privateatau tanpa pengubah.
  • Konstruktor tidak boleh memiliki pengubah abstract, final, native, staticatau synchronized;
  • Kata kunci thismengacu pada konstruktor lain di kelas yang sama. Jika digunakan, panggilan ke sana harus berupa baris pertama konstruktor;
  • Kata kunci supermemanggil konstruktor kelas induk. Jika digunakan, referensinya harus berupa baris pertama konstruktor;
  • Jika konstruktor tidak melakukan panggilan ke superkonstruktor 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, Objectsehingga 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. MengajukanDefaultDemo.java
class DefaultDemo
{
 DefaultDemo(String s)
 {
  System.out.print("DefaultDemo(String)");
 }
 /*
 DefaultDemo(int ... v)
 {
  System.out.println("DefaultDemo(int ...)");
 }
 */

 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. MengajukanVoidDemo.java
class VoidDemo
{
 /**
  * Это конструктор
  */
 VoidDemo()
 {
  System.out.println("Constructor");
 }

 /**
  * А это уже обычный метод, даже не смотря на сходство с
  * именем класса, поскольку имеется возвращаемый тип void
  */
 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, , privateatau protected. Dan contohnya sekarang akan terlihat seperti ini: FileVoidDemo2.java
class VoidDemo2
{
 /**
  * Это конструктор
  */
 public VoidDemo2()
 {
  System.out.println("Constructor");
 }

 /**
  * А это уже обычный метод, даже не смотря на сходство с
  * именем класса, поскольку имеется возвращаемый тип void
  */
 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. MengajukanReturnDemo.java
class ReturnDemo
{
 /**
  * В конструкторе допускается использование оператора
  * return без параметров.
  */
 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 Checkingdengan 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. MengajukanEmpoyee.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 name1dan dalam contoh ini name2. Konstruktor tidak akan menukar referensi objek yang disimpan dalam variabel name1dan 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 name1terus name2merujuk 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: FileSalary1.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 valuetetap sama dengan 1000. Pada dasarnya tiga hal terjadi:
  1. Variabel xdiinisialisasi dengan salinan nilai parameter value(yaitu angka 1000).
  2. Nilai variabelnya xmenjadi tiga kali lipat - sekarang sama dengan 3000. Namun nilai variabelnya valuetetap sama 1000.
  3. Konstruktor berakhir dan variabel xtidak lagi digunakan.
Pada contoh berikut, gaji karyawan berhasil ditingkatkan tiga kali lipat karena nilai referensi objek diteruskan sebagai parameter ke metode. MengajukanSalary2.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: BerkasPrimitive.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 Primitivetidak memiliki konstruktor yang memiliki parameter tipe int, konstruktor dengan parameter masukan akan berfungsi double. Sebelum memanggil konstruktor, variabel iakan diperluas dari tipe intke tipe double. Pilihan sebaliknya, ketika variabel ibertipe 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: BerkasSalary3.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.valueobjek tersebut s3.valueakan menyimpan nilai yang sama 1000. Sebenarnya di baris Salary3 s2 = new Salary3(s1); objek baru untuk variabel akan dibuat s2dan status objek untuk variabel akan diubah s1dengan 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 s3dan 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:
  1. Semua bidang data diinisialisasi ke nilai defaultnya (0, false, atau null).
  2. Semua inisialisasi bidang dan blok inisialisasi dijalankan sesuai urutan yang tercantum dalam deklarasi kelas.
  3. Jika konstruktor lain dipanggil pada baris pertama konstruktor, maka konstruktor yang dipanggil akan dieksekusi.
  4. 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 xdengan ynilai default. Selanjutnya, blok inisialisasi statis dijalankan. Kemudian variabel diinisialisasi ike 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 SubClasssecara otomatis mewarisi metode sayHi()yang ditentukan di kelas induk. Pada saat yang sama, konstruktor Example()kelas induk tidak diwarisi oleh turunannya SubClass.

Kata kunci thisdalam konstruktor

Konstruktor digunakan thisuntuk 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: BerkasThisDemo.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 superdalam konstruktor

Konstruktor digunakan superuntuk 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: FileSuperClassDemo.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 superini 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. MengajukanCall.java
//Создать суперкласс A
class A
{
 A()
 {
  System.out.println("Inside A constructor.");
 }
}

//Создать подкласс B, расширяющий класс A
class B extends A
{
 B()
 {
  System.out.println("Inside B constructor.");
 }
}

//Создать класс (C), расширяющий класс В
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 Objectke 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 GenConstructormenentukan parameter tipe khusus yang harus merupakan kelas turunan dari class Number, maka dapat dipanggil dari mana saja
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION