有人可以向我解释protected
/ public
内部类之间的区别是什么?
我知道public
内部类应尽可能避免(如本article中所述)。
但据我所知,使用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
时存在差异的情况。
感谢。
答案 0 :(得分:21)
protected
访问修饰符将限制来自同一包及其子类中的类以外的类的访问。
在显示的示例中,public
和protected
将具有相同的效果,因为它们位于同一个包中。
有关访问修饰符的详细信息,Controlling Access to Members of a Class的The Java Tutorials页面可能会很有用。
答案 1 :(得分:1)
你可以认为受保护的内部类是受保护的成员,因此它只能访问类,包,子类,但不能访问世界。
另外,对于outter类,只有两个访问修饰符。公开和包装。
答案 2 :(得分:0)
纯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