Java抽象类和接口

2021/01/13 Java基础知识 共 2184 字,约 7 分钟
闷骚的程序员

1. 抽象类

同样由class关键字定义,但是必须由abstract关键字修饰的类叫做抽象类;(抽象类是特殊的类)。

2. 抽象类定义

定义如下:

abstract 抽象类名称{
    属性;
    
    // 下述方法是普通方法
    访问控制符(public,protected,default,private) 修饰符(static,synchronized,final,abstract等) 返回值类型 方法名称(类型 参数1,类型 参数2,….类型 参数n){
        语句;
        [return 表达式;]
    }
    
    // 下述方法是抽象方法,只有方法头,没有方法体,注意{}也没有
    访问控制符(public,protected,default,private) abstract 返回值类型 方法名称(类型 参数1,类型 参数2,….类型 参数n);
}

3. 抽象类的特征

  1. 从定义上看,只要一个类用abstract关键字修饰,则该类就是抽象类;
  2. 抽象类中不一定包括抽象方法(但是一般都会包含抽象方法),但是包含抽象方法的类必须是抽象类,即必须用abstract修饰;
  3. 抽象类和抽象方法必须使用abstract关键字修饰;
  4. 抽象方法只需要声明,不需要实现,即只需要方法头,不需要方法体(花括号都不能有);
  5. 抽象方法不能被private和static修饰符修饰,前面说过原因(默认分情况,私有静态构造不继承);
  6. 抽象类和抽象方法不能使用final关键字修饰,因为final修饰的类不能被继承,final修饰的方法不能被覆盖,而抽象方法一定要可以被继承后覆盖为普通方法才能使用;
  7. 抽象类必须被子类继承,子类如果不是抽象类,必须覆盖抽象类中所有的抽象方法;

4. 定义抽象类的目的

要想使用抽象类,则该类必须被子类继承,当然可以多层继承(但是不允许多重继承,即一个子类不允许有多个父类),目的就是必须有一个非抽象子类继承该抽象类,且子类必须覆盖抽象类中所有的抽象方法(可以通过中间抽象类继承顶层抽象类实现某些抽象方法即适配器模式)。
抽象类是不能够直接实例化对象的(但可以向上转型利用多态性使用抽象类型接收子类对象),因为抽象类主要目的就是专门用作父类的,用来定义一个模板,而其子类根据抽象类中定义的成员变量和成员方法去扩展出新的子类;正因为抽象类是抽象的,所以不能够直接创建抽象类的对象。要想创建抽象类的对象,必须实例化该抽象类的子类(该类不能是抽象类,且必须覆盖抽象类中所有的抽象方法)对象,然后进行向上转型(即前面说过的对象的多态性)。

5. 从继承的角度分析抽象类

抽象类是可以继承抽象类的,并且可以继续扩充抽象方法和普通方法;从此可见,继承更确切的叫法应该是扩展。

6. 接口

接口用关键字interface定义,组成包括两部分(口诀):

公共的静态的全局常量; 公共的非静态的抽象方法。

定义如下:

interface A{
    
    // 公共的静态的全局常量,常量命名规范全部大写
    public static final String NAME="赵二虎"; 
    
    // 公共的非静态的抽象方法,抽象方法只有方法头。
    public abstract void print();    
}

也可以写成如下(而且开发中建议写成简写方式):

interface A{
    
    // 公共的静态的全局常量
    String NAME="赵二虎"; 
    
    // 公共的非静态的抽象方法
    void print();    
}

即去掉接口中成员变量和成员方法的访问权限符和修饰符,也是默认的“公共的静态的全局常量”,“公共的非静态的抽象方法”。
编译器在编译时会自动加上相关的访问权限符和修饰符。

7. 接口的访问控制符

接口的访问控制符和类一样,只有public和default,且源文件名称必须和public修饰的接口名称保持一致。

8. 定义接口的目的

抽象类是模板,规定了一些业务类扩展时所需要遵守的一些公共规则;而接口比抽象类更高级,即接口是在最顶层进行设计的,规定了某些类所要遵守的一些公共性的规约。且避免了单继承局限性(即一个类可以实现多个接口)。
开发中最重要的就是写接口,比如service层的接口,dao层的接口等。
不论是抽象类还是普通类都可以实现接口,通过关键字implements去实现接口;
若是抽象类implements接口,则不需要全部实现接口中的抽象方法;
若是普通类implements接口,则必须像继承抽象类一样,去实现接口中所有的抽象方法。

9. 接口和抽象类的区别

口诀:定组权关使模局
  1. 定义上:抽象类用abstract关键字修饰class关键字去定义,接口用interface关键字去定义;
  2. 组成:抽象类的组成中包括 成员变量、构造方法、普通方法、常量、局部变量等;接口只包括公共的静态的全局常量和公共的非静态的抽象方法;
  3. 访问权限:抽象类中的成员变量和成员方法的访问权限有public、protected、default、private;接口中的成员变量和成员方法的访问权限只能是public;
  4. 两者的关系:抽象类可以实现多个接口(多继承),而接口不能继承抽象类,但是接口可以继承多个接口;
  5. 使用:抽象类使用extends关键字实现继承;接口使用implements关键字实现接口;
  6. 设计模式:抽象类适用于模板设计模式;接口适用于代理设计模式、工厂设计模式、适配器设计模式等;
  7. 局限:抽象类具有单继承的局限性,即一个子类不能同时继承多个抽象类;而接口可以实现多继承,一个普通类或者抽象类可以同时实现多个接口。

文档信息

Search

    Table of Contents