Ketik konversi objek polimorfik java <br /> Konversi tipe objek yang disebutkan di sini mengacu pada objek dengan hubungan warisan, bukan objek jenis apa pun. Saat melemparkan objek yang tidak memiliki hubungan warisan, runtime Java melempar pengecualian java.lang.classcastException.
Dalam rantai warisan, kami menyebut konversi subkelas ke kelas induk "transformasi ke atas" dan konversi kelas induk ke kelas anak "transformasi ke bawah".
Sering kali, kami mendefinisikan variabel sebagai jenis kelas induk tetapi merujuk pada objek kelas anak. Ketika program berjalan, ia menggunakan ikatan dinamis untuk mewujudkan panggilan ke metode subkelas, yaitu polimorfisme.
Namun, kadang-kadang untuk menyelesaikan fungsi yang tidak dimiliki beberapa kelas orang tua, kita perlu mengubah objek subclass yang ditransformasi ke atas menjadi subkelas dan memanggil metode subkelas, yang merupakan transformasi ke bawah.
Catatan: Objek kelas induk tidak dapat secara langsung dilemparkan ke jenis subkelas, dan objek subkelas setelah transformasi ke atas hanya dapat dikonversi ke jenis subkelas lagi. Dengan kata lain, objek subkelas harus diubah ke atas sebelum mereka dapat berubah ke bawah. Silakan lihat kode berikut:
Demo Kelas Publik {public static void main (string args []) {superclass superobj = new superclass () Obyek induk.Hapus komentar pada baris 7, dan pengecualian akan dilemparkan saat runtime, tetapi kompilasi dapat dilewati.
Karena ada risiko dalam transisi ke bawah, saat menerima referensi ke kelas induk, pastikan untuk menggunakan instance dari operator untuk menentukan apakah objek tersebut adalah subkelas yang Anda inginkan.
Demo Kelas Publik {public static void main (string args []) {superclass superobj = new superclass (); = (Sonclass) superobj;} else {System.out.println ("① tidak dapat mengonversi"); ) superobj;} else {System.out.println ("② tidak dapat dikonversi"); Hasil Menjalankan:
① Tidak dapat mengonversi
Ringkasan: Konversi objek diperiksa saat program dijalankan.
Java Polymorphism dan Dynamic Binding <BR /> di Java, variabel kelas induk dapat merujuk pada contoh kelas induk atau contoh kelas anak.
Harap baca sepotong kode terlebih dahulu:
Demo Public {Public Static Main (String [] Args) {Animal Obj = NEW NEATION () .cry ();}} kelas hewan {// Panggilan Hewan Void Cry () {System.out.println ("Saya tidak tahu apa yang harus dipanggil"); Call of Cat Void Cry () {System.out.println ("Meow ~"); }} Hasil Menjalankan:
Saya tidak tahu bagaimana menelepon meow ~ wol ~
Kode di atas mendefinisikan tiga kelas, yaitu kelas hewan, kucing dan anjing. Variabel OBJ memiliki tipe hewan, yang dapat menunjukkan contoh kelas hewan, serta contoh kelas kucing dan anjing, yang benar. Artinya, variabel kelas induk dapat merujuk pada contoh kelas induk atau contoh kelas anak. Perhatikan bahwa sebaliknya adalah salah, karena semua kucing adalah hewan, tetapi tidak semua hewan adalah kucing.
Dapat dilihat bahwa OBJ dapat berupa manusia, kucing atau anjing. Polimorfisme mengacu pada sesuatu yang memiliki bentuk atau bentuk yang berbeda.
Misalnya, "manusia" juga memiliki banyak ekspresi atau implementasi yang berbeda. , guru, atau dokter di kehidupan berikutnya.
Ada tiga kondisi yang diperlukan agar polimorfisme ada: variabel warisan, penulisan ulang, dan induk mengacu pada objek subkelas.
Saat memanggil metode menggunakan metode polimorfik:
Periksa apakah metode ini ada di kelas induk.
Jika subclass menimpa metode ini, metode subclass dipanggil, jika tidak, metode kelas induk dipanggil.
Dari contoh di atas, kita dapat melihat bahwa satu keuntungan dari polimorfisme adalah bahwa ketika ada banyak subkelas, tidak perlu mendefinisikan beberapa variabel. Silakan lihat contoh berikut:
Demo kelas publik {public static void main (string [] args) {// Dengan bantuan polimorfisme, pemilik dapat memberi makan banyak hewan master ma = new master (); ); ) {System.out.println ("Saya seekor hewan kecil, makan" + f.getFood ()); A Little Cat is Eating " + f.getFood ());}} class dog memperluas hewan {public void eat (makanan f) {System.out.println (" Saya seekor anjing, makan " + f. GetFood ()) ; String getFood () {return "Bone"; Hasil Menjalankan:
Saya seekor binatang kecil, makan sesuatu, saya adalah kucing kecil, makan ikan, saya anjing, makan tulang
Metode pakan kelas master memiliki dua parameter, yaitu jenis hewan dan jenis makanan. Hewan yang berbeda.
Ikatan Dinamis
Untuk memahami sifat polimorfisme, mari kita bicara tentang proses terperinci dari metode panggilan java di bawah ini.
1) Kompiler memeriksa jenis deklarasi dan nama metode objek.
Misalkan obj.func (param) disebut, OBJ adalah objek kelas kucing. Perlu dicatat bahwa mungkin ada beberapa metode dengan nama dengan func tetapi parameter yang berbeda. Misalnya, metode func (int) dan func (string) mungkin ada. Kompiler akan mencantumkan semua metode bernama FUNC di kelas CAT dan metode mengakses Atribut Publik dan bernama Func pada hewan kelas induknya.
Dengan cara ini, kompiler memperoleh daftar semua metode kandidat yang mungkin dipanggil.
2) Selanjutnya, editor akan memeriksa tanda tangan parameter yang disediakan saat memanggil metode.
Jika ada metode dalam semua metode bernama FUNC yang persis cocok dengan tanda tangan parameter yang disediakan, lalu pilih metode ini. Proses ini disebut resolusi kelebihan beban. Misalnya, jika FUNC ("Hello") dipanggil, kompiler akan memilih Func (String) bukan Func (int). Karena adanya konversi tipe otomatis, misalnya, int dapat dikonversi menjadi ganda. Akhir atau beberapa metode mencocokkannya, lalu kompilasi kesalahan.
Dengan cara ini, kompiler memperoleh nama metode dan tanda tangan parameter yang perlu dipanggil.
3) Jika pengubah metode bersifat pribadi, statis, final (statis dan final akan dijelaskan nanti), atau konstruktor, maka kompiler akan dapat mengetahui dengan tepat metode mana yang harus dipanggil. .
Sejalan dengan itu, metode yang dipanggil tergantung pada jenis objek aktual dan mengimplementasikan ikatan dinamis saat runtime. Misalnya, saat memanggil Func ("Hello"), editor akan menggunakan ikatan dinamis untuk menghasilkan arahan yang memanggil FUNC (String).
4) Ketika program berjalan dan menggunakan ikatan dinamis untuk memanggil metode ini, JVM pasti akan memanggil metode kelas yang paling cocok untuk jenis objek aktual yang dirujuk oleh OBJ. Kami telah berasumsi bahwa tipe aktual OBJ adalah kucing, yang merupakan subclass dari hewan, dan itu dipanggil jika func (string) didefinisikan dalam kucing, jika tidak ia akan dicari di kelas hewan dan kelas induknya.
Setiap panggilan ke metode ini membutuhkan pencarian, yang cukup mahal. Dengan cara ini, ketika metode ini sebenarnya disebut, mesin virtual hanya dapat mencari tabel ini. Dalam contoh di atas, JVM mencari tabel metode kelas kucing untuk menemukan metode yang cocok dengan panggilan ke func ("Hello"). Metode ini dapat berupa cat.func (string) atau animal.func (string). Perhatikan bahwa jika super.func ("halo") dipanggil, kompiler akan mencari tabel metode kelas induk.
Dengan asumsi bahwa kelas hewan berisi tiga metode: cry (), getName (), dan getage (), maka tabel metodenya adalah sebagai berikut:
cry () -> animal.cry ()
getName () -> animal.getName ()
getage () -> animal.getage ()
Faktanya, hewan juga memiliki objek kelas induk default (yang akan dijelaskan nanti), yang akan mewarisi metode objek, sehingga metode yang tercantum di atas tidak lengkap.
Dengan asumsi bahwa kelas CAT mengesampingkan metode Cry () di kelas hewan dan menambahkan metode baru panjat (), daftar parameternya adalah:
cry () -> cat.cry ()
getName () -> animal.getName ()
getage () -> animal.getage ()
climbtree () -> cat.climbtree ()
Saat berjalan, proses memanggil metode obj.cry () adalah sebagai berikut:
JVM pertama -tama mengakses tabel metode dari jenis OBJ yang sebenarnya, yang mungkin merupakan tabel metode kelas hewan, atau tabel metode kelas kucing dan subkelasnya.
JVM mencari metode yang cocok dengan Cry () di tabel Metode, dan setelah menemukannya, Anda akan tahu kelas mana miliknya.
JVM memanggil metode ini.