【发布时间】:2013-10-16 15:58:04
【问题描述】:
大家好。
我对 servlet 中的抽象超类和子类有些困惑:
我有抽象的 servlet 超类:
public abstract class CatalogPage extends HttpServlet {
public CatalogPage() {
super();
}
private CatalogItem[] items;
private String[] itemsID;
private String title;
public void setItems(String[] itemsID) {
this.itemsID = itemsID;
items = new CatalogItem[itemsID.length];
for(int i=0; i<items.length; i++) {
items[i] = Catalog.getItem(itemsID[i]);
}
}
public void setTitle(String title) {
this.title = title;
}
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
if (items == null) {
response.sendError(response.SC_NOT_FOUND, "Missing Items");
return;
}
response.setContentType("text/html");
PrintWriter out = response.getWriter();
String docType =
"<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 " +
"Transitional//EN\">\n";
out.println(docType +
"<HTML>\n" +
"<HEAD><TITLE>" + title + "</TITLE></HEAD>\n" +
"<BODY BGCOLOR=\"#FDF5E6\">\n" +
"<H1 ALIGN=\"CENTER\">" + title + "</H1>");
CatalogItem item;
for(int i=0; i<items.length; i++) {
item = items[i];
if(item == null) {
out.println("<FONT COLOR=\"RED\">" +
"Unknown item ID " + itemsID[i] +
"</FONT>");
} else {
out.println();
String formURL = "OrderPage";
formURL = response.encodeURL(formURL);
out.println
("<FORM ACTION=\"" + formURL + "\">\n" +
"<INPUT TYPE=\"HIDDEN\" NAME=\"itemID\" " +
" VALUE=\"" + item.getItemID() + "\">\n" +
"<H2>" + item.getShortDescription() +
" ($" + item.getCost() + ")</H2>\n" +
item.getLongDescription() + "\n" +
"<P>\n<CENTER>\n" +
"<INPUT TYPE=\"SUBMIT\" " +
"VALUE=\"Add to Shopping Cart\">\n" +
"</CENTER>\n<P>\n</FORM>");
out.println("<HR>\n</BODY></HTML>");
}
}
}
}
抽象超类的子类:
@WebServlet("/KidsCatalogPage")
public class KidsBooksPage extends CatalogPage {
public void init() {
String[] kbp = {"lewis001", "alexander001", "rowling001"};
setItems(kbp);
setTitle("All-Time Best Children's Fantasy Books");
}
}
如果我调用子类KidsBooksPage 我知道它首先会初始化init() 方法,但问题是:
是什么让我的子类 KidsBooksPage 调用抽象超类 CatalogPage 。这个怎么运作??能明白。请给我解释一下。
谢谢。
【问题讨论】:
-
你没有调用一个类——你调用一个方法。你说的是哪种方法?还是您在谈论构造函数?真的不清楚你在问什么。
-
我说的是 doGet() 方法。 KidsBooksPage 中没有 doGet,如果我只使用 KidsBooksPage,它如何从 CatalogPage 调用 doGet()。我知道在这种情况下,请求将调用 doGet,但在作为超类的抽象类中调用 doGet(),这意味着将调用抽象类当我们使用 KidsBooksPage 类时自动运行??
-
如果要调用init方法的超级实现,可以在子类中调用'super.init()'。
-
这与 servlet 无关——这只是继承的正常行为......
标签: java inheritance abstract late-binding dynamic-dispatch