public abstract class Beverage{
  String description="Unknown Beverage";  public String getDescription(){
    return description;
  }  public abstract double cost();
}public abstract class CondimentDecorator extends Beverage{
  public abstract String getDescription();
}public class Espresso extends Beverage{
  public Espresso(){
    description="Espresso";
  }  public double cost(){
    return 1.99;
  }
}public class Mocha extends CondimentDecorator{
  Beverage beverage;  public Mocha(Beverage beverage){
    this.beverage=beverage;
  }  public String getDescription(){
    return beverage.getDescription()+",Mocha";
  }  public double cost(){
    return 0.2+beverage.cost();
  }
}public class CoffeeShop{
  public static void main(String args[]){
    beverage beverage=new Espresso();
    beverage=new Mocha(beverage);
    System.out.println(beverage.getDescription()+"$"+beverage.cost());
  }
}
现在有这样5个类,我想知道CoffeeShop执行的时候,整个过程是什么样子的?
还有Mocha类的
public Mocha(Beverage beverage){
this.beverage=beverage;
}是做什么的?
this.beverage=beverage;是什么意思?

解决方案 »

  1.   

    public Mocha(Beverage beverage){
    this.beverage=beverage;
    } 这个是Mocha的构造方法,传入类型为Beverage的参数beverage,作用是将这个参数beverage赋值到Mocha类型的成员变量beverage中
    this.beverage指的是Mocha中的成员beverage,而等号后面的beverage是传入的参数
      

  2.   


    了解了,谢谢啊
    麻烦能告诉我CoffeeShop执行的时候,整个过程是什么样子的?
      

  3.   

    public static void main(String args[]){ 
        beverage beverage=new Espresso(); 
        beverage=new Mocha(beverage); 
        System.out.println(beverage.getDescription()+"$"+beverage.cost()); 
      } 
    你确认代码没错吗??
    第二行,第一个单词应该大写吧。。
    我给解释一下吧,第二行是父类声明,子类填充。。beverage只是一个引用
    第三行是:是把引用丢到Mocha这个类里面,他那个类里面有一个构造函数,其中的参数就是Beverage类型的。
    Mocha的基类(也就是父类)是CondimentDecorator,而CondimentDecorator的基类是Beverage,所以可以用该对象做声明。
    随后方法是动态绑定的,程序在运行时会自动去找相应的对象,此时的对象是Mocha,所以调用的是它的方法