Ini pertanyaan wawancara.
Apakah subclass mewarisi bidang pribadi?
Saya menjawab "Tidak", karena kita tidak dapat mengaksesnya menggunakan "cara OOP normal". Tetapi pewawancara berpikir bahwa itu adalah warisan, karena kita dapat mengakses bidang-bidang tersebut secara tidak langsung atau menggunakan refleksi dan mereka masih ada di objek.
Setelah saya kembali, saya menemukan kutipan berikut di javadoc :
Anggota Pribadi dalam Kelas Super
Subkelas tidak mewarisi anggota pribadi dari kelas induknya.
Apakah Anda tahu argumen apa pun untuk pendapat pewawancara?
java
oop
inheritance
private
Stan Kurilin
sumber
sumber
Jawaban:
Sebagian besar kebingungan dalam pertanyaan / jawaban di sini melingkupi definisi Warisan.
Jelas, seperti @DigitalRoss menjelaskan OBJECT dari subkelas harus berisi bidang pribadi superclass-nya. Seperti yang ia nyatakan, tidak memiliki akses ke anggota pribadi tidak berarti itu tidak ada.
Namun. Ini berbeda dengan gagasan pewarisan kelas. Seperti halnya di dunia java, di mana ada pertanyaan tentang semantik arbiter adalah Spesifikasi Bahasa Jawa (saat ini edisi ke-3).
Seperti yang dinyatakan JLS ( https://docs.oracle.com/javase/specs/jls/se8/html/jls-8.html#jls-8.2 ):
Ini menjawab pertanyaan yang diajukan oleh pewawancara: "apakah sub CLASSES mewarisi bidang pribadi". (penekanan ditambahkan oleh saya)
Jawabannya adalah Tidak. Mereka tidak. BENDA subclass mengandung bidang pribadi dari superclasses mereka. Subclass itu sendiri tidak memiliki PEMBERITAHUAN bidang pribadi superclass-nya.
Apakah itu semantik yang sifatnya bertele-tele? Iya. Apakah ini pertanyaan wawancara yang bermanfaat? Mungkin tidak. Tetapi JLS menetapkan definisi untuk dunia Jawa, dan ia melakukannya (dalam hal ini) dengan jelas.
EDITED (menghapus kutipan paralel dari Bjarne Stroustrup yang karena perbedaan antara java dan c ++ mungkin hanya menambah kebingungan. Saya akan membiarkan jawaban saya tetap di JLS :)
sumber
Iya
Sangat penting untuk menyadari bahwa sementara ada yang dua kelas, hanya ada satu objek.
Jadi, ya, tentu saja itu mewarisi bidang pribadi. Mereka, mungkin, penting untuk fungsionalitas objek yang tepat, dan sementara objek dari kelas induk bukan objek dari kelas turunan, turunan dari kelas turunan sebagian besar jelas merupakan turunan dari kelas induk. Tidak mungkin tanpa semua bidang.
Tidak, Anda tidak dapat mengaksesnya secara langsung. Ya, mereka diwariskan. Mereka harus menjadi.
Itu pertanyaan yang bagus!
Memperbarui:
Err, "Tidak"
Yah, kurasa kita semua belajar sesuatu. Karena JLS berasal kata-kata "tidak diwarisi" yang tepat, maka benar untuk menjawab "tidak" . Karena subkelas tidak dapat mengakses atau memodifikasi bidang pribadi, maka, dengan kata lain, mereka tidak diwarisi. Tapi benar - benar hanya ada satu objek, itu benar - benar berisi bidang pribadi, dan jadi jika seseorang mengambil JLS dan tutorial dengan cara yang salah, akan sangat sulit untuk memahami OOP, objek Java, dan apa yang sebenarnya terjadi.
Perbarui untuk memperbarui:
Kontroversi di sini melibatkan ambiguitas mendasar: apa sebenarnya yang sedang dibahas? The objek? Atau apakah kita berbicara tentang kelas itu sendiri? Banyak garis lintang diperbolehkan ketika menggambarkan kelas sebagai lawan dari objek. Jadi subclass tidak mewarisi bidang pribadi, tetapi objek yang merupakan turunan dari subclass tentu saja mengandung bidang pribadi.
sumber
car
, dia menyimpannya diprivate
loker yang anak itu tidak punya kunci. Anda memang mewarisicar
tetapi tidak berguna bagi Anda. Jadi, praktisnya, Anda tidak diuntungkan oleh warisan.Tidak. Bidang pribadi tidak diwariskan ... dan itulah sebabnya Dilindungi diciptakan. Itu adalah dengan desain. Saya kira ini membenarkan adanya pengubah yang dilindungi.
Sekarang sampai pada konteksnya. Apa yang Anda maksud dengan diwarisi - jika ada di objek yang dibuat dari kelas turunan? ya itu.
Jika Anda maksud, apakah itu berguna untuk kelas turunan. Ya tidak.
Sekarang, ketika Anda datang ke pemrograman fungsional bidang pribadi kelas super tidak diwarisi dengan cara yang berarti untuk subkelas . Untuk subkelas, bidang pribadi kelas super sama dengan bidang pribadi kelas lainnya.
Secara fungsional, itu tidak diwariskan. Tapi idealnya , itu.
OK, lihat saja tutorial Java yang mereka kutip:
lihat: http://download.oracle.com/javase/tutorial/java/IandI/subclasses.html
Saya setuju, bahwa bidangnya ada di sana. Tapi, subkelas tidak mendapatkan hak istimewa di bidang pribadi itu. Untuk subkelas, bidang pribadi sama dengan bidang pribadi apa pun dari kelas lain.
Saya percaya ini murni masalah sudut pandang. Anda dapat membentuk argumen di kedua sisi. Lebih baik membenarkan kedua cara.
sumber
I believe it's purely matter of point-of-view.
danjustified the existence of protected modifier.
Itu tergantung pada definisi Anda tentang "warisan". Apakah subkelas masih memiliki bidang dalam memori? Pastinya. Bisakah itu mengaksesnya secara langsung? Tidak. Ini hanya seluk-beluk definisi; intinya adalah untuk memahami apa yang sebenarnya terjadi.
sumber
Saya akan menunjukkan konsep dengan kode. Subkelas SEBENARNYA mewarisi variabel pribadi kelas super. Satu-satunya masalah adalah mereka tidak dapat diakses oleh objek anak kecuali Anda memberikan getter dan setter publik untuk variabel pribadi di kelas super.
Pertimbangkan dua kelas dalam paket Dump. Anak meluas Orangtua.
Jika saya ingat dengan benar, objek anak dalam memori terdiri dari dua wilayah. Satu adalah bagian orangtua saja dan yang lain adalah bagian anak saja. Seorang anak dapat mengakses bagian pribadi dalam kode induknya hanya melalui metode publik di induknya.
Pikirkan seperti ini. Ayah Borat, Boltok, memiliki brankas berisi $ 100.000. Dia tidak ingin berbagi variabel "pribadi" amannya. Jadi, dia tidak menyediakan kunci untuk brankas. Borat mewarisi brankas. Tapi, apa gunanya jika dia bahkan tidak bisa membukanya? Andai saja ayahnya yang menyediakan kuncinya.
Induk -
Anak -
sumber
Tidak. Mereka tidak mewarisinya.
Fakta bahwa beberapa kelas lain mungkin menggunakannya secara tidak langsung tidak mengatakan apa-apa tentang warisan, tetapi tentang enkapsulasi.
Misalnya:
Anda juga bisa mendapatkan nilai dari
count
dalamUseIt
melalui refleksi. Itu tidak berarti, Anda mewarisinya.MEMPERBARUI
Meskipun nilainya ada, itu tidak diwarisi oleh subclass.
Misalnya subclass didefinisikan sebagai:
Ini persis situasi yang sama dengan contoh pertama. Atribut
count
disembunyikan dan tidak diwarisi oleh subclass sama sekali. Namun, seperti yang ditunjukkan DigitalRoss, nilainya ada di sana, tetapi tidak dengan warisan.Begini. Jika ayahmu kaya dan memberimu kartu kredit, kamu masih bisa membeli barang dengan uangnya, tetapi tidak berarti kamu mewarisi semua uang itu, bukan?
Pembaruan lainnya
Sangat menarik untuk mengetahui mengapa atribut itu ada.
Saya terus terang tidak memiliki istilah yang tepat untuk menggambarkannya, tetapi JVM dan cara kerjanya memuat juga definisi induk "tidak diwariskan".
Kami benar-benar dapat mengubah induk dan subkelas akan tetap berfungsi.
Misalnya :
Saya kira istilah yang tepat dapat ditemukan di sini: Spesifikasi Mesin Virtual JavaTM
sumber
encapsulation
vsinherit
, saya kira jawaban ini pantas mendapatkan suara lebih banyak.Baiklah, jawaban saya untuk pertanyaan pewawancara adalah - Anggota pribadi tidak diwariskan dalam sub-kelas tetapi mereka dapat diakses oleh subclass atau objek subclass hanya melalui metode pengambil atau penyetel publik atau metode yang sesuai seperti kelas asli. Praktik normal adalah menjaga anggota tetap pribadi dan mengaksesnya menggunakan metode pengambil dan penyetel yang bersifat publik. Jadi apa gunanya hanya mewarisi metode pengambil dan penyetel ketika anggota pribadi yang mereka hadapi tidak tersedia untuk objek? Di sini 'warisan' berarti tersedia langsung di sub-kelas untuk bermain-main dengan metode yang baru diperkenalkan di sub-kelas.
Simpan file di bawah ini sebagai ParentClass.java dan coba sendiri ->
Jika kita mencoba menggunakan variabel pribadi x ParentClass dalam metode SubClass maka itu tidak dapat diakses secara langsung untuk modifikasi apa pun (berarti tidak diwariskan). Tetapi x dapat dimodifikasi dalam SubClass melalui metode setX () kelas asli seperti yang dilakukan dalam metode setXofParent () ATAU dapat dimodifikasi menggunakan objek ChildClass menggunakan metode setX () atau metode setXofParent () yang akhirnya memanggil setX (). Jadi di sini setX () dan getX () adalah jenis gerbang untuk anggota pribadi x dari ParentClass.
Contoh sederhana lainnya adalah Clock superclass memiliki jam dan menit sebagai anggota pribadi dan metode pengambil dan penyetel yang sesuai sebagai publik. Kemudian hadir DigitalClock sebagai sub-kelas Clock. Di sini, jika objek DigitalClock tidak mengandung anggota jam dan menit maka hal-hal yang kacau.
sumber
Ok, ini adalah masalah yang sangat menarik yang saya teliti dan sampai pada kesimpulan bahwa anggota pribadi dari superclass memang tersedia (tetapi tidak dapat diakses) di objek subclass. Untuk membuktikan ini, berikut adalah contoh kode dengan kelas induk dan kelas anak dan saya menulis objek kelas anak ke file txt dan membaca anggota pribadi bernama 'bhavesh' di file, maka membuktikannya memang tersedia di anak kelas tetapi tidak dapat diakses karena pengubah akses.
Buka MyData1.txt dan cari anggota pribadi bernama 'bhavesh'. Tolong beri tahu saya apa yang kalian pikirkan.
sumber
Tampaknya suatu subclass memang mewarisi bidang privat di mana bidang-bidang ini digunakan dalam kerja dalam subclass (berbicara secara filosofis). Subclass, dalam konstruktornya, memanggil konstruktor superclass. Bidang pribadi superclass jelas diwarisi oleh subclass memanggil konstruktor superclass jika konstruktor superclass menginisialisasi bidang ini dalam konstruktornya. Itu hanya sebuah contoh. Tapi tentu saja tanpa metode accessor, subclass tidak dapat mengakses bidang privat superclass (rasanya seperti tidak bisa melompati panel belakang iPhone untuk mengeluarkan baterai untuk mengatur ulang ponsel ... tetapi baterai masih ada di sana).
PS Salah satu dari banyak definisi pewarisan yang saya temui: "Warisan - teknik pemrograman yang memungkinkan kelas turunan untuk memperluas fungsionalitas kelas dasar, mewarisi semua NEGARA (penekanannya adalah milik saya) dan perilaku."
Bidang pribadi, bahkan jika tidak dapat diakses oleh subclass, adalah status warisan dari superclass.
sumber
Saya harus menjawab bahwa bidang swasta di Jawa yang diwariskan. Izinkan saya menunjukkan:
Jika Anda menjalankan program
Bar bar = new Bar();
, maka Anda akan selalu melihat angka "2" di kotak output. Karena integer "x" dienkapsulasi dengan metodeupdate()
dangetX()
, maka dapat dibuktikan bahwa integer diwarisi.Kebingungannya adalah karena Anda tidak dapat secara langsung mengakses bilangan bulat "x", maka orang berpendapat bahwa itu bukan warisan. Namun, setiap hal non-statis di kelas, baik itu bidang atau metode, diwariskan.
sumber
Padding bits / Alignment dan dimasukkannya Object Class dalam VTABLE tidak dipertimbangkan. Jadi objek dari subclass memang memiliki tempat untuk anggota pribadi dari kelas Super. Namun, itu tidak dapat diakses dari objek subclass ...
sumber
Tidak , bidang pribadi tidak diwariskan. Satu-satunya alasan adalah bahwa subclass tidak dapat mengaksesnya secara langsung .
sumber
Saya percaya, jawaban sepenuhnya tergantung pada pertanyaan, yang telah ditanyakan. Maksud saya, jika pertanyaannya
Maka jawabannya adalah Tidak , jika kita pergi melalui rincian penentu akses , disebutkan, anggota pribadi hanya dapat diakses di dalam kelas itu sendiri.
Tapi, jika pertanyaannya
Yang berarti, tidak masalah, apa yang akan Anda lakukan untuk mengakses anggota pribadi. Dalam hal ini, kita dapat membuat metode publik di kelas-super dan Anda dapat mengakses anggota pribadi. Jadi, dalam hal ini Anda membuat satu antarmuka / jembatan untuk mengakses anggota pribadi.
Bahasa OOP lainnya seperti C ++, memiliki
friend function
konsep, dimana kita dapat mengakses anggota pribadi dari kelas lain.sumber
Kita dapat dengan mudah menyatakan bahwa ketika sebuah superclass diwarisi, maka anggota pribadi dari superclass sebenarnya menjadi anggota pribadi dari subclass dan tidak dapat diwarisi lebih lanjut atau tidak dapat diakses oleh objek-objek dari subclass.
sumber
Anggota kelas pribadi atau konstruktor hanya dapat diakses di dalam tubuh kelas tingkat atas ( §7.6 ) yang melampirkan pernyataan anggota atau konstruktor. Itu tidak diwarisi oleh subclass. https://docs.oracle.com/javase/specs/jls/se7/html/jls-6.html#jls-6.6
sumber
Subkelas tidak mewarisi anggota pribadi dari kelas induknya. Namun, jika superclass memiliki metode publik atau yang dilindungi untuk mengakses bidang pribadinya, ini juga dapat digunakan oleh subkelas.
sumber
Anggota pribadi (negara bagian dan perilaku) diwariskan. Mereka (dapat) mempengaruhi perilaku dan ukuran objek yang dipakai oleh kelas. Belum lagi bahwa mereka sangat terlihat oleh subkelas melalui semua mekanisme pemecahan encaptulation yang tersedia, atau dapat diasumsikan oleh pelaksana mereka.
Meskipun warisan memiliki definisi "defacto", itu jelas tidak memiliki tautan ke aspek "visibilitas", yang diasumsikan oleh jawaban "tidak".
Jadi, tidak perlu diplomatis. JLS salah pada saat ini.
Asumsi bahwa mereka tidak "diwariskan" tidak aman dan berbahaya.
Jadi di antara dua defacto (sebagian) definisi yang saling bertentangan (yang tidak akan saya ulangi), satu-satunya yang harus diikuti adalah yang lebih aman (atau aman).
sumber