una por defecto crear como clase java protected access-modifiers

java - defecto - ¿Por qué no puedo usar constructores protegidos fuera del paquete?



como crear una clase en java netbeans (3)

De hecho, ya está utilizando el constructor protegido del Ejemplo porque Check tiene un constructor implícito y una llamada implícita del constructor del Ejemplo:

public Check() { super(); }

Esta pregunta ya tiene una respuesta aquí:

¿Por qué no puedo usar constructores protegidos fuera del paquete para esta pieza de código:

package code; public class Example{ protected Example(){} ... }

Cheque.java

package test; public class Check extends Example { void m1() { Example ex=new Example(); //compilation error } }

  1. ¿Por qué recibo el error aunque haya extendido la clase? Por favor explique

EDITAR:

Error de compilación:

El constructor Ejemplo () no es visible


Usualmente protected significa solo accesible a subclases o clases en el mismo paquete. Sin embargo, aquí están las reglas para los constructores de JLS:

6.6.2.2. Acceso calificado a un constructor protegido

Sea C la clase en la que se declara un constructor protegido y S sea la clase más interna en cuya declaración se produce el uso del constructor protegido. Entonces:

Si el acceso es mediante una invocación del constructor de superclase super (...), o una invocación del constructor de superclase calificado E.super (...), donde E es una expresión primaria, entonces se permite el acceso.

Si el acceso es mediante una expresión de creación de instancia de clase anónima nueva C (...) {...}, o una expresión de creación de instancia de clase anónima calificada E.new C (...) {...}, donde E es Una expresión primaria, entonces el acceso está permitido.

Si el acceso es mediante una expresión de creación de instancia de clase simple nueva C (...), o una expresión de creación de instancia de clase calificada E.new C (...), donde E es una expresión principal, o una expresión de referencia de método C: : nuevo, donde C es un ClassType, entonces el acceso no está permitido. Se puede acceder a un constructor protegido mediante una expresión de creación de instancia de clase (que no declara una clase anónima) o una expresión de referencia de método solo desde el paquete en el que está definido.

Como ejemplo, esto no compila

public class Example extends Exception { void method() { Exception e = new Exception("Hello", null, false, false); } }

pero esto hace

public class Example extends Exception { Example() { super("Hello", null, false, false); } }

y esto también

public class Example { void method() { Exception e = new Exception("Hello", null, false, false) {}; } }

Así que las reglas son claras, pero no puedo decir que entiendo las razones detrás de ellas.


el modificador protegido se usa solo en el paquete y en las subclases fuera del paquete. Cuando creas un objeto usando Example ex=new Example(); llamará al constructor de la clase padre por defecto.

Como el constructor de la clase padre que se está protegiendo está obteniendo un error de tiempo de compilación. Debe llamar al constructor protegido de acuerdo con JSL 6.6.2.2 como se muestra a continuación en el ejemplo 2.

package Super; public class SuperConstructorCall { protected SuperConstructorCall() { } } package Child; import Super.SuperConstructorCall; public class ChildCall extends SuperConstructorCall { public static void main(String[] args) { SuperConstructorCall s = new SuperConstructorCall(); // Compile time error saying SuperConstructorCall() has protected access in SuperConstructorCall } }

Ejemplo 2 conforme a JLS 6.6.2.2 :

package Super; public class SuperConstructorCall { protected SuperConstructorCall() { } } package Child; import Super.SuperConstructorCall; public class ChildCall extends SuperConstructorCall { public static void main(String[] args) { SuperConstructorCall s = new SuperConstructorCall(){}; // This will work as the access is by an anonymous class instance creation expression } }