Domanda

Per favore qualcuno può spiegarmi qual è la differenza tra protected / public Interiore le classi?

So che public classi interne sono da evitare, per quanto possibile (come spiegato in questo articolo).

Ma da quello che posso dire, non c'è alcuna differenza tra l'utilizzo di protected o public modificatori.

Date un'occhiata a questo esempio:

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();
 }
}

Tutto questo viene compilato ed è valida se dichiaro InnerFoo protected o public.

Che cosa mi manca?Per favore, mi fanno notare un caso in cui c'è una differenza nell'utilizzo di protected o public.

Grazie.

È stato utile?

Soluzione

Il modificatore di accesso protected sarà limitare l'accesso da classi diverse da quelle dello stesso pacchetto e le sue sottoclassi.

Nell'esempio illustrato, il public e protected avranno lo stesso effetto, in quanto sono nello stesso pacchetto.

Per ulteriori informazioni sui modificatori di accesso, il Controllo dell'accesso ai membri di una pagina Classe di Java Tutorial possono essere di interessi.

Altri suggerimenti

È solo può pensare classe interna protetta è protetto membro, in modo che solo l'accesso per la classe, pacchetto, sottoclasse ma non per il mondo.

Inoltre, per la classe outter, c'è solo due modificatore di accesso per esso. Basta pubblici e il pacchetto.

Cosa strana in java:

Puro Java: Non è possibile restituire un privato classe interna da un getter pubblico.

In JSP : Non è possibile restituire un non pubblico una classe interna da un getter pubblico.


Java Demo È Possibile Eseguire:

public class ReturnInnerClass{
    public static void main(String []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 String 
        myProperty(){ return(my_property); }
    };;

    //:JSP EL can only access functions:
    private Getters _get;
    public  Getters  get(){ return _get; }

    private String 
    my_property;

    public MyClass(String 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 compiler              )
//:     ( java : runs compiled java program )

//:  EXPECTED OUTPUT:
//:  [PROP_VAL]

Per JSP, mettere solo il codice della classe di cui sopra nella cartella:com/myPackage/MyClass e mettere "import com.myPackage.MyClass" come prima riga di codice sorgente.Quindi creare un nuovo .pagina jsp con questo codice:

<%@ 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 ); 
%><html lang="en"><body>
    ${ my_inst.get().myProperty() }
</body></html>

Stack Usato: Java8 + Tomcat9

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top