web-dev-qa-db-fra.com

Déclaration de classe privée

Duplicata possible:
Java: Pourquoi pouvons-nous définir une classe de niveau supérieur comme privée?

Pourquoi ne pouvons-nous pas déclarer une classe externe privée ? Si nous pouvons avoir une classe privée interne, alors pourquoi ne pouvons-nous pas avoir une classe privée externe ...?

21
T__

La classe extérieure privée serait inutile car rien ne peut y accéder.

Voir plus de détails:

Java: Pourquoi pouvons-nous définir une classe de niveau supérieur comme privée?

20
Amit

Pour répondre à ta question:

Si nous pouvons avoir une classe privée interne, alors pourquoi ne pouvons-nous pas avoir une classe privée externe ...?

Vous pouvez, la distinction est que la classe interne est au niveau d'accès "classe", tandis que la classe "externe" est au niveau d'accès "package". À partir de Oracle Tutorials :

Si une classe n'a pas de modificateur (la valeur par défaut, également connue sous le nom de package-private), elle n'est visible que dans son propre package (les packages sont nommés groupes de classes liées - vous en apprendrez plus à leur sujet dans une leçon ultérieure.)

Ainsi, package-private (ne déclarer aucun modificateur) est l'effet que vous attendez de déclarer une classe "externe" privée, la syntaxe est juste différente.

10
stevebot

private modificateur rendra votre classe inaccessible de l'extérieur, donc il n'y aurait aucun avantage à cela et je pense que c'est pourquoi il est illégal et seulement public, abstract & final sont autorisés.

Remarque: Même vous ne pouvez pas le faire protected.

9

Vous pouvez.

package test;

public class Test {
    public static void main(String[] args) {
        B b = new B();
    }
}

class B {
  // Essentially package-private - cannot be accessed anywhere else but inside the `test` package
}
3
OldCurmudgeon

Vous ne pouvez pas avoir la classe private mais vous pouvez avoir la classe second:

public class App14692708 {
    public static void main(String[] args) {
        PC pc = new PC();
        System.out.println(pc);
    }
}

class PC {
    @Override
    public String toString() {
        return "I am PC instance " + super.toString();
    }
}

Souvenez-vous également que static classe interne ne peut pas être distinguée d'une classe distincte, sauf que son nom est OuterClass.InnerClass. Donc, si vous ne voulez pas utiliser de "fermetures", utilisez une classe interne statique.

1
Suzan Cioc

private rend la classe accessible uniquement à la classe dans laquelle elle est déclarée. Si nous rendons toute la classe privée, personne de l'extérieur ne peut accéder à la classe et la rend inutile.

La classe interne peut être rendue privée car la classe externe peut accéder à la classe interne, comme ce n'est pas le cas si vous rendez la classe externe privée.

0
Prabhakar