Pergunta

Alguém por favor pode me explicar o que é a diferença entre protected / public Inner aulas?

Eu sei que public classes internas devem evitar, tanto quanto possível (como explicado nesta artigo ).

Mas pelo que eu posso dizer, não há diferença entre usar protected ou public modificadores.

Dê uma olhada neste exemplo:

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

Tudo isso compila e é válido se eu declarar InnerFoo protected ou public.

O que eu estou ausente? Por favor, me aponte um caso em que há uma diferença no uso protected ou public.

Graças.

Foi útil?

Solução

O modificador de acesso protected vai restringir o acesso de outros do que os do mesmo pacote e suas subclasses classes.

No exemplo mostrado, o public e protected irá ter o mesmo efeito, uma vez que se encontram na mesma embalagem.

Para mais informações sobre modificadores de acesso, o Controlando o acesso a membros da página de Os Java Tutoriais podem ser de uma classe interesse.

Outras dicas

Você pode apenas pensar protegido classe interna é protegida membro, por isso só o acesso de classe, pacote, subclasse, mas não para o mundo.

Além disso, para a classe outter, há apenas dois modificador de acesso para ele. Apenas pública e pacote.

O estranho em java:

Pure Java:. Você não pode retornar uma classe interna privada a partir de um getter público

Em JSP:. Você não pode retornar um classe interna não pública a partir de um getter público


Java Demo Pode Run:

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]

Para JSP , coloque apenas o código de classe acima em pasta: com / MyPackage / MyClass e colocar "importação com.myPackage.MyClass" como primeira linha de código-fonte. Em seguida, crie uma nova página JSP com este código fonte:

<%@ 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 Usado: Java8 + Tomcat9

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top