Pregunta

En java, hay tres niveles de acceso:

  • Público: abierto al mundo
  • Privado: abierto solo a la clase
  • Protegido: abierto solo a la clase y sus subclases (herencia).

Entonces, ¿por qué el compilador de Java permite que esto suceda?

TestBlah.java:

public class TestBlah {

    public static void main(String[] args) {
        Blah a = new Blah("Blah");
        Bloo b = new Bloo("Bloo");
        System.out.println(a.getMessage());
        System.out.println(b.getMessage()); //Works
        System.out.println(a.testing);
        System.out.println(b.testing); //Works
    }
}

Blah.java:

public class Blah {
    protected String message;

    public Blah(String msg) {
        this.message = msg;
    }

    protected String getMessage(){
        return(this.message);
    }   
}

Bloo.java:

public class Bloo extends Blah {
    public Bloo(String testing) {
        super(testing);
    }
}
¿Fue útil?

Solución

En realidad debería ser:

  

Abierto solo a las clases en el mismo paquete la clase y sus subclases (herencia)

Por eso

Otros consejos

Porque protegido significa subclase u otras clases en el mismo paquete.

Y en realidad hay un cuarto " predeterminado " nivel de acceso, cuando se omite el modificador, que proporciona acceso a otras clases en el mismo paquete.

Entonces protegido está entre el acceso predeterminado y público .

Para ser más específico, espera que protegido funcione como lo hace en C ++.

Sin embargo, en Java, tiene un significado diferente. En Java, un método protegido está disponible para la clase (obviamente), todas las demás clases en el mismo paquete y cualquier subclase de esta clase. Las clases en otros paquetes no tendrán acceso a menos que subclasifiquen esta clase original.

Ver esta pregunta similar para obtener información más específica sobre marcadores de herencia.

Personalmente, casi nunca uso protegido . Desarrollo aplicaciones en lugar de frameworks, por lo que es mucho más probable que defina métodos public , private y, con bastante frecuencia, marque toda mi clase como final .

En realidad, hay cuatro niveles de acceso: "público", "protegido", "privado". &erio; predeterminado también conocido como paquete privado o paquete protegido. El valor predeterminado limita la accesibilidad al paquete. El valor predeterminado es bastante útil y lo uso con frecuencia.

Puede llamar a b.getMessage () porque b es de tipo Bloo , que extiende Blah y getMessage () está protegido. Protegido, como mencionó, permite que las subclases accedan al método.

Sin embargo, tiene los siguientes errores:

  • Llamar a super () sin argumentos en el constructor Bloo es un error. El compilador no puede encontrar el constructor Blah sin parámetros porque definió uno con un parámetro String.
  • Llamar a new Blah () en TestBlah main es un error por el mismo motivo que el anterior.
  • Hacer referencia a a.testing y b.testing es un error porque no definió la variable testing para ninguna clase.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top