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.

¿Fue útil?

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top