在分析2个方法之前先了解它们的语法定义和基础知识
抽象类和接口不能相互继承。他们都不能实现方法
————————
接口:关键字: 声明接口interfate 实现接口implements。
接口中继承只有接口继承接口。
实现和接口之间只有字面意思,再无其他关系。接口与类 ——接口是独立于"类"类型之外的,全新的数据类型,本质上完全不同
接口中声明属性,只允许public / static / default 公共静态常量就算不写public static final三个关键字,也会自动认为是公共静态常量
接口中声明方法,只允许3种:public / static / default,不允许使用final修饰一个方法
接口允许多实现,一个类一个拥有多个接口 。
一个类可以实现多个接口(关键字implements),其中abstract修饰的方法实现类必须实现。
接口中的方法也有返回类型,
接口不允许有构造器
如果接口有父类,父类也必须是接口。
接口不是类所以不需要class修饰。
public interface Animal { //接口不是一个类所有不需要class修饰
public static final boolean sex = true; //公开静态常量的属性
voidanimal_1(){//**报错 Abstract methods do not specify a body//抽象方法未指定类型
}static voidme() {//静态static的方法
}public default voidsleep() {//默认访问修饰符的方法//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除外)