protegidas Classes Internas / público
-
09-09-2019 - |
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.
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