public class Minduck extends duck{
 public void Minduck(){
  flybehavior = new FlyWithWings(); 
 }
}
    public static void main(String[] args) {
        duck minduck=new Minduck()
      minduck.performFly();
    }public abstract class duck(){
  Flybehavior flybehavior;
  public void performFly(){
    flybehavior.fly();
    } 
}
public interface Flybehavior{  public void fly(){
 
    } 
}
public class FlyWithWings immplements Flybehavior{  public void fly(){
 
    } 
}public class FlyNOWithWings immplements Flybehavior{  public void fly(){
 
    } 
}
有几个问题不理解
第一、flybehavior = new FlyWithWings(); 接口不是不可以实例化吗?
第二、flybehavior是接口,而FlyWithWings是实现接口的类,flybehavior = new FlyWithWings()可以这样用吗
第三、在minduck中调用父类duck的  public void performFly(){
    flybehavior.fly();
    } ,其怎样知道是调用的FlyWithWings而不是FlyNOWithWings?

解决方案 »

  1.   

    第一:flybehavior 被定义为Flybehavior接口类型,但FlyWithWings这个类实现了这个Flybehavior接口. 接口的引用可以指向接口的实现类,这个是面向接口编程,多态实现的一种。
    类似于 List list=new ArrayList();第二:同上,可以.第三:performFly()方法中调用的是 flybehavior.fly(); 而flybehavior这个接口类型指向的接口实现类的实例是new FlyWithWings(); 所以调用的是FlyWithWings父类或者接口的引用指向子类或者接口的实现类,这就是多态的本质。
      

  2.   

    我注意到,在Minduck中flybehavior这个接口类型指向的接口实现类的实例是new FlyWithWings()
    而在duck调用的接口方法flybehavior.fly,这怎样理解
    是不是在duck中声明的是变量flybehavior,而由于子类Minduck全部继承了duck的flybehavior变量,
    并把他指向flybehavior = new FlyWithWings();(实例化)
    是不是在duck中声明的是方法performFly,而由于子类Minduck全部继承了duck的performFly方法,  
    然后此时minduck.performFly();实际上在performFly()方法中是调用的FlyWithWings,这样理解对吗?