Apakah subclass mewarisi bidang pribadi?


245

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?


33
Saya berada dalam situasi yang sama sekali dan saya menyadari bahwa saya bahkan tidak ingin bekerja untuk sebuah perusahaan di mana pewawancara kurang tahu tentang Jawa daripada saya. :)
biziclop

48
Pewawancara terkadang tidak setuju dengan Anda bahkan ketika dia tahu Anda benar. Pewawancara yang baik akan mencoba mempelajari lebih banyak tentang Anda daripada pengetahuan teknis Anda.
Andy Thomas

4
@DigitalRoss Apakah Spesifikasi Bahasa Jawa juga ditulis dengan buruk? Lihat jawaban RD01: stackoverflow.com/questions/4716040/...
OscarRyz

9
@Andy Thomas-Cramer Saya tidak ingin bekerja dengan orang-orang yang dengan sengaja berbohong untuk menguji reaksi saya.
biziclop

4
Yah, saya pikir kita harus mencari tahu arti "warisan" di Jawa. Subclass tidak memiliki bidang pribadi dan subclass memiliki bidang pribadi tetapi tidak dapat mengaksesnya berbeda, mana yang merujuk pada makna yang tepat dari warisan di Jawa?
MengT

Jawaban:


238

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 ):

Anggota kelas yang dinyatakan pribadi tidak diwarisi oleh subclass dari kelas itu. Hanya anggota kelas yang dinyatakan dilindungi atau publik yang diwarisi oleh subclass yang dideklarasikan dalam paket selain paket yang mendeklarasikan kelas tersebut.

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 :)


3
@ digital mengapa menghela nafas. Saya mengerti Anda percaya Anda benar. Saya tidak setuju dengan Anda bahwa warisan objek adalah apa yang diajarkan / dipikirkan oleh sebagian besar programmer. Tetapi definisi JLS berlaku langsung ke pertanyaan awal. Ini semantik ya, tetapi JLS menentukan definisi, bukan Anda atau saya.
robert_x44

4
Salah satu cara untuk merekonsiliasi semua ini adalah dengan hanya mengakui bahwa kata "pewarisan" digunakan dalam dua cara yang sangat berbeda untuk menggambarkan hubungan kelas turunan dan kelas induk, setidaknya di dunia Jawa. Ya, JSL adalah otoritatif. Ya, itu berarti Anda dapat menggunakan "warisan" dengan cara yang tidak menguntungkan. Tapi itu masih benar nyata bahwa subclass berbondong-bondong (karena sekarang kita tidak punya kata) bidang pribadi dari kelas induknya.
DigitalRoss

1
@ digital Mereka berada di objek kelas. bukan kelas itu sendiri. Simula menyebut mereka objek bersambung. Ketika sebuah objek subclass dibuat, itu terdiri dari 'objek awalan' yang disatukan. Objek superclass adalah objek awalan yang dengan sendirinya dapat berisi objek awalan lainnya. Saya pikir itu adalah kesombongan untuk mengatakan bahwa JLS memiliki "kata-kata yang jelas buruk". Adapun kata apa yang kita gunakan, warisan tentu saja. Tidak ada yang salah dengan menggunakan terminologi yang sedikit ambigu. Itu terjadi setiap saat. Tetapi itu tidak berarti tidak ada definisi yang tepat.
robert_x44

1
@ digital Kita tentu saja setuju bahwa kata tersebut digunakan dengan cara yang berbeda. :) Kami juga mungkin setuju bahwa pertanyaan wawancara yang tergantung pada istilah yang mendua mungkin bukan yang baik.
robert_x44

2
Adakah yang memiliki referensi dari Java / Oracle untuk "Objek subclass berisi bidang pribadi superclasses mereka"? Saya setuju dengan ini, tetapi tidak dapat menemukan dokumen resmi yang mengatakan itu.
MengT

78

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.


2
@ Ma99uS. Tentu saja mereka digunakan kembali. Itulah inti warisan. Tanpa mereka tipe turunan tidak akan dan tidak bisa menjadi turunan dari tipe induk. OOP akan menjadi tidak berarti. Jenis polimorfik akan berhenti bekerja . Memahami bahwa hanya ada satu objek dan Anda ADALAH contoh dari tipe induk sangat penting untuk memahami OOP. Anda harus melewati masalah ini untuk memahaminya sama sekali.
DigitalRoss

2
Tidak yakin contoh ayah sangat baik karena bidang dapat diwariskan sementara kelas induk masih hidup dan juga memiliki bidang itu. Jika warisan bekerja dengan cara itu saya bisa mewarisi uang ayah saya ketika dia masih hidup dan dia bisa menyimpan uang yang sama juga. Anak-anak saya masing-masing akan memiliki uang dan uang saya.
Peter Lawrey

2
@Peter Lawrey tidak berdebat atau apa pun, tapi inilah yang saya pikirkan. Orang tua punya car, dia menyimpannya di privateloker yang anak itu tidak punya kunci. Anda memang mewarisi cartetapi tidak berguna bagi Anda. Jadi, praktisnya, Anda tidak diuntungkan oleh warisan.
Nishant

