在分析2个方法之前先了解它们的语法定义和基础知识
抽象类和接口不能相互继承。他们都不能实现方法
接口:关键字: 声明接口interfate 实现接口implements。
接口中继承只有接口继承接口。
实现和接口之间只有字面意思,再无其他关系。
- 接口与类 ——接口是独立于"类"类型之外的,全新的数据类型,本质上完全不同
- 接口中声明属性,只允许public / static / final 公共静态常量 就算不写public static final三个关键字,也会自动认为是公共静态常量
- 接口中声明方法,只允许3种:public / static / default,不允许使用final修饰一个方法
- 接口允许多实现,一个类一个拥有多个接口 。
- 一个类可以实现多个接口(关键字implements),其中abstract修饰的方法实现类必须实现。
- 接口中的方法也有返回类型,
- 接口不允许有构造器
- 如果接口有父类,父类也必须是接口。
- 接口不是类所以不需要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
一个抽象的类? 那么它和普通类有什么区别? 抽象类本身和普通类唯一的区别是不能被实例化
- 抽象类的意义就是让其他类继承(JAVA中继承只能单继承,可以多重继承),其中abstract修饰的方法子类必须实现。
- 抽象类中抽象方法的定义,决定了子类的本质。
- 抽象类可以有构造器,子类运行时直接调用执行。
- 如果一个类有一个方法被声明是抽象的,那么这个类必须是抽象类。
- 抽象类中可以没有抽象方法(只有普通方法)。
- 子类继承抽象方法,子类的重写权限必须是public。
- 抽象类可以继承接口,并且不实现接口中的abstract方法。
两者之间的
相同点:
都是通过关系,让其他类实现其中的abstract方法。
都有抽象方法,都不能被实例化, 他们的设计都是让下层去实现
都支持动态绑定
不同:
接口中限制更严谨,属性只允许定义常量和静态,方法只允许出现静态,默认和抽象方法。而抽象类本身除了不能实例化以外它和普通的类没有区别,可以定义各种属性方法。
接口不能有构造器,抽象类可以有
抽象类使用要继承(extends),接口使用要实现(implements) 。 这里的区别就很大了继承只能单继承,实现确可以多实现
前者只要他们都是同一个父类就可以进行统一操作,后者只要实现了同一个接口就可以进行统一操作。
总结:
如果设计的场景时无论怎么变他都会存在,那么就设计到抽象方法中。继承的特性 不管继承延续了多少次,他们都还是属于同一个父类的延续
如果设计的场景是为了丰富需求,那么就设计成接口。
举例:
lol英雄技能 所有英雄都有4个技能——设计成抽象方法
装备系统 所有英雄都有可以装备装备,但不代表他们都有——设计成接口
场景联想:
抽象类B实现了接口A,C继承了抽象类B,那么C要同时实现A和B的抽象方法
C也能够调用到A接口,B抽象类里的所有方法和属性(private除外)
可以扩展的知识点:
继承:是站在子类立场( 子类变量= new 子类对象() )能继承父类的成员和方法.
多态:是站在父类立场( 父类变量=new 子类对象() )调用父类方法时,如果该方法被子类覆盖,则忽略父类方法,直接调用子类方法.
接口是否是Object的子类?
是:反编译可以找到java/lang/Object
不是:通过反射找不到
可能java为了安全起见设计成这样