Clases Internas protegidas públicas /
-
09-09-2019 - |
Pregunta
Puede alguien por favor me explique cuál es la diferencia entre protected
/ public
Interior clases?
Sé que las clases internas son public
para evitar tanto como sea posible (como se explica en este artículo ).
Pero por lo que puedo decir, no hay diferencia entre usar o protected
public
modificadores.
Tome un vistazo a este ejemplo:
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();
}
}
Todo esto compila y es válida si Declaro InnerFoo
protected
o public
.
¿Qué me falta? Por favor, dirija sacarme un caso en el que hay una diferencia en el uso de protected
o public
.
Gracias.
Solución
El modificador de acceso protected
restringirá el acceso de las clases que no sean los que están en el mismo paquete y sus subclases.
En el ejemplo mostrado, el public
y protected
tendrán el mismo efecto, ya que están en el mismo paquete.
Para obtener más información acerca de modificadores de acceso, el Control de acceso a los miembros Clase de una página de href="http://java.sun.com/docs/books/tutorial/index.html" rel="noreferrer"> Los Tutoriales de Java pueden ser de interés.
Otros consejos
Sólo puede pensar clase interna protegida es miembro protegido, por lo que sólo el acceso para la clase, paquete, subclase pero no para el mundo.
Además, para la clase outter, sólo hay dos modificador de acceso para ello. Sólo pública y el paquete.
Lo extraño en Java:
Java puro:. No se puede devolver un clase interna privada de un captador público
En JSP:. No se puede devolver un clase interna no pública de un captador público
Java de demostración puede ejecutar:
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 , ponga sólo el código de la clase anterior en la carpeta: com / myPackage / MyClass y poner "com.myPackage.MyClass importación" como la primera línea de código fuente. A continuación, crear una nueva página .jsp con este código fuente:
<%@ 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>
pila usada: Java8 + Tomcat9