黑马程序员技术交流社区

标题: 抽象类和接口网上写得都太深,有没有通俗的解释,让我听听 [打印本页]

作者: 秦驰    时间: 2011-7-14 13:16
标题: 抽象类和接口网上写得都太深,有没有通俗的解释,让我听听
抽象类和接口
作者: 匿名    时间: 2011-7-14 13:41
给你个很经典的例子。。自己悟吧[code]abstract class Animal   [color=Red] //定义抽象类.至少有一个方法是抽象方法的类[/color]{
    String str;
    Animal(String s)     //定义抽象类的一般方法
   {
        str=s;
   }
   abstract void eat();      [color=Red][/color]//定义抽象方法--这就是抽象方法,没有方法体。
}
class Horse extends Animal     //定义继承Animal的子类。子类实现了父类的抽象方法eat()
{   
    String str;
    Horse(String s)
   {
      super(s);      //调用父类的构造方法
   }
    void eat()      //重写父类的抽象方法
   {      
      System.out.println("马吃草料!");
   }
}
class Dog extends Animal   //定义继承Animal的子类。子类实现了父类的抽象方法eat()
{
    String str;
    Dog(String s)
  {
      super(s);
    }
    void eat()
    {
    System.out.println("狗吃骨头!");
    }
}
public class test1
{
   public static void main(String args[])
   {
      Animal    Horse1 = new Horse("马");  //多态
      Animal    Dog1 = new Dog("狗");
      Horse1.eat();
      Dog1.eat();
    }
}[/code]
作者: 匿名    时间: 2011-7-14 15:06
标题: 抽象、接口
1、抽象
    首先,我们看抽象的意思是笼统的、模糊的、不具体的。关键字是abstract。那么JAVA中为什么会出现这么个关键字呢。个人认为是为了程序更加严谨而设置的。我们不妨来看一个例子。
    说的是人要睡觉,但是每个人的睡觉方式后不太一样,我们就拿小孩子和大人来做比较,假如小孩子都是趴着睡或侧着睡。大人都是仰着睡的。那么就有两个类Child和Adult,他们都有共同的特点就是睡觉,大人小孩都有共性,那么一般是向上抽取出一个类Person,具有方法sleep(),Child和Adult继承Person
    class Person                                                         class Child  extends  Person
         {                                                                               {
        sleep()                                                                   sleep()
                     {                                                                               {
                                 System.out.println("睡觉");                                    System.out.println("趴着睡");
                     }                                                                               }
         }                                                                               }

        class  Adult   extends  Person
        {
                  sleep()
                  {
                           System.out.println("仰着睡");           
                  }
         }                       

         接着我们来看,Child类和Adult类继承Person类,并覆写sleep方法,既然不同的人继承Person的sleep()方法,还要覆写一遍。那么Person里面的sleep()岂不是没有存在的意义了么?既然没有存在的意义的话,为了程序更加严谨,我们就sleep()方法的方法体,即把sleep()后面的大括号去掉,并在前面加上修饰符abstract表示Person类具有sleep()这个功能,至于怎么去睡觉Person类里面就不用定义了。这就是抽象方法,一个类里面有一个抽象方法的话,这个类也要被定义成抽象的。这就有了抽象类。

2、接口
        我们知道JAVA是不支持多继承的,就是子类继承了父类A的同时就不能去继承B了,因为假如A类中有一个方法叫run(),B类中也具有一个方法叫run(),那么子类就不知道继承那个方法好了,就会发生错误。JAVA为了解决这样的问题,就有了接口。接口可以理解为一个抽象类,里面的方法都是抽象的,关键字是interface。JAVA支持多接口。为什么支持多接口,而不支持多继承呢?因为接口类里面的方法都是抽象的,我实现接口A之后就要对A里面的方法进行覆写,同时实现接口B也要对接口B里面的方法进行覆写,这样就不会发生冲突了。这就是接口。
作者: 匿名    时间: 2011-7-14 15:09
标题: 回复 4 # 的帖子
这里面的每个sleep()方法前面还要加上void表示没有返回值!
作者: 匿名    时间: 2011-7-14 19:18
唉。。这个题目真抽象,我也以厕所来说说自己的看法吧
传说以前没有厕所,大家都随地又随意,这苦恼了上帝,于是他构想着发明一个东西。
abstract class 厕所 {
    String name=“厕所” //这东西就叫厕所了
    String 地方;
    厕所(String 地方){  //注意,这虽然是构造方法,但实际不能被直接new 厕所()来调用,只能是他的子类来调用
         厕所.地方=地方
    }
   
    abstract 气味 想到厕所(); //定义抽象方法:想到厕所,返回"气味"

}
----------------------------------------------------------
厕所就这样发明了,不过还是个概念,需要有人以这个概念去做设计图再修建
于是有了
class 公厕设计图 extends 厕所
    String name 厕所名字
    公厕设计图(String 地方){
     super(地方); //调父类构造
    }
   男厕所(String 地方,int 面积大小) {
   }
   女厕所(String 地方,int 面积大小) {
   }
   @override
   public 气味 想到厕所() { //重写
     return "臭味" ;
   }
   public 收费 (){
     ....
   }
}
--------------------------------------
设计图有了,现在创建实例

new  公厕设计图(北京)

//于是终于有了个匿名厕所
---------------------------------------------
后来,厕所可以评星了,五星级厕所,政府规定必须没有臭味,还得有马桶,还得有音乐,于是政府出台了一个接口,所有实现此接口的都 是五星级厕所
interface 五星厕所(){
    马桶 建马桶(int 个数)  
    音乐 放音乐()
    气味 想到厕所()
}
于是,上面的公厕要升级五星于是需要
class 公厕设计图 extends 厕所 implements 五星级厕所{
   ....
   马桶 建马桶(int 个数) {
     新建 个数 个马桶
   }
   音乐 放音乐() {
      放XXX歌;
   }
   气味 想到厕所(){
    return 返回香味
   }
}
--------------------------------
好设计图改了,来按着他建立个厕所
厕所1 =new 公厕设计图(北京)
作者: 董俊霞    时间: 2011-7-16 10:44
抽象类和接口很像都不能被实例化,都可以包含抽象方法。接口一旦在系统中改变,系统中的部分类都需要改写。他们在方法上有所差别:
1.接口和抽象类定义就不同:接口定义不使用class关键字而是使用interface关键字抽象类需用关键字abstract修饰符来定义。
2.接口里只能包含abstract抽象方法,抽象类中可以包含普通方法;接口里不允许使用static修饰接口中的方法,抽象类可以使用。//系统自动为接口定义的方法增加abstract修饰符;

3.接口里只能定义静态常量属性,不能定义普通属性,抽象类则什么都可定义;//系统自动为接口定义的的属性增加public static final修饰符;
4.接口不包含构造方法,抽象类可以包含构造方法,但不是用于创建对象
而是让其子类调用来完成属于抽象类的初始化操作;

5.接口里不能包含初始化块,但抽象类可以;

6.以各类最多只能有一个直接父类包括抽象类,但可以直接实现多个接口;
作者: 徐传任    时间: 2012-9-16 17:22
bucuo........




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2