【问题标题】:Abstract class and subclass, and method invocation抽象类和子类,以及方法调用
【发布时间】: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


【解决方案1】:

正如 Jon Skeet 在 cmets 中所说,这是关于面向对象编程 (OOP) 中的核心概念(继承),与 Servlet 无关(可能除了你的作业?),对于StackOverflow.com。

如果您了解常规编程以及常规编译和链接如何在编译时预先确定在运行时将执行哪些位,并因此想知道执行如何在类之间“跳跃”,那么您需要学习关于“后期绑定”和“动态调度”,让 OOP 如此强大的特殊调味料。

'abstract' 对您的问题有点分心。只是意味着需要一个具体的子类,但没有abstract,您的问题仍然是一样的。

尝试阅读继承和后期绑定。

What Is Inheritance?

Inheritance

Late Binding

Dynamic Dispatch

【讨论】:

    猜你喜欢
    • 2012-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多