Qual è il modificatore di accesso del costruttore predefinito in Java?

2022-07-29 11:30:35

Sappiamo tutti che se non definiamo in modo specifico un costruttore, il compilatore inserisce un costruttore invisibile a parametro zero. Pensavo che il suo modificatore di accesso fosse pubblico, ma nell'affrontare un problema di classe interna, ho scoperto che forse mi sbagliavo. Ecco il mio codice:

public class Outer {
  protected class ProtectedInner {
    // adding a public constructor will solve the error in SubOuterInAnotherPackage class
    //public ProtectedInner() {}
  }
}

E c'è una sottoclasse di Outer in un altro pacchetto:

public class SubOuterInAnotherPackage extends Outer {
  public static void main(String[] args) {
    SubOuterInAnotherPackage.ProtectedInner protectedInner 
      = new SubOuterInAnotherPackage().new ProtectedInner(); // Error!! Can't access the default constructor
  }
}

Otterrai un errore nel metodo main(), ma se aggiungi un costruttore pubblico alla classe ProtectedInner, l'errore viene risolto. Ecco perché sto pensando che il modificatore del costruttore predefinito non sia pubblico! Quindi qualcuno potrebbe dirmi qual è il modificatore di accesso del costruttore predefinito?

- jason

Source
Risposta


31
  • Pensavo che il suo modificatore di accesso fosse pubblico, ma quando affronto un problema di classe interna, ho scoperto che forse mi sbagliavo.

    Sì. In effetti, mi sono trovato nella stessa situazione un paio di anni fa. Sono stato sorpreso da un errore (tramite l'iniezione di Guice, che ha reso leggermente più difficile trovarlo).

    La chiave è controllare le specifiche, in questo caso sezione 8.8.9:

    In un tipo di classe, se la classe è dichiarata public, allora al costruttore predefinito viene assegnato implicitamente il modificatore di accesso public (§6.6); se la classe è dichiarata protetta, allora al costruttore predefinito viene assegnato implicitamente il modificatore di accesso protetto (§6.6); se la classe è dichiarata privata, allora al costruttore predefinito viene assegnato implicitamente il modificatore di accesso private (§6.6); in caso contrario, il costruttore predefinito ha l'accesso predefinito implicito in nessun modificatore di accesso.

    Quindi, in questo caso, il tuo costruttore è implicitamente protected.