2012-06-09 24 views
4

我有一個問題,它代表了我的興趣。假設我有這樣的類定義:如果傳遞給jsp頁面,內部類的實例會發生什麼

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)不存在的事實抱怨。雖然物體本身似乎存在。

這是什麼意思?內部階級不能被隱式傳遞給外部世界?或者他們的生活立即結束,因爲外部類實例停止存在?或者說,除了外部類別之外,沒有人能夠訪問內部類的公共方法。

UPD: 這裏是jsp頁面中使用內部類的實例列表中的片段:

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

看起來的forEach工作正常,但出於無法訪問的內部公共方法GetName()根據JSTL的等級。

+0

爲什麼你只是不運行代碼和觀察者會發生什麼? –

+0

我觀察發生了什麼。服務器說該元素沒有可讀屬性「getName」 –

回答

5

如果沒有A實例的上下文,B的實例不能存在。如果您有一個對B實例的引用,則該對象隱式引用了封閉的A實例,即使您沒有直接引用也是如此。

+0

因此,如果我傳遞給JSP一個B實例的列表,它是無法訪問它們的?好的,你的答案解釋了很多,謝謝 –

相關問題