1
@DigitalRoss. Saya mengerti maksud Anda. Mhh, bisa dibilang nilainya ada karena definisi induk tidak diturunkan juga dimuat. :) Saya pikir spec JVM akan memiliki jawaban yang benar untuk "NO WORD" yang kami cari. java.sun.com/docs/books/jvms
OscarRyz

5
-1, Spesifikasi Bahasa Jawa secara jelas menjelaskan bahwa mereka tidak diwariskan. Tidak ada, tidak ada tapi. Mereka sama sekali tidak. Definisi turunan lainnya salah dalam konteks Jawa.
biziclop

21

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:

Anggota Pribadi dalam Kelas Super

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.

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.

 


2
Ini tidak benar. Anda tidak dapat mengaksesnya, itu benar. Tetapi mereka harus diwariskan seperti yang telah saya jelaskan.
DigitalRoss

1
jawaban yang bagus !!! +1 untuk I believe it's purely matter of point-of-view.danjustified the existence of protected modifier.
Ravi

14

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.


Benar. Tetapi saya pikir dalam pertanyaan mendasar seperti itu harus ada jawaban bersama)
Stan Kurilin

Saya pikir itu adalah definisi warisan Java.
OscarRyz

Atau tergantung pada definisi Anda tentang "bidang". Untuk mendefinisikan bidang bilangan bulat "foo" adalah dengan menyewa loker penyimpanan berukuran integer dan menaruh tanda "foo" di atasnya. Jika bidang dinyatakan pribadi, kelas turunan mewarisi loker penyimpanan berukuran bilangan bulat berlabel. Apakah kelas turunan mewarisi "bidang" tergantung pada apakah seseorang menyebut loker penyimpanan yang tidak berlabel sebagai "bidang".
supercat

10

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 -

package Dump;

public class Parent {

    private String reallyHidden;
    private String notReallyHidden;

    public String getNotReallyHidden() {
        return notReallyHidden;
    }

    public void setNotReallyHidden(String notReallyHidden) {
        this.notReallyHidden = notReallyHidden;
    }

}//Parent

Anak -

package Dump;

public class Child extends Parent {

    private String childOnly;

    public String getChildOnly() {
        return childOnly;
    }

    public void setChildOnly(String childOnly) {
        this.childOnly = childOnly;
    }

    public static void main(String [] args){

        System.out.println("Testing...");
        Child c1 = new Child();
        c1.setChildOnly("childOnly");
        c1.setNotReallyHidden("notReallyHidden");

        //Attempting to access parent's reallyHidden
            c1.reallyHidden;//Does not even compile

    }//main

}//Child

10

Tidak. Mereka tidak mewarisinya.

Fakta bahwa beberapa kelas lain mungkin menggunakannya secara tidak langsung tidak mengatakan apa-apa tentang warisan, tetapi tentang enkapsulasi.

Misalnya:

class Some { 
   private int count; 
   public void increment() { 
      count++;
   }
   public String toString() { 
       return Integer.toString( count );
   }
}

class UseIt { 
    void useIt() { 
        Some s = new Some();
        s.increment();
        s.increment();
        s.increment();
        int v = Integer.parseInt( s.toString() );
        // hey, can you say you inherit it?
     }
}

Anda juga bisa mendapatkan nilai dari countdalam UseItmelalui refleksi. Itu tidak berarti, Anda mewarisinya.

MEMPERBARUI

Meskipun nilainya ada, itu tidak diwarisi oleh subclass.

Misalnya subclass didefinisikan sebagai:

class SomeOther extends Some { 
    private int count = 1000;
    @Override
    public void increment() { 
        super.increment();
        count *= 10000;
    }
}

class UseIt { 
    public static void main( String ... args ) { 
        s = new SomeOther();
        s.increment();
        s.increment();
        s.increment();
        v = Integer.parseInt( s.toString() );
        // what is the value of v?           
     }
}

Ini persis situasi yang sama dengan contoh pertama. Atribut countdisembunyikan 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 :

//A.java
class A {
   private int i;
   public String toString() { return ""+ i; }
}
// B.java
class B extends A {}
// Main.java
class Main {
   public static void main( String [] args ) {
      System.out.println( new B().toString() );
    }
}
// Compile all the files
javac A.java B.java Main.java
// Run Main
java Main
// Outout is 0 as expected as B is using the A 'toString' definition
0

// Change A.java
class A {
   public String toString() {
      return "Nothing here";
   }
}
// Recompile ONLY A.java
javac A.java
java Main
// B wasn't modified and yet it shows a different behaviour, this is not due to 
// inheritance but the way Java loads the class
Output: Nothing here

Saya kira istilah yang tepat dapat ditemukan di sini: Spesifikasi Mesin Virtual JavaTM


:) Lain kali Anda dapat mengambil kesempatan untuk menjelaskan pewawancara Anda di mana dia salah, dan ini dapat memberi Anda poin ekstra;) Jelas Anda harus melakukan ini dengan cara diplomatik yang benar.
OscarRyz

