Memahami konstruktor

Mengatakan bahwa konstruktor adalah sebuah metode sama seperti mengatakan bahwa platipus Australia hanyalah mamalia lain. Untuk memahami platipus, penting untuk mengetahui perbedaannya dari mamalia lain. Untuk memahami konstruktor, sama pentingnya untuk memahami perbedaannya dari suatu metode. Setiap siswa di Jawa, terutama yang belajar untuk sertifikasi, perlu mengetahui perbedaan tersebut; dalam artikel ini, saya akan mengejanya secara konkret. Tabel 1, di akhir artikel ini, merangkum perbedaan konstruktor / metode utama.

Tujuan dan fungsi

Konstruktor memiliki satu tujuan dalam hidup: untuk membuat instance kelas. Ini juga bisa disebut membuat objek, seperti:

Platypus p1 = Platypus baru (); 

Sebaliknya, tujuan metode jauh lebih umum. Fungsi dasar metode adalah untuk mengeksekusi kode Java.

Perbedaan tanda tangan

Konstruktor dan metode berbeda dalam tiga aspek tanda tangan: pengubah, tipe kembalian, dan nama. Seperti metode, konstruktor dapat memiliki salah satu pengubah akses: publik, dilindungi, pribadi, atau tidak ada (sering disebut paket atau ramah ). Tidak seperti metode, konstruktor hanya dapat menggunakan pengubah akses. Oleh karena itu, konstruktor tidak bisa abstract, final, native, static, atau synchronized.

Jenis pengembalian juga sangat berbeda. Metode dapat memiliki tipe pengembalian yang valid, atau tanpa tipe pengembalian, dalam hal ini tipe pengembalian diberikan sebagai void. Konstruktor tidak memiliki tipe pengembalian, bahkan tidak void.

Akhirnya, dalam hal tanda tangan, metode dan konstruktor memiliki nama yang berbeda. Konstruktor memiliki nama yang sama dengan kelasnya; menurut konvensi, metode menggunakan nama selain nama kelas. Jika program Java mengikuti konvensi normal, metode akan dimulai dengan huruf kecil, konstruktor dengan huruf besar. Juga, nama konstruktor biasanya kata benda karena nama kelas biasanya kata benda; nama metode biasanya menunjukkan tindakan.

Penggunaan "ini"

Pembangun dan metode menggunakan kata kunci dengan thissangat berbeda. Metode yang digunakan thisuntuk merujuk ke instance kelas yang menjalankan metode tersebut. Metode statis tidak digunakan this; mereka tidak termasuk dalam instance kelas, jadi thistidak memiliki referensi apa pun. Metode statis milik kelas secara keseluruhan, bukan milik sebuah instance. Konstruktor digunakan thisuntuk merujuk ke konstruktor lain dalam kelas yang sama dengan daftar parameter yang berbeda. Pelajari kode berikut:

kelas publik Platypus {String name; Platipus (masukan string) {nama = masukan; } Platypus () {ini ("John / Mary Doe"); } public static void main (String args []) {Platypus p1 = new Platypus ("digger"); Platypus p2 = Platypus baru (); }}

Dalam kode tersebut, ada dua konstruktor. Yang pertama mengambil Stringinput untuk memberi nama instance. Yang kedua, tanpa parameter, memanggil konstruktor pertama dengan nama default "John/Mary Doe".

Jika konstruktor menggunakan this, itu harus di baris pertama konstruktor; mengabaikan aturan ini akan menyebabkan kompilator menolaknya.

Penggunaan "super"

Metode dan konstruktor keduanya digunakan superuntuk merujuk ke superclass, tetapi dengan cara yang berbeda. Metode yang digunakan superuntuk mengeksekusi metode yang diganti di superclass, seperti yang diilustrasikan dalam contoh berikut:

class Mamalia {void getBirthInfo () {System.out.println ("terlahir hidup."); }} class Platypus extends Mamalia {void getBirthInfo () {System.out.println ("menetas dari telur"); System.out.print ("mamalia biasanya"); super.getBirthInfo (); }}

Dalam program di atas, panggilan untuk super.getBirthInfo()memanggil metode Mammalsuperclass yang diganti .

Konstruktor digunakan superuntuk memanggil konstruktor superclass. Jika konstruktor menggunakan super, ia harus menggunakannya di baris pertama; jika tidak, kompilator akan mengeluh. Contohnya sebagai berikut:

kelas publik SuperClassDemo {SuperClassDemo () {}} kelas Anak extends SuperClassDemo {Child () {super (); }}

Dalam contoh di atas (dan trivial!), Konstruktor Child()menyertakan panggilan ke super, yang menyebabkan kelas SuperClassDemodibuat instance-nya, selain Childkelas tersebut.

Kode yang disediakan penyusun

Pemrogram Java baru mungkin tersandung ketika kompilator secara otomatis menyediakan kode untuk konstruktor. Ini terjadi jika Anda menulis kelas tanpa konstruktor; kompilator akan secara otomatis menyediakan konstruktor tanpa argumen untuk Anda. Jadi, jika Anda menulis:

Contoh kelas publik {} 

itu secara fungsional setara dengan menulis:

contoh kelas publik {Contoh () {}} 

Kompilator juga secara otomatis memberikan kode saat Anda tidak menggunakan super(menggunakan nol atau lebih parameter) sebagai baris pertama konstruktor. Dalam kasus ini, komputer akan masuk secara otomatis super. Jadi, jika Anda menulis:

kelas publik TestConstructors {TestConstructors () {}} 

itu secara fungsional setara dengan menulis:

kelas publik TestConstructors {TestConstructors () { super; }}

Pemula bermata tajam mungkin bertanya-tanya bagaimana program di atas dapat memanggil konstruktor kelas induk saat TestConstructortidak memperluas kelas apa pun. Jawabannya adalah Java memperluas Objectkelas saat Anda tidak memperluas kelas secara eksplisit. Kompilator secara otomatis menyediakan konstruktor tanpa argumen jika tidak ada konstruktor yang dideklarasikan secara eksplisit, dan secara otomatis menyediakan panggilan tanpa argumen supersaat konstruktor tidak memiliki panggilan eksplisit ke super. Jadi, dua cuplikan kode berikut secara fungsional setara:

Contoh kelas publik {} 

dan

contoh kelas publik {Contoh () { super; }}

Warisan

Apa yang salah dengan skenario berikut ini? Seorang pengacara sedang membaca surat wasiat A. Class. Anggota Classkeluarga berkumpul di sekitar meja konferensi besar, beberapa menangis dengan lembut. Pengacara itu membaca, "Saya, dengan A. Classpikiran dan tubuh yang sehat, menyerahkan semua konstruktor saya kepada anak-anak saya."

Masalahnya adalah bahwa konstruktor tidak dapat diwariskan. Untungnya bagi Classanak - anak, secara otomatis mereka akan mewarisi cara-cara orang tua mereka, sehingga Classanak - anak tidak menjadi benar-benar melarat.

Ingat, metode Java diwariskan, sedangkan konstruktor tidak. Pertimbangkan kelas berikut:

Contoh kelas publik {public void sayHi {system.out.println ("Hi"); } Contoh () {}} kelas publik Subkelas extends Contoh {}

The SubClasskelas secara otomatis mewarisi sayHimetode yang ditemukan di kelas induk. Namun, konstruktor Example()tidak diwarisi oleh SubClass.

Meringkas perbedaannya

Sebagaimana platipus berbeda dari mamalia pada umumnya, demikian pula pembangun berbeda dari metode; khususnya dalam tujuan, tanda tangan, dan penggunaan thisdan super. Selain itu, konstruktor berbeda dalam hal pewarisan dan kode yang disediakan kompilator. Menjaga semua detail ini tetap lurus bisa menjadi pekerjaan rumah; tabel berikut memberikan ringkasan yang mudah tentang poin-poin penting. Anda dapat menemukan informasi lebih lanjut mengenai konstruktor dan metode di bagian Sumber daya di bawah ini.

Tabel 1. Perbedaan Antara Konstruktor dan Metode

Tema Konstruktor Metode
Tujuan Buat instance kelas Pernyataan grup Java
Pengubah Tidak bisa abstract, final, native, static, atausynchronized Bisa abstract, final, native, static, atausynchronized
Jenis pengembalian Tidak ada tipe pengembalian, bahkan tidak void void atau tipe pengembalian yang valid
Nama Nama yang sama dengan kelas (huruf pertama dikapitalisasi oleh konvensi) - biasanya kata benda Nama apapun kecuali kelasnya. Nama metode dimulai dengan huruf kecil berdasarkan ketentuan - biasanya nama tindakan
this Mengacu pada konstruktor lain di kelas yang sama. Jika digunakan, itu harus menjadi baris pertama konstruktor Mengacu pada instance dari kelas pemilik. Tidak dapat digunakan dengan metode statis
super Memanggil konstruktor kelas induk. Jika digunakan, harus baris pertama konstruktor Memanggil metode yang diganti di kelas induk
Warisan Konstruktor tidak diwariskan Metode diwariskan
Kompiler secara otomatis menyediakan konstruktor default Jika kelas tidak memiliki konstruktor, konstruktor tanpa argumen secara otomatis disediakan Tidak berlaku
Compiler secara otomatis menyediakan panggilan default ke konstruktor superclass Jika konstruktor tidak membuat panggilan argumen nol-atau-lebih ke super, panggilan tanpa argumen ke superdibuat Tidak berlaku
Robert Nielsen adalah Programmer Java 2 Bersertifikat Sun. Dia memegang gelar master dalam pendidikan, dengan spesialisasi dalam pengajaran dengan bantuan komputer, dan telah mengajar di bidang komputer selama beberapa tahun. Dia juga menerbitkan artikel terkait komputer di berbagai majalah.

Pelajari lebih lanjut tentang topik ini

  • Beberapa buku yang membahas dasar-dasar konstruktor dan metode adalah
  • Panduan Sertifikasi Studi Java 2 Lengkap, Simon Roberts et al. (Sybex, 2000) //www.amazon.com/exec/obidos/ASIN/0782128254/qid=969399182/sr=1-2/102-9220485-9634548
  • Java 2 (Ujian Cram), Bill Brogden (The Coriolis Group, 1999):

    //www.amazon.com/exec/obidos/ASIN/1576102912/qid%3D969399279/102-9220485-9634548

  • Sekilas tentang Java, Davis Flanagan (O'Reilly & Associates, 1999) // www.amazon.com/exec/obidos/ASIN/1565924878/o/qid=969399378/sr=2-1/102-9220485-9634548
  • Kunjungi Situs Web Sun Microsystems untuk cakupan lebih lanjut tentang metode dan konstruktor

    //java.sun.com/docs/books/tutorial/trailmap.html

  • Untuk lebih banyak konten Java bagi pemula, baca seri kolom Java 101 JavaWorld yang baru

    //www.javaworld.com/javaworld/topicalindex/jw-ti-java101.html

Cerita ini, "Memahami konstruktor" pada awalnya diterbitkan oleh JavaWorld.