защищенные / общедоступные внутренние классы - PullRequest
13 голосов
/ 27 февраля 2009

Может кто-нибудь объяснить мне, в чем разница между protected / public Внутренними классами?

Я знаю, что public внутренние классы должны максимально избегать (как объяснено в этой статье ).

Но из того, что я могу сказать, нет никакой разницы между использованием protected или public модификаторов.

Взгляните на этот пример:

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

Все это компилируется и действительно ли я объявляю InnerFoo protected или public.

Что мне не хватает? Пожалуйста, укажите мне случай, когда есть разница в использовании protected или public.

Спасибо.

Ответы [ 3 ]

21 голосов
/ 27 февраля 2009

Модификатор доступа protected ограничит доступ к классам, отличным от классов в том же пакете и его подклассах.

В показанном примере public и protected будут иметь тот же эффект, что и в одном пакете.

Для получения дополнительной информации о модификаторах доступа, Управление доступом к членам класса страница Учебные руководства Java могут представлять интерес.

1 голос
/ 22 июня 2014

Вы можете просто думать, что защищенный внутренний класс является защищенным членом, поэтому он доступен только для класса, пакета, подкласса, но не для мира.

Кроме того, для внешнего класса существует только два модификатора доступа. Просто пиар и пакет.

0 голосов
/ 16 июля 2018

Странная вещь в Java:

Чистая Java: Вы не можете вернуть закрытый внутренний класс из общедоступного получателя.

В JSP: Вы не можете вернуть непубличный внутренний класс из общедоступного получателя.


Демонстрация Java, которую вы можете запустить:

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]

Для JSP поместите только указанный выше код класса в папку: com / myPackage / MyClass и поместите «import com.myPackage.MyClass» в качестве первой строки исходного кода. Затем создайте новую страницу .jsp с этим исходным кодом:

<%@ 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>

Используемый стек: Java8 + Tomcat9

...