JavaRush /Blog Java /Random-MS /Perbezaan antara pembina dan kaedah biasa.
fog
Tahap

Perbezaan antara pembina dan kaedah biasa.

Diterbitkan dalam kumpulan
Pembina ialah kaedah khas yang bertujuan untuk menetapkan nilai medan objek pada mulanya. Pada pandangan pertama, pembina objek tidak banyak berbeza daripada kaedah objek biasa. Dan sesungguhnya, di dalam pembina kita boleh melakukan semua yang boleh kita lakukan dalam kaedah objek biasa: teks output ke konsol, akses semua medan dan kaedah objek baharu, buang pengecualian, dan sebagainya. Sama seperti kaedah biasa, pembina boleh mempunyai hujah. Sama seperti kaedah terlebih beban, terdapat beberapa pembina dengan tandatangan yang berbeza. Sama seperti kaedah generik, pembina boleh diparameterkan mengikut pembolehubah jenis. Walaupun kita melihat ke dalam kod bait yang dijana oleh pengkompil, di tempat yang sepatutnya ada panggilan kepada pembina, kita akan menemui panggilan ke beberapa kaedah dengan nama yang panggilan itu tidak <init>berbeza daripada panggilan ke kaedah lain objek itu. Dan setelah menemui kod bait kaedah ini, kami akan mendapati ia mengandungi hasil penyusunan pembina kami. Nampaknya tidak banyak perbezaan dari kaedah konvensional, tetapi ia wujud, dan yang agak ketara. Pertama, mari kita fikirkan, mengapa kita sebenarnya memerlukan pembina? Untuk menyimpan dan memproses sebarang data, sama ada jenis primitif, tatasusunan atau objek, kita memerlukan sejumlah memori. Ini boleh menjadi daftar pemproses, ruang tindanan, atau sekeping ruang yang diperuntukkan dalam bahagian data proses, atau dalam bahagian memori yang diperuntukkan secara dinamik (timbunan). Dalam banyak bahasa pengaturcaraan, untuk tujuan mempercepatkan, apabila atur cara meminta sekeping memori baharu, memori diberikan kepada atur cara tidak dikosongkan, dan boleh mengandungi data sewenang-wenangnya yang disimpan dalam sel memori ini sebelum ini. Menyediakan dan menulis nilai yang diperlukan ke dalam sekeping ingatan supaya pada akhirnya akan ada beberapa struktur data yang bermakna di sana jatuh sepenuhnya di bahu pengaturcara. Sememangnya, pengaturcara mahu menjadikan kehidupan mereka lebih mudah dan menulis rutin untuk memulakan (iaitu, menetapkan nilai awal) untuk struktur data yang kerap digunakan. Rutin sebegitu digunakan hampir secara berterusan, jadi pencipta bahasa Java memutuskan untuk mewajibkan rutin inisialisasi sedemikian untuk dipanggil semasa mencipta objek, dan memanggilnya constructors . Apabila objek baharu dicipta dalam Java, perkara berikut berlaku: Pertama, pengurus memori Java memperuntukkan jumlah memori yang diperlukan untuk menampung objek tersebut. Dalam kes ini, bukan sahaja medan yang diisytiharkan secara langsung dalam kelas objek yang dibuat diambil kira, tetapi juga medan yang diisytiharkan dalam semua nenek moyang kelas ini. Selain itu, volum ini termasuk ruang untuk meletakkan struktur yang digunakan oleh mesin Java untuk keperluan dalaman. Semua medan "kosong" sedemikian secara automatik ditetapkan kepada nilai lalai - nulluntuk jenis rujukan, 0untuk nombor dan falseuntukboolean. Selepas ini, pembina kelas dipanggil secara automatik, yang tugasnya adalah untuk menetapkan nilai awal medan objek. Walaupun dalam kaedah biasa pernyataan pertama boleh menjadi apa sahaja, pembina mempunyai kebebasan yang lebih sedikit. Pernyataan pertama pembina mestilah sama ada panggilan eksplisit kepada pembina lain dari kelas yang sama, atau panggilan eksplisit atau tersirat kepada pembina kelas induk. Panggilan eksplisit kepada pembina kelas yang sama dibuat menggunakan kata kunci thisdiikuti dengan set hujah yang disertakan dalam kurungan. Memanggil pembina kelas induk secara eksplisit dilakukan dengan cara yang sama, tetapi kata kunci digunakan super. Dalam hujah panggilan eksplisit kepada pembina kelas yang sama atau induk, anda tidak boleh mengakses medan dan kaedah objek, serta menggunakan kata kunci thisdan super, kerana panggilan eksplisit kepada pembina memperkenalkan konteks statik. Untuk memanggil pembina kelas induk secara tersirat, anda tidak perlu menulis apa-apa, tetapi pembina lalai dipanggil secara tersirat, yang mesti wujud dan boleh dilihat oleh kelas semasa. Pada masa yang sama, perlu diingat bahawa jika rantaian panggilan pembina induk terganggu sebelum pembina kelas Objectyang terletak di bahagian atas rantai berjaya menyelesaikan kerjanya, maka objek tidak akan dimuktamadkan, iaitu kaedah finalize()objek sedemikian tidak akan dipanggil. Selepas pembina kelas induk selesai, kawalan dipindahkan secara tersirat kepada blok pemula contoh dan pemula medan contoh kelas semasa. Inisialisasi dilaksanakan mengikut susunan ia muncul dalam teks program. Hanya selepas pemula menyelesaikan kerja mereka, kawalan dipindahkan ke seluruh pembina. Ciri baki pembina berkaitan dengan model memori Java. Jika kelas, atau salah satu nenek moyangnya, mengatasi kaedah finalize(), maka penyiapan pembina akan berlaku sebelum ( berlaku-sebelum ) kaedah berjalan finalize(). Jika mana-mana benang melihat rujukan kepada objek selepas pembina selesai, maka ia dijamin bahawa benang ini akan melihat medan -medan yang dimulakan dengan betul final, permulaan yang berlaku sebelum penyiapan pembina.
Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION