JavaRush /Java Blog /Random-ID /Perbedaan antara konstruktor dan metode biasa.
fog
Level 18

Perbedaan antara konstruktor dan metode biasa.

Dipublikasikan di grup Random-ID
Konstruktor adalah metode khusus yang dimaksudkan untuk menetapkan nilai bidang suatu objek pada awalnya. Sekilas, konstruktor objek tidak berbeda jauh dengan metode objek biasa. Dan memang, di dalam konstruktor kita bisa melakukan semua yang bisa kita lakukan dalam metode objek biasa: mengeluarkan teks ke konsol, mengakses semua bidang dan metode objek baru, melemparkan pengecualian, dan sebagainya. Sama seperti metode biasa, konstruktor juga dapat memiliki argumen. Sama seperti metode yang kelebihan beban, mungkin ada beberapa konstruktor dengan tanda tangan berbeda. Sama seperti metode generik, konstruktor dapat diparameterisasi berdasarkan variabel tipe. Bahkan jika kita melihat bytecode yang dihasilkan oleh kompiler, di tempat di mana seharusnya ada panggilan ke konstruktor, kita akan menemukan panggilan ke beberapa metode yang namanya panggilan tersebut tidak <init>berbeda dengan panggilan ke metode lain. objeknya. Dan setelah menemukan bytecode dari metode ini, kita akan menemukan bahwa itu berisi hasil kompilasi konstruktor kita. Tampaknya tidak banyak perbedaan dengan cara konvensional, namun ada dan cukup signifikan. Pertama, mari kita cari tahu mengapa kita sebenarnya membutuhkan konstruktor? Untuk menyimpan dan memproses data apa pun, baik itu tipe primitif, array, atau objek, kita memerlukan sejumlah memori. Ini bisa berupa register prosesor, ruang tumpukan, atau bagian ruang yang dialokasikan di bagian data proses, atau di bagian memori (heap) yang dialokasikan secara dinamis. Dalam banyak bahasa pemrograman, untuk tujuan percepatan, ketika sebuah program meminta bagian memori baru, memori tersebut diberikan kepada program tersebut tanpa dihapus, dan dapat berisi data arbitrer yang disimpan di sel memori ini sebelumnya. Mempersiapkan dan menulis nilai-nilai yang diperlukan ke dalam memori sedemikian rupa sehingga pada akhirnya akan ada struktur data yang bermakna di sana sepenuhnya berada di pundak programmer. Tentu saja, pemrogram ingin membuat hidup mereka lebih mudah dan menulis rutinitas untuk menginisialisasi (yaitu, menetapkan nilai awal) untuk struktur data yang sering digunakan. Rutinitas seperti itu digunakan hampir terus-menerus, sehingga pembuat bahasa Java memutuskan untuk menjadikan rutinitas inisialisasi tersebut wajib dipanggil saat membuat objek, dan menyebutnya konstruktor . Ketika sebuah objek baru dibuat di Java, hal berikut terjadi: Pertama, manajer memori Java mengalokasikan jumlah memori yang diperlukan untuk mengakomodasi objek tersebut. Dalam hal ini, tidak hanya bidang yang dideklarasikan secara langsung di kelas objek yang dibuat yang diperhitungkan, tetapi juga bidang yang dideklarasikan di semua nenek moyang kelas ini. Selain itu, volume ini mencakup ruang untuk menempatkan struktur yang digunakan oleh mesin Java untuk kebutuhan internal. Semua bidang yang "kosong" tersebut secara otomatis disetel ke nilai default - nulluntuk jenis referensi, 0untuk angka, dan falseuntukboolean. Setelah itu, konstruktor kelas dipanggil secara otomatis, yang tugasnya mengatur nilai awal bidang objek. Meskipun dalam metode normal pernyataan pertama bisa berupa apa saja, konstruktor mempunyai kebebasan yang jauh lebih sedikit. Pernyataan pertama konstruktor harus berupa panggilan eksplisit ke konstruktor lain di kelas yang sama, atau panggilan eksplisit atau implisit ke konstruktor kelas induk. Panggilan eksplisit ke konstruktor kelas yang sama dilakukan menggunakan kata kunci thisdiikuti dengan serangkaian argumen yang diapit tanda kurung. Memanggil konstruktor kelas induk secara eksplisit dilakukan dengan cara yang persis sama, tetapi kata kuncinya digunakan super. Dalam argumen panggilan eksplisit ke konstruktor kelas yang sama atau induk, Anda tidak dapat mengakses bidang dan metode objek, serta menggunakan kata kunci thisdan super, karena panggilan eksplisit ke konstruktor memperkenalkan konteks statis. Untuk memanggil konstruktor kelas induk secara implisit, Anda tidak perlu menulis apa pun, tetapi konstruktor default dipanggil secara implisit, yang harus ada dan terlihat oleh kelas saat ini. Pada saat yang sama, harus diingat bahwa jika rantai pemanggilan konstruktor induk terputus sebelum konstruktor kelas Objectyang terletak di bagian atas rantai berhasil menyelesaikan pekerjaannya, maka objek tersebut tidak dapat diselesaikan, yaitu metode finalize()objek seperti itu tidak akan pernah dipanggil. Setelah konstruktor kelas induk selesai, kontrol secara implisit ditransfer ke blok penginisialisasi instance dan penginisialisasi bidang instance dari kelas saat ini. Inisialisasi dijalankan sesuai urutan kemunculannya dalam teks program. Hanya setelah inisialisasi menyelesaikan pekerjaannya barulah kontrol ditransfer ke seluruh konstruktor. Fitur konstruktor lainnya berhubungan dengan model memori Java. Jika suatu kelas, atau salah satu nenek moyangnya, menimpa metode tersebut finalize(), maka penyelesaian konstruktor akan terjadi sebelum ( terjadi-sebelum ) metode dijalankan finalize(). Jika ada utas yang melihat referensi ke suatu objek setelah konstruktor selesai, maka dijamin bahwa utas ini akan melihat bidang finalobjek yang diinisialisasi dengan benar, yang inisialisasinya terjadi sebelum selesainya konstruktor.
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION