以下是2006年程序员考试的下午第8题,根据标准答案抄了一遍,却不能给出和标准答案一致的输出结果,请各位帮忙看看。
标准答案要求的输出结果:
这是票据抬头
这是票据正文
这是票据脚注
-----------------------------------
这是票据抬头
这是票据脚注public class Main 
{
    public static void main(String args[])
    {
        Decorator T=new HeadDecorator(new FootDecorator(new SalesTicket()));//在试卷上的原文为T=new HeadDecorator(new FootDecorator(new SalesTicket()));,没有给T指明数据类型,为了通过编译加上了Decorator
        T.printTicket();
        System.out.println("-----------------------------------");
        T=new FootDecorator(new HeadDecorator(null));
        T.printTicket();
    }
}
//main()中的T=new HeadDecorator(new FootDecorator(new SalesTicket()));和T=new FootDecorator(new HeadDecorator(null));是试卷上的标准答案
//以下的类名SalesTicket、Decorator、HeadDecorator、FootDecorator均有public限制符,为了通过编译去掉了public
class SalesTicket
{
    public void printTicket()
    {
        System.out.println("这是票据正文");
    }
}class Decorator extends SalesTicket
{
    SalesTicket Ticket;
    public Decorator(SalesTicket t)
    {
        Ticket=t;
    }
    
    public void printTicket()
    {
        if(Ticket!=null)
        {
            Ticket.printTicket();
        }
    }
}class HeadDecorator extends Decorator
{
    public HeadDecorator(SalesTicket t)
    {
        super(t);
    }
    
    public void printTicket()
    {
        System.out.println("这是票据抬头");
        super.printTicket();
    }
}class FootDecorator extends Decorator
{
    public FootDecorator(SalesTicket t)
    {
        super(t);
    }
    
    public void printTicker()
    {        
        super.printTicket();
        System.out.println("这是票据脚注");
    }
}

解决方案 »

  1.   

    已经知道答案了,和函数的动态绑定有关
    Decorator T=new HeadDecorator(new FootDecorator(new SalesTicket()));
    FootDecorator构造函数的参数是SalesTicket,打印了“这是票据正文”和("这是票据脚注"),FootDecorator作为参数传给HeadDecorator,执行了System.out.println("这是票据抬头"); 以后就是打印了“这是票据正文”和("这是票据脚注")。
    T=new FootDecorator(new HeadDecorator(null)); 
    给HeadDecorator构造函数的参数是NULL,所以没有打印“这是票据正文”。在FootDecorator构造函数中引入的是HeadDecorator,所以执行了HeadDecorator的打印函数,然后执行System.out.println("这是票据脚注"); 如果有异议可以继续讨论。