Java Static Binding dan Dynamic Binding
Baru -baru ini, saya belajar pengetahuan Java dan belajar mengikat Java yang statis dan dinamis. Kemudian saya merangkum dan memilah pengetahuan yang sesuai tentang Baidu untuk membantu menguasai bagian pengetahuan ini.
Konsep pengikatan program:
Ikatan mengacu pada asosiasi panggilan metode dengan kelas (badan metode) di mana metode berada. Untuk Java, ikatan dibagi menjadi pengikatan statis dan pengikatan dinamis; atau itu disebut ikatan awal dan ikatan yang terlambat.
Ikatan statis:
Metode ini terikat sebelum program dijalankan (yaitu, Anda sudah tahu kelas mana metode ini dalam proses kompilasi), dan diimplementasikan oleh kompiler atau program penghubung lainnya. Misalnya: C.
Ini dapat dipahami hanya sebagai ikatan selama periode kompilasi program untuk Java; Di sini sangat jelas bahwa satu-satunya metode di Java adalah final, statis, pribadi dan konstruktor yang pra-binding
Ikatan Dinamis:
Binding kemudian: mengikat sesuai dengan jenis objek spesifik saat runtime.
Jika suatu bahasa mengimplementasikan ikatan yang terlambat, ia juga harus menyediakan beberapa mekanisme untuk menentukan jenis objek selama operasi dan memanggil metode yang sesuai secara terpisah. Dengan kata lain, kompiler masih tidak tahu jenis objek saat ini, tetapi mekanisme panggilan metode dapat menyelidikinya dengan sendirinya dan menemukan badan metode yang benar. Bahasa yang berbeda memiliki cara berbeda untuk menerapkan ikatan yang terlambat. Tapi setidaknya kita bisa berpikir seperti ini: mereka semua perlu menginstal jenis informasi khusus tertentu dalam objek.
Proses Binding Dinamis:
Final, statis, pribadi dan konstruktor adalah pemahaman tentang ikatan awal
Untuk metode pribadi, pertama -tama, itu tidak dapat diwarisi. Karena tidak dapat diwarisi, tidak ada cara untuk menyebutnya melalui objek subkelasnya, tetapi hanya dapat dipanggil melalui objek kelas ini sendiri. Oleh karena itu, dapat dikatakan bahwa metode pribadi terikat ke kelas yang mendefinisikan metode ini.
Meskipun metode terakhir dapat diwarisi, itu tidak dapat ditimpa (ditimpa). Meskipun objek kelas anak dapat dipanggil, metode terakhir yang didefinisikan dalam kelas induk dipanggil (dari ini kita dapat mengetahui bahwa metode ini dinyatakan sebagai tipe akhir, satu adalah untuk mencegah metode tersebut ditimpa, dan yang lainnya adalah untuk secara efektif menutup ikatan dinamis di Java).
Konstruktor tidak dapat diwariskan (ada juga yang mengatakan bahwa subkelas tanpa syarat mewarisi konstruktor parameter kelas induk sebagai konstruktor mereka, tetapi saya pribadi berpikir pernyataan ini tidak pantas, karena kita tahu bahwa subkelas menyebutnya tidak perlu dikeluarkan oleh orang tua dari kelas orang tua () untuk melengkapi kelas orang tua. konstruktor). Karena itu, Anda juga dapat mengetahui kelas mana konstruktor ini berasal saat menyusun.
Saya tidak bisa menjelaskan prinsip -prinsip spesifik dari metode statis dengan baik. Namun, berdasarkan informasi online dan eksperimen saya sendiri, kami dapat menyimpulkan bahwa metode statis dapat diwarisi oleh subkelas, tetapi tidak dapat ditulis ulang (ditimpa) oleh subkelas, tetapi dapat disembunyikan oleh subkelas. (Ini berarti bahwa jika ada metode statis di kelas induk dan jika tidak ada metode yang sesuai dalam subclassnya, maka metode dalam kelas induk akan digunakan ketika objek kelas anak menyebut metode ini. Dan jika metode yang sama didefinisikan dalam kelas anak, metode yang didefinisikan dalam kelas anak akan dipanggil. Kelas orang tua terlepas dari apakah kelas anak memiliki metode statis ini.
Dari hal di atas kita dapat menyimpulkan bahwa jika suatu metode tidak dapat diwarisi atau tidak dapat ditimpa setelah warisan, maka metode ini mengadopsi pengikatan statis.
Kompilasi dan Pengoperasian Java
Proses kompilasi Java adalah proses menyusun file sumber Java ke dalam bytecode (kode yang dapat dieksekusi JVM, mis. File kelas). Dalam proses ini, Java tidak berurusan dengan memori. Dalam proses ini, kompiler akan melakukan analisis sintaks. Jika sintaks tidak benar, kesalahan akan dilaporkan.
Java Running Process mengacu pada JVM (Java Virtual Machine) memuat file bytecode dan menafsirkan eksekusi. Dalam proses ini, ini adalah penciptaan nyata dari tata letak memori dan pelaksanaan program Java.
Ada dua cara untuk menjalankan Java bytecode: (1) Metode Kompilasi Instan: Interpreter pertama kali mengkompilasi byte menjadi kode mesin, dan kemudian menjalankan kode mesin; (2) Metode Eksekusi Penjelasan: Interpreter melengkapi semua operasi program Java Bytecode dengan menafsirkan dan melaksanakan sepotong kecil kode setiap kali. (Here we can see that the java program actually undergoes two conversions during the execution process, first converted into bytecode and then converted into machine code. This is also the reason why java can be compiled and run everywhere in one go. Installing the corresponding java virtual machine on different platforms can realize the same bytecode into machine code on different platforms, so as to run on different platforms)
Seperti disebutkan sebelumnya, untuk metode di Java, kecuali untuk final, statis, pribadi dan konstruktor yang merupakan binding awal, semua metode lain adalah binding dinamis.
Ikatan dinamis khas terjadi di bawah deklarasi konversi kelas induk dan kelas anak:
Misalnya: orang tua p = anak baru ();
Detail proses spesifik adalah sebagai berikut:
1: Kompiler memeriksa jenis deklarasi dan nama metode objek.
Misalkan kita menyebut metode XF (ARGS) dan X telah dinyatakan sebagai objek Kelas C, maka kompiler akan mencantumkan semua metode yang disebut F dalam metode Kelas C dan F yang diwarisi dari superclass kelas C.
2: Selanjutnya, kompiler memeriksa jenis parameter yang disediakan dalam panggilan metode.
Jika satu jenis parameter di antara semua metode dengan nama F cocok dengan jenis parameter yang disediakan oleh panggilan paling banyak, maka metode ini dipanggil. Proses ini disebut "Resolusi Kelebihan".
3: Ketika program berjalan dan menggunakan ikatan dinamis untuk memanggil metode, mesin virtual harus memanggil versi metode yang cocok dengan jenis aktual dari objek yang ditunjukkan oleh x.
Asumsikan bahwa tipe aktual adalah D (subclass dari C), jika kelas D mendefinisikan f (string), maka metode ini disebut, jika tidak metode f (string) akan dicari dalam superclass d, dan sebagainya.
Ketika mesin virtual Java memanggil metode kelas (metode statis), ia memilih metode yang dipanggil berdasarkan jenis referensi objek (biasanya diketahui pada waktu kompilasi). Sebaliknya, ketika mesin virtual memanggil metode instan, ia akan memilih metode yang dipanggil berdasarkan jenis objek yang sebenarnya (hanya diketahui saat runtime). Ini adalah ikatan dinamis, yang merupakan jenis polimorfisme. Dynamic Binding memberikan fleksibilitas besar untuk memecahkan masalah bisnis yang sebenarnya dan merupakan mekanisme yang sangat indah.
Tidak seperti metode, ketika berhadapan dengan variabel anggota (variabel instance dan variabel kelas) di kelas Java, itu bukan ikatan run-time, tetapi ikatan statis dalam pengertian umum. Jadi dalam kasus transformasi ke atas, metode objek dapat menemukan subkelas, sedangkan atribut objek (variabel anggota) masih merupakan atribut kelas induk (subkelas bersembunyi dari variabel anggota kelas induk).
ayah kelas publik {string name yang dilindungi = "atribut ayah"; } Public Class Son Extends Father {Protected String Name = "Son Atribut"; public static void main (string [] args) {ayah sampel = new son (); System.out.println ("Disebut Properti:" + Sample.name); }} Kesimpulan: Penelepon adalah atribut ayah.
Hasil ini menunjukkan bahwa objek kelas anak (pegangan referensi kelas induk) dipanggil ke variabel anggota kelas induk. Oleh karena itu, harus jelas bahwa kategori yang ditargetkan oleh pengikatan runtime (dinamis) hanyalah metode objek.
Sekarang mencoba memanggil nama variabel anggota subclass, bagaimana melakukannya? Cara termudah adalah dengan merangkum variabel anggota ke dalam formulir pengambil metode.
Kodenya adalah sebagai berikut:
ayah kelas publik {string name yang dilindungi = "atribut ayah"; public string getName () {return name; }} Son kelas publik memperluas ayah {string name yang dilindungi = "Atribut Son"; public string getName () {return name; } public static void main (string [] args) {ayah sampel = new son (); System.out.println ("Disebut Properti:" + Sample.getName ()); }} Hasil: Atribut putra dipanggil
Mengapa Java mengadopsi metode pengikatan statis untuk atribut? Ini karena pengikatan statis memiliki banyak manfaat, yang memungkinkan kita untuk menemukan kesalahan dalam program selama periode kompilasi, bukan selama periode runtime. Ini akan meningkatkan efisiensi operasi program! Ikatan metode yang dinamis adalah untuk mengimplementasikan polimorfisme, yang merupakan fitur utama Java. Polimorfisme juga merupakan salah satu teknologi yang berorientasi objek utama, sehingga bermanfaat bagi Java untuk mengimplementasikan polimorfisme dengan biaya efisiensi.
Catatan: Sebagian besar konten di atas berasal dari internet, dan sebagian kecil adalah pendapat pribadi dan tidak berarti komentar otoritatif. Jika ada bahasa yang tidak pantas atau ekspresi yang salah, saya berharap dapat memberi Anda nasihat.
Terima kasih telah membaca, saya harap ini dapat membantu Anda. Terima kasih atas dukungan Anda untuk situs ini!