原帖子的地址16.做一个饲养员给动物喂食物的例子体现JAVA中的面向对象思想,接口(抽象类)的用处 
package com.softeem.demo; /** 
*@authorleno 
*动物的接口 
*/ 
interface Animal 

    publicvoid eat(Food food); 

/** 
*@authorleno 
*一种动物类:猫 
*/ 
class Cat implements Animal 

    publicvoid eat(Food food) 
    { 
      System.out.println("小猫吃"+food.getName()); 
    } 

/** 
*@authorleno 
*一种动物类:狗 
*/ 
class Dog implements Animal 

    publicvoid eat(Food food) 
    { 
      System.out.println("小狗啃"+food.getName()); 
    } 
} /** 
*@authorleno 
*食物抽象类 
*/ 
abstractclass Food 

    protected String name; 
    public String getName() { 
      returnname; 
    }     publicvoid setName(String name) { 
      this.name = name; 
    } 
} /** 
*@authorleno 
*一种食物类:鱼 
*/ 
class Fish extends Food 

    public Fish(String name) { 
      this.name = name; 
    } 

/** 
*@authorleno 
*一种食物类:骨头 
*/ 
class Bone extends Food 
{  
    public Bone(String name) { 
      this.name = name; 
    } 
} /** 
*@authorleno 
*饲养员类 

*/ 
class Feeder 

    /** 
    *饲养员给某种动物喂某种食物 
    *@paramanimal 
    *@paramfood 
    */ 
    publicvoid feed(Animal animal,Food food) 
    { 
      animal.eat(food); 
    } 
} /** 
*@authorleno 
*测试饲养员给动物喂食物 
*/ 
publicclass TestFeeder {     publicstaticvoid main(String[] args) { 
      Feeder feeder=new Feeder(); 
      Animal animal=new Dog(); 
      Food food=new Bone("肉骨头"); 
      feeder.feed(animal,food); //给狗喂肉骨头 
      animal=new Cat(); 
      food=new Fish("鱼"); 
      feeder.feed(animal,food); //给猫喂鱼  我的问题是: 
  Animal 是接口  ,Food是 抽象类 ,那么用Animal animal,Food food是什么意思呢?不是说抽象类是不能有实例的吗?虽然这里这个是实例变量。     Animal animal=new Dog(); ??怎么理解哦
  其实不是偶然,我在书上就看到了好几个不解的:比如: InputStream is = new FileInputStream(source);  
   也许我看过最多的就是 class A = new class() 这样的格式,前后都是一样的,
 
  我是新手,希望各位能指点下哦  ,非常谢谢啊

解决方案 »

  1.   

    抽象类和接口确实是不能实例化的。
    Animal aniaml=new Dog()。是实例化了Dog。并没有实例化Animal.
    用父类类型的引用指向子类对象,意思就是“Dog是一种Animal”,非常合乎逻辑啊
      

  2.   

    那 dog dog1=new dog() 和Animal aniaml=new Dog() 的主要区别在哪里呢?
      

  3.   

    前一个是把dog当做dog看,可以执行dog扩展的方法,后一个是把dog当做animals看,他只能执行animal里或者是被dog覆盖后的方法,而不能执行dog里扩展的方法
      

  4.   


        你说的扩展的方法是说的重载吗?好象我还是不是很清楚哦 ,我的JAVA书里翻来翻去都没有这个解释,有引用的概念,但那个概念和我想知道的是牛头马嘴,看来书的好坏还很重要哦
      

  5.   

    恩,就是多态,Food food 只是开辟一个内存空间,这个内存空间装的是子类对象的地址。所以还是没有违反抽象类不能new的原则,Food food 不等同于 new Food();前面是声明一个变量,后面是创建一个对象,有差别的
      

  6.   

    还是不明白这样做的好处是什??你Animal amial=new dog(),这个实例化对象并不能调用dog中自己定义的方法,只能他只能执行animal里或者是被dog覆盖后的方法,而不能执行dog里扩展的方法 ,这不是就没法调用dog自己的方法了吗,这种实例化的好处是什么???