受保护/公共内部类

时间:2009-02-27 15:17:09

标签: java inner-classes access-modifiers

有人可以向我解释protected / public 内部类之间的区别是什么?

我知道public内部类应尽可能避免(如本article中所述)。

但据我所知,使用protectedpublic修饰符没有区别。

看一下这个例子:

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 protectedpublic都有效。

我错过了什么?请指出使用protectedpublic时存在差异的情况。

感谢。

3 个答案:

答案 0 :(得分:21)

protected访问修饰符将限制来自同一包及其子类中的类以外的类的访问。

在显示的示例中,publicprotected将具有相同的效果,因为它们位于同一个包中。

有关访问修饰符的详细信息,Controlling Access to Members of a ClassThe Java Tutorials页面可能会很有用。

答案 1 :(得分:1)

你可以认为受保护的内部类是受保护的成员,因此它只能访问类,包,子类,但不能访问世界。

另外,对于outter类,只有两个访问修饰符。公开和包装。

答案 2 :(得分:0)

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