受保护/公共内部类

发布于 2024-07-14 05:41:14 字数 1054 浏览 14 评论 0原文

有人可以向我解释一下 protected / public Inner 类之间有什么区别吗?

我知道 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,所有这些都会编译并且有效。

我缺少什么? 请指出使用 protectedpublic 之间存在差异的情况。

谢谢。

Can someone please explain to me what is the difference between protected / public Inner classes?

I know that public inner classes are to avoid as much as possible (like explained in this article).

But from what I can tell, there is no difference between using protected or public modifiers.

Take a look at this example:

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

All of this compiles and is valid whether I declare InnerFoo protected or public.

What am I missing? Please, point me out a case where there's a difference in using protected or public.

Thanks.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

海风掠过北极光 2024-07-21 05:41:14

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

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

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

The protected access modifier will restrict access from classes other than the ones in the same package and its subclasses.

In the example shown, the public and protected will have the same effect, as they are in the same package.

For more information on access modifiers, the Controlling Access to Members of a Class page of The Java Tutorials may be of interest.

脸赞 2024-07-21 05:41:14

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

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

You can just think protected inner class is protected member, so it only access for class, package, subclass but not for the world.

In addition, for outter class, there is only two access modifier for it. Just public and package.

风尘浪孓 2024-07-21 05:41:14

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

Weird thing in java:

Pure Java: You cannot return a private inner class from a public getter.

In JSP : You cannot return a non-public inner class from a public getter.


Java Demo You Can Run:

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]

For JSP, put only the class code above into folder: com/myPackage/MyClass
and put "import com.myPackage.MyClass" as first line of source code. Then create a new .jsp page with this source code:

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

Stack Used:
Java8 + Tomcat9

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文