15

protected有人可以向我解释/public 内部课程有什么区别吗?

我知道public内部类是要尽可能避免的(就像在这篇文章中解释的那样)。

但据我所知,使用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 protected还是public.

我错过了什么?请指出一个使用protectedor有区别的情况public

谢谢。

4

3 回答 3

23

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

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

有关访问修饰符的更多信息,可能会对Java 教程的控制对类成员的访问页面感兴趣。

于 2009-02-27T15:20:01.847 回答
1

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

此外,对于外部类,它只有两个访问修饰符。只是公开和打包。

于 2014-06-22T08:39:33.563 回答
1

java中的怪事:

纯 Java:您不能从公共 getter返回私有内部类。

在 JSP 中:您不能从公共 getter返回非公共内部类。


您可以运行的 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

于 2018-07-16T05:05:13.877 回答