接口与抽象类对比

在分析2个方法之前先了解它们的语法定义和基础知识

抽象类和接口不能相互继承。他们都不能实现方法


接口:关键字: 声明接口interfate  实现接口implements。

 接口中继承只有接口继承接口。

实现和接口之间只有字面意思,再无其他关系。

  1.   接口与类 ——接口是独立于"类"类型之外的,全新的数据类型,本质上完全不同
  2.   接口中声明属性,只允许public / static / final 公共静态常量 就算不写public  static  final三个关键字,也会自动认为是公共静态常量
  3.   接口中声明方法,只允许3种:public / static / default,不允许使用final修饰一个方法
  4.   接口允许多实现,一个类一个拥有多个接口 。
  5.   一个类可以实现多个接口(关键字implements),其中abstract修饰的方法实现类必须实现。
  6.   接口中的方法也有返回类型,
  7.   接口不允许有构造器
  8.   如果接口有父类,父类也必须是接口。
  9.   接口不是类所以不需要class修饰。
public interface Animal {    //接口不是一个类所有不需要class修饰

    public static final boolean sex = true;    //    公开静态常量的属性
    
    void animal_1(){
        //    **报错 Abstract methods do not specify a body
        //    抽象方法未指定类型
    }
    
    static void me() {
        //    静态static的方法
    }
    
    public default void sleep() {
        //    默认访问修饰符的方法
        //    public default 也可以这样写,default只是说明默认访问修饰符的一个英文
    }
    
    abstract int animal();    //正确声明的抽象方法
        //    接口也有返回类型
}

抽象类:关键字abstract class

一个抽象的类? 那么它和普通类有什么区别?  抽象类本身和普通类唯一的区别是不能被实例化

  1. 抽象类的意义就是让其他类继承(JAVA中继承只能单继承,可以多重继承),其中abstract修饰的方法子类必须实现。
  2. 抽象类中抽象方法的定义,决定了子类的本质。
  3. 抽象类可以有构造器,子类运行时直接调用执行。
  4. 如果一个类有一个方法被声明是抽象的,那么这个类必须是抽象类。
  5. 抽象类中可以没有抽象方法(只有普通方法)。
  6. 子类继承抽象方法,子类的重写权限必须是public。
  7. 抽象类可以继承接口,并且不实现接口中的abstract方法。

两者之间的

相同点:

都是通过关系,让其他类实现其中的abstract方法。

都有抽象方法,都不能被实例化, 他们的设计都是让下层去实现

都支持动态绑定

不同:

接口中限制更严谨,属性只允许定义常量和静态,方法只允许出现静态,默认和抽象方法。而抽象类本身除了不能实例化以外它和普通的类没有区别,可以定义各种属性方法。

接口不能有构造器,抽象类可以有

抽象类使用要继承(extends),接口使用要实现(implements) 。 这里的区别就很大了继承只能单继承,实现确可以多实现

前者只要他们都是同一个父类就可以进行统一操作,后者只要实现了同一个接口就可以进行统一操作。


总结:

如果设计的场景时无论怎么变他都会存在,那么就设计到抽象方法中。继承的特性 不管继承延续了多少次,他们都还是属于同一个父类的延续

如果设计的场景是为了丰富需求,那么就设计成接口。

举例:

lol英雄技能 所有英雄都有4个技能——设计成抽象方法

装备系统  所有英雄都有可以装备装备,但不代表他们都有——设计成接口


场景联想:

  抽象类B实现了接口A,C继承了抽象类B,那么C要同时实现A和B的抽象方法

  C也能够调用到A接口,B抽象类里的所有方法和属性(private除外)


 

可以扩展的知识点:

继承:是站在子类立场( 子类变量= new 子类对象() )能继承父类的成员和方法.

多态:是站在父类立场( 父类变量=new 子类对象() )调用父类方法时,如果该方法被子类覆盖,则忽略父类方法,直接调用子类方法.

接口是否是Object的子类?

是:反编译可以找到java/lang/Object

不是:通过反射找不到

可能java为了安全起见设计成这样

posted @ 2019-11-30 14:18  liqking  阅读(422)  评论(0编辑  收藏  举报