1
Mereka harus diwarisi untuk tipe polimorfik agar memiliki makna sama sekali. Lihat penjelasan saya. Memang benar Anda tidak bisa bermain-main dengan mereka, tetapi mereka ada di sana. Mereka harus menjadi.
DigitalRoss

Tidak ada kata kunci inheritance (extends / implements) dalam kode Anda, jadi itu bukan contoh pewarisan.
fmucar

1
Uhh, jika mereka ada di sana, bagaimana mereka sampai di sana? Karena subkelas mendefinisikannya? Tidak. Karena mereka, uhh, hmm, err, diwarisi ?
DigitalRoss

1
Poin bagus di encapsulationvs inherit, saya kira jawaban ini pantas mendapatkan suara lebih banyak.
Eric Wang

6

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 ->

public class ParentClass {
  private int x;

  public int getX() {
    return x;
  }

  public void setX(int x) {
    this.x = x;
  }
}

class SubClass extends ParentClass {
  private int y;

  public int getY() {
    return y;
  }

  public void setY(int y) {
    this.y = y;
  }

  public void setXofParent(int x) {
    setX(x); 
  }
}

class Main {
  public static void main(String[] args) {
    SubClass s = new SubClass();
    s.setX(10);
    s.setY(12);
    System.out.println("X is :"+s.getX());
    System.out.println("Y is :"+s.getY());
    s.setXofParent(13);
    System.out.println("Now X is :"+s.getX());
  }
}

Output:
X is :10
Y is :12
Now X is :13

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.


2
Sesuai Oracle doc - Subclass 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.
dganesh2002

4

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.

import java.io.Serializable;
public class ParentClass implements Serializable {
public ParentClass() {

}

public int a=32131,b,c;

private int bhavesh=5555,rr,weq,refw;
}

import java.io.*;
import java.io.Serializable;
public class ChildClass extends ParentClass{
public ChildClass() {
super();
}

public static void main(String[] args) {
ChildClass childObj = new ChildClass();
ObjectOutputStream oos;
try {
        oos = new ObjectOutputStream(new FileOutputStream("C:\\MyData1.txt"));
        oos.writeObject(childObj); //Writing child class object and not parent class object
        System.out.println("Writing complete !");
    } catch (IOException e) {
    }


}
}

Buka MyData1.txt dan cari anggota pribadi bernama 'bhavesh'. Tolong beri tahu saya apa yang kalian pikirkan.


3

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.


1

Saya harus menjawab bahwa bidang swasta di Jawa yang diwariskan. Izinkan saya menunjukkan:

public class Foo {

    private int x; // This is the private field.

    public Foo() {
        x = 0; // Sets int x to 0.
    }

    //The following methods are declared "final" so that they can't be overridden.
    public final void update() { x++; } // Increments x by 1.
    public final int getX() { return x; } // Returns the x value.

}


public class Bar extends Foo {

    public Bar() {

        super(); // Because this extends a class with a constructor, it is required to run before anything else.

        update(); //Runs the inherited update() method twice
        update();
        System.out.println(getX()); // Prints the inherited "x" int.

    }

}

Jika Anda menjalankan program Bar bar = new Bar();, maka Anda akan selalu melihat angka "2" di kotak output. Karena integer "x" dienkapsulasi dengan metode update()dan getX(), 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.


3
"Berisi" tidak berarti "warisan";)
Stan Kurilin

1

Memory Layout di Java vis-a-vis pewarisan

masukkan deskripsi gambar di sini

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 ...


1

Tidak , bidang pribadi tidak diwariskan. Satu-satunya alasan adalah bahwa subclass tidak dapat mengaksesnya secara langsung .


0

Saya percaya, jawaban sepenuhnya tergantung pada pertanyaan, yang telah ditanyakan. Maksud saya, jika pertanyaannya

Bisakah kita langsung mengakses bidang pribadi kelas super dari sub kelasnya?

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

Bisakah kita mengakses bidang pribadi kelas super dari sub kelasnya?

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 functionkonsep, dimana kita dapat mengakses anggota pribadi dari kelas lain.


0

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.



-1

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.


-2

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).


1
-1. JLS mendefinisikan bahasa, tidak mungkin bagi JLS untuk menjadi "salah". Juga, jika ada mekanisme yang memecah enkapsulasi, itu tidak berarti bidang tersebut diwarisi; hanya bahwa ada mekanisme yang menumbangkan enkapsulasi.
SL Barth - Reinstate Monica

Definisi dapat dengan sendirinya salah dalam beberapa hal. Membahas lebih lanjut tentang ini bukan maksud saya. Argumen di sini bukan pada mekanisme yang memecah enkapsulasi (seperti tuhan atau buruk), tetapi pada kenyataannya bidang / metode ada di sana, mempengaruhi perilaku dan keadaan subkelas Anda. Jadi itu "diwariskan". Seseorang dapat menggunakan array byte pribadi 100kb di kelas dan hanya berasumsi bahwa keturunannya (jumbo) tidak mewarisinya. Jangan melewatkan poin dan menilai ini sebagai praktik yang baik atau buruk (berlebihan membantu membuat titik): itu adalah tindakan yang diramalkan, sah. Anggota pribadi "diwariskan".
gkakas
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.