4

我有一个问题,这代表了我的兴趣。假设我有这样一个类定义:

public class A extends DumbAction{
  public class B {
    // Inner class definition
    public String getName() {return "Class B";}
  }

  @Override 
  public void execute(HttpServletRequest request) {
    ArrayList<B> list = new ArrayList<B>();
    list.add(new B());
    // Here I add some more elements
    request.setAttribute("list", list);      
  }
}

似乎编译器并没有禁止这样的代码。因此,我将内部类的实例列表传递给 HttpServletRequest 实例。但是,当我尝试在 JSP 中访问他们的公共方法时,我收到了关于此类读取方法(例如,getName)不存在的抱怨。虽然物体本身似乎存在。

这是什么意思?内部类甚至不能隐式传递给外部世界?或者他们的生命立即结束,因为外部类实例不再存在?或者没有人可以访问内部类的公共方法,除了外部类。

更新:这是使用内部类实例列表的jsp页面片段:

<c:forEach var = "element" items = "${list}">
  <c:out value = "${element.name}"/><br/>
</c:forEach>

似乎 forEach 工作正常,但根据 JSTL 无法访问内部类的公共方法 getName()。

4

1 回答 1

5

如果B没有 的实例的上下文,就不能存在 的实例A。如果您有对 的实例的引用B,则该对象隐式地具有对封闭A实例的引用,即使您没有直接引用。

于 2012-06-09T09:24:10.143 回答