Saltar al contenido

Miembros privados en la herencia de Java

Solución:

No, el miembro privado es no heredado porque el alcance de un miembro privado es solo limitado a la clase en la que se define. Solo se heredan el miembro público y protegido.

Desde el Java Documentation,

Miembros privados en una superclase

Una subclase no hereda los miembros privados de su clase padre. Sin embargo, si la superclase tiene métodos públicos o protegidos para acceder a sus campos privados, estos también pueden ser utilizados por la subclase. Una clase anidada tiene acceso a todos los miembros privados de su clase adjunta, tanto a los campos como a los métodos. Por lo tanto, una clase anidada pública o protegida heredada por una subclase tiene acceso indirecto a todos los miembros privados de la superclase.

Desde el JLS,

Miembros de una clase que se declaran privados no se heredan por subclases de esa clase. Solo los miembros de una clase que están declarados protegidos o públicos son heredados por subclases declaradas en un paquete que no sea aquel en el que se declara la clase.

Un enlace útil: ¿Las subclases heredan campos privados?

Esto depende del uso exacto de la palabra herencia. Lo explicaré con un ejemplo.

Suponga que tiene dos clases: Parent y Child, dónde Child se extiende Parent. También, Parent tiene un entero privado llamado value.

Ahora viene la pregunta: ¿ Child heredar lo privado value? En Java, la herencia es definido de tal forma que la respuesta sea “No”. Sin embargo, en la jerga general de OOP, existe una ligera ambigüedad.

Se podría decir que no heredado, porque en ninguna parte puede Child referirse explícitamente a value. Es decir, cualquier código como this.value no se puede utilizar dentro de Child, ni puede obj.value ser utilizado a partir de algún código de llamada (obviamente).

Sin embargo, en otro sentido, se podría decir que value es heredado. Si considera que cada instancia de Child es también una instancia de Parent, entonces ese objeto debe Contiene value como se define en Parent. Incluso si el Child la clase no sabe nada al respecto, un miembro privado llamado value todavía existe dentro de todas y cada una de las instancias de Child. Entonces, en este sentido, podrías decir que value se hereda en Child.

Entonces, sin usar la palabra “herencia”, recuerde que las clases secundarias no conocen los miembros privados definidos dentro de las clases principales. Pero también recuerde que esos miembros privados todavía existen dentro de las instancias de la clase secundaria.

Quedará satisfecho aquí al 100%. Lo probé en mi computadora y lo que concluí lo voy a publicar aquí. Simplemente revise el programa escrito a continuación, vea el resultado del programa y LEA LA CONCLUSIÓN que se da al final. Para probarlo usted mismo, copie todo el programa y guárdelo en un archivo llamado “InheritanceTest.java”, luego compílelo y finalmente ejecútelo.

Programa

// Testing if a subclass can access the private members of a superclass

class Class1 {
    private String name;

    public void setName(String name) {
        this.name = name;
        System.out.println("The name has been set successfully.");
    }

    public void showName() {
        System.out.println("The name is: " + name);
    }
}

class Class2 extends Class1 {
    private int age;

    public void setAge(int age) {
        this.age = age;
        System.out.println("The age has been set successfully.");
    }

    public void showAge() {
        System.out.println("The age is: " + age);
    }

    public void displayName() {
        //Accessing the private member of superclass here
        //System.out.println("The name is: " + name); //error, can't compile because access to the private member name of the superclass Class1 is not permitted here.
    }
}

class InheritanceTest {
    public static void main(String[] args) {

        Class1 c1 = new Class1();
        Class2 c2 = new Class2();

        c1.setName("Name_C1");
        c2.setName("Name_C2"); //No error, setName() is a public member of the superclass which indirectly gives access to the private member "name".

        c1.showName();
        c2.showName(); //No error, showName() is a public member of the superclass which indirectly gives access to the private member "name".

        c2.setAge(25);
        c2.showAge();

        //c2.displayName(); //error
    }
}

Producción

The name has been set successfully.
The name has been set successfully.
The name is: Name_C1
The name is: Name_C2
The age has been set successfully.
The age is: 25

Conclusión

Sí, una subclase puede acceder indirectamente a los miembros privados de una superclase. Una subclase no puede acceder directamente a los miembros privados de una superclase.

Todos los miembros públicos, privados y protegidos (es decir, todos los campos y métodos) de una superclase son heredados por una subclase, pero la subclase puede acceder directamente solo a los miembros públicos y protegidos de la superclase. Si un miembro heredado de una superclase da acceso a un miembro privado de la superclase, entonces la subclase puede usar este miembro heredado para acceder al miembro privado de la superclase.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *