Java基础(三)——抽象类和接口

一、抽象类

1、介绍

  使用:abstract定义抽象类;abstract定义抽象方法,只有声明,不用实现;包含抽象方法的类必须定义为抽象类;抽象类中可以有普通方法,也可以有抽象方法;抽象类不能被实例化,但可以定义引用变量。
  抽象关键字 abstract 和哪些不可以共存?final,private,static。
  应用场景:在某些情况下,父类只知道其子类应该包含什么方法,但不知道这些子类如何实现这些方法;从多个具有相同特征的类中抽象出一个抽象类,以这个抽象类作为子类的模板,从而避免了子类设计的随意性。
  作用:限制规定子类必须实现某些方法,但不关注实现细节。

2、应用

  在某些情况下,某个父类只知道其子类应该包含怎样的方法,但不知道这些子类如何实现这些方法。从多个具有相同特征的类中抽象出一个抽象类,以这个抽象类作为子类的模板,从而避免了子类设计的随意性。
  其他概念等,其他博客或书籍已介绍的很清楚,请读者自行百度,这里不做介绍。

3、案例

  下面定义了两个类,一个学生类,一个老师类。学生有姓名和年龄属性,还有吃饭和学习两个方法。老师也有姓名和年龄属性,还有吃饭和教书两个方法。

 1  class Student {
 2      private String name;
 3      private String age;
 4  
 5      public void eat() {
 6          System.out.println("学生在吃饭");
 7      }
 8  
 9      public void study() {
10          System.out.println("学生在学习");
11      }
12  }
13  
14  class Teacher {
15      private String name;
16      private String age;
17  
18      public void eat() {
19          System.out.println("老师在吃饭");
20      }
21  
22      public void teach() {
23          System.out.println("老师在教书");
24      }
25  }

  很明显,这两个类,学生和老师,都有共同的属性,姓名和年龄,也有共同的方法,吃饭。那么,就可以向上抽取一个抽象类,人。修改代码如下:

 1 /**
 2  * 父类Person
 3  * 通过关键字 abstract 定义Person是一个抽象类
 4  */
 5 abstract class Person {
 6     private String name;
 7     private String age;
 8 
 9     /**
10      * abstract 抽象方法
11      * 只有方法的定义,没有方法的实现。
12      */
13     public abstract void eat();
14 }
15 
16 class Student extends Person {
17 
18     /**
19      * 不同的子类有不同的实现
20      */
21     @Override
22     public void eat() {
23         System.out.println("学生在吃饭");
24     }
25 
26     public void study() {
27         System.out.println("学生在学习");
28     }
29 
30 }
31 
32 class Teacher extends Person {
33 
34     /**
35      * 不同的子类有不同的实现
36      */
37     @Override
38     public void eat() {
39         System.out.println("老师在吃饭");
40     }
41 
42     public void teach() {
43         System.out.println("老师在教书");
44     }
45 }

  补充一下:①抽象类不可以实例化,②如果子类不想实现父类的抽象方法的话,可以将子类也申明为 abstract ,再由他的子类来实现即可。
  很明显,这样做,可以简化代码。但是,请读者不要以为只要是有共有的属性或者方法,就去使用抽象类,向上抽取为一个类。Java是面向对象的语言,封装、继承、多态是它的三大的特性(默认读者有一定的Java基础)。且这些概念百度到处都是,所以不赘述。那么,什么情况下,适合向上抽取一个抽象类呢?
  抽象类,向上抽取,必须要有继承关系,也就是 is a 。这里,学生是一个人,老师也是一个人。所以抽取抽象类 Person。
  代码示例:反例。

 1 class Student {
 2     private String name;
 3     private String age;
 4 
 5     public void eat() {
 6         System.out.println("学生在吃饭");
 7     }
 8 
 9 }
10 
11 class Cat {
12     private String name;
13     private String age;
14 
15     public void eat() {
16         System.out.println("猫在吃鱼");
17     }
18 }

  这里,定义了学生类,猫类。同样,他们都有姓名和年龄属性,还有吃饭方法。最好就不要抽取抽象类。因为猫和人的共同父类是什么?在现实生活中是找不到的。Java中,所谓一切皆对象,程序代码也只是将现实生活中的事物在计算机中的映射。所以,这里不要为了代码的简介而胡乱抽取一个父类。有读者可能会说,他们都是生物啊,可以抽取一个Biology类,那如果是一个球类和学生类呢?这里只是举了一个例子,希望说明问题。实际开发中,读者可灵活定义! 

二、接口

1、介绍

  接口可以理解成一种特殊的类,由静态常量和公共的抽象方法所组成。
  类是一种具体实现体,而接口定义了某一批类所需要遵守的规范,接口不关心这些类的内部数据,也不关心这些类里方法的实现细节,它只规定这些类里必须提供某些方法。语法:

  [修饰符] interface 接口名 [extends 父接口1,父接口2...] {
    public static final String var1;
    public static final String var2;
    public abstract [返回类型] method1();
    public abstract [返回类型] method2();
  }

  使用:接口只能用public修饰,不能使用private和protected;一个类可以实现一个或多个接口;Java中一个类只能继承一个父类,是不够灵活的,接口的出现将"多继承"通过另一种形式体现出来,即"多实现";还可以与匿名内部类配合使用,多用于关注实现而不关注类的名称。其本质是利用了多态,而创建的是一个实现了该接口的类的实例。
  成员固定格式:

  成员常量:public static final
  成员函数:public abstract

  特点:接口是对外暴露的规则;接口是程序的功能扩展;接口可以用来多实现;类与接口之间是实现关系,且类可以继承一个类的同时实现多个接口;接口与接口之间可以有继承关系;接口中的方法只能是抽象方法。

posted @ 2020-10-28 23:09  Craftsman-L  阅读(157)  评论(0编辑  收藏  举报