classes intérieures protégées / publiques

Quelqu’un peut-il m’expliquer s’il vous plaît quelle est la différence entre public classes intérieures protected / public ?

Je sais que public classes intérieures public doivent éviter autant que possible (comme expliqué dans cet article ).

Mais d’après ce que je peux dire, il n’y a pas de différence entre utiliser public modificateurs protected ou public .

Jetez un oeil à cet exemple:

 public class Foo1 { public Foo1() { } protected class InnerFoo { public InnerFoo() { super(); } } } 

 public class Foo2 extends Foo1 { public Foo2() { Foo1.InnerFoo innerFoo = new Foo1.InnerFoo(); } } 

 public class Bar { public Bar() { Foo1 foo1 = new Foo1(); Foo1.InnerFoo innerFoo1 = foo1.new InnerFoo(); Foo2 foo2 = new Foo2(); Foo2.InnerFoo innerFoo2 = foo2.new InnerFoo(); } } 

Tous ces éléments sont compilés et valides que je déclare InnerFoo protected ou public .

Qu’est-ce que je rate? S’il vous plaît, signalez-moi un cas où il y a une différence d’utilisation entre protected et public .

Merci.

    Le modificateur d’access protected restreindra l’access aux classes autres que celles du même paquet et de ses sous-classes.

    Dans l’exemple présenté, le public et les protected auront le même effet, car ils sont dans le même package.

    Pour plus d’informations sur les modificateurs d’access, la page Contrôle de l’access aux membres d’un cours des tutoriels Java peut présenter un intérêt.

    Vous pouvez simplement penser que une classe interne protégée est un membre protégé, de sorte qu’il ne peut accéder qu’à la classe, au package, à la sous-classe, mais pas au monde.

    De plus, pour la classe externe, il n’y a que deux modificateurs d’access. Juste public et package.

    Chose bizarre en Java:

    Java pur: vous ne pouvez pas retourner une classe interne privée à partir d’un getter public.

    Dans JSP: Vous ne pouvez pas renvoyer une classe interne non publique à partir d’un getter public.


    Démo Java à exécuter:

     public class ReturnInnerClass{ public static void main(Ssortingng []args){ MyClass inst = new MyClass("[PROP_VAL]"); System.out.println( inst.get().myProperty() );; };; };; class MyClass{ //:If JSP: MUST be public //:Pure Java: //: public,protected,no-access-modifier //: Will all work. //:Private fails in both pure java & jsp. protected class Getters{ public Ssortingng myProperty(){ return(my_property); } };; //:JSP EL can only access functions: private Getters _get; public Getters get(){ return _get; } private Ssortingng my_property; public MyClass(Ssortingng my_property){ super(); this.my_property = my_property; _get = new Getters(); };; };; //:How to run this example: //: 1: Put this code in file called: "ReturnInnerClass.java" //: 2: Put ReturnInnerClass.java into it's own folder. //: ( Folder name does not matter.) //: 3: Open the folder. //: 4: Right-Click --> GitBashHere //: 5: In command prompt within folder: //: 5.1: javac ReturnInnerClass.java //: 5.2: java ReturnInnerClass //: ( javac: java comstackr ) //: ( java : runs comstackd java program ) //: EXPECTED OUTPUT: //: [PROP_VAL] 

    Pour JSP , placez uniquement le code de classe ci-dessus dans le dossier: com / myPackage / MyClass et indiquez “import com.myPackage.MyClass” en tant que première ligne du code source. Puis créez une nouvelle page .jsp avec ce code source:

     <%@ taglib uri ="http://java.sun.com/jsp/jstl/core" prefix="c" %> <%@ page import="com.myPackage.MyClass" %> <% MyClass inst = new MyClass("[PROP_VALUE]"); pageContext.setAttribute("my_inst", inst ); %> ${ my_inst.get().myProperty() }  

    Pile utilisée: Java8 + Tomcat9