Baru-baru ini, saya memiliki pengalaman dalam menugaskan objek subkelas ke objek kelas induk, dan saya ingin membaginya dengan Anda. Namun level saya terbatas, jadi mohon koreksi dan kritik saya.
Di dekat rumah, berikut beberapa contoh kecilnya, silakan lihat.
Uji satu
Kelas orang tua:
Subkelas:
Hasil: ini adalah metode print() kelas induk - objek saat ini adalah Subclass@126b249
Saat ini objeknya adalah Subclass@126b249
menjelaskan:
Supkelas sup=Subkelas baru();
Meskipun objek yang dideklarasikan adalah objek kelas induk, ruang memori sebenarnya milik objek subkelas.
Metode public void print() yang diwarisi dari kelas induk dipanggil, dan outputnya adalah resolusi nama objek subkelas.
Kesimpulan: Objek yang dideklarasikan pada waktu kompilasi adalah objek kelas induk, tetapi pada saat runtime ia merupakan objek subkelas. Jika subkelas tidak menimpa metode kelas induk, objek saat ini akan memanggil metode yang diwarisi dari kelas induk.
Tes 2
Kelas orang tua:
Subkelas:
Hasil: ini adalah metode subkelas print() - saat ini objeknya adalah Subclass@126b249
Saat ini objeknya adalah Subclass@126b249
menjelaskan:
Berdasarkan contoh sebelumnya, saya menulis ulang metode print() dari kelas induk. Saat ini, metode print() dari subkelas dipanggil.
Kesimpulan: Berdasarkan kesimpulan contoh sebelumnya, saya sampai pada kesimpulan: saat ini objek tersebut memang merupakan objek subkelas saat dijalankan.
Kemudian objek saat ini memanggil metode yang diwarisi dari kelas induk; jika tidak, objek saat ini memanggil metode subkelas.
Pertanyaan: Bisakah kita menarik kesimpulan berikut dari pengujian di atas: menugaskan objek subkelas ke objek kelas induk (yaitu Supclass sup=Subkelas baru()),
Apa yang kita dapatkan adalah objek subkelas, yaitu sup adalah objek subkelas??????
Tes ketiga
Kelas orang tua:
Subkelas:
Hasil: Atribut saat ini: atribut kelas induk
Catatan: Berdasarkan pengujian pertama, saya menambahkan atribut className ke kelas induk dan mengganti atribut ini di subkelas.
Tetapi ketika saya menampilkan properti objek saat ini, itu adalah properti dari kelas induk.
Kesimpulan: Saat menugaskan objek subkelas ke objek kelas induk, metode dan propertinya sangat berbeda dari hubungan pewarisan ortodoks kita.
pertanyaan:
Apakah objek saat ini merupakan objek subkelas atau objek kelas induk?
Mulai berspekulasi:
Ada beberapa poin yang perlu saya sampaikan sebelum berspekulasi:
1. Saat kita membuat objek subkelas baru, konstruktor objek kelas induk juga dijalankan pada waktu yang sama, yaitu beberapa informasi yang diperlukan dari kelas induk dan objek subkelas menempati ruang memori yang sama.
Saat kita mengganti metode ini, kita bisa menggunakan objek super untuk merujuk ke kelas induk.
2. Objek di Java tidak sepenuhnya berorientasi objek, yaitu atribut dan metode suatu objek tidak dienkapsulasi ke dalam objek pada saat yang bersamaan.
Tetapi objek memiliki atributnya sendiri, tetapi metode mengacu pada metode yang ada di kelas. Dapat dikatakan bahwa ia merangkum referensi atribut dan metode yang ada di kelas ke dalam objek.
Jadi metode yang dipanggil oleh objek tersebut bukanlah metodenya sendiri, melainkan metode yang ada di kelasnya. Adapun mengapa Java melakukan ini, saya tidak tahu.
3. Saat objek dimuat ke dalam memori, kelas tersebut dimuat ke dalam memori terlebih dahulu, kemudian kelas tersebut harus tetap berada di memori.
Menurut saya Java harus memiliki mekanisme daur ulangnya sendiri, seperti halnya mendaur ulang benda.
4. Kompilasi dan menjalankan adalah hal yang sangat berbeda. Hal utama yang Anda lakukan selama kompilasi adalah mendeklarasikan tipe objek, menetapkan atribut, memeriksa kesalahan sintaksis, dll.
Yang dilakukan runtime adalah memuat objek ke dalam memori (biasanya menggunakan yang baru, refleksi juga biasa digunakan), menjalankan fungsi eksekusi kode, dll.
5. Jika Anda, pembaca, dan saya tidak sepakat satu sama lain dalam poin-poin ini, atau jika kita tidak memiliki pemahaman yang sama tentang poin-poin ini, Anda akan berpikir bahwa saya berbicara omong kosong.
Mungkin Anda akan berpikir bahwa nilai ahli saya terlalu rendah, sehingga kredibilitas saya rendah. Tetapi yang ingin saya katakan adalah tidak ada urutan pembelajaran, dan mereka yang menguasai terlebih dahulu adalah yang utama.
Haha, saya siap mengubah poin ahli saya menjadi nilai negatif, tidak ada lagi omong kosong, ayo lanjutkan.
Spekulasi:
1. Saat kita mengkompilasi Supclass sup=new Subclass(), objek sup dideklarasikan sebagai kelas Supclass, sehingga atribut dari objek sup tersebut merupakan nilai dari atribut objek kelas induknya.
3. Melanjutkan dari langkah 2, jika kita mengganti metode kelas induk, karena ruang memori objek sup adalah ruang memori objek subkelas, metode subkelas public void print() telah dimuat ke dalam memori.
Jadi yang kami sebut adalah metode public void print() dari subkelas; jika Anda perlu memanggil metode yang diganti dari kelas induk, Anda perlu menggunakan super.
Bagian ini dapat menjelaskan tes 2.
Meringkaskan:
Berikut ini murni pendapat pribadi:
Tetapkan objek subkelas ke objek kelas induk, dan objek yang dihasilkan adalah objek seperti ini:
Itu dikompilasi sebagai objek kelas induk, tetapi dijalankan sebagai objek subkelas. Karakteristik spesifiknya adalah sebagai berikut.
1. Dideklarasikan sebagai objek kelas induk 2. Memiliki atribut kelas induk 3. Menempati ruang memori subkelas 4. Ketika metode subkelas mengesampingkan metode kelas induk, objek memanggil metode subkelas saat ini; jika tidak, pewarisan secara otomatis disebut Metode kelas induk.
5. Menurut saya objek ini bukanlah objek kelas induk atau objek subkelas. Saat kita menggunakan metodenya,
Saya memperlakukannya sebagai objek subkelas; jika saya menggunakan propertinya, saya memperlakukannya sebagai objek kelas induk.
Itu adalah objek yang menempati atribut kelas induk dan menggunakan metode subkelas. Adapun jenis objeknya, menurut saya itu tergantung pada deklarasinya metode.
Pikirkan tentang hal ini:
Berdasarkan pengujian 3, bagaimana kita mengekstrak atribut subkelas? ? ? ? ?