抽象接口分析
抽象类与接口
抽象类
- 抽象类提供了继承的概念
- 抽象类出发点就是为了继承
public abstract class Animal(){
public abstract void cry();
}
public class Cat extends Animal(){
@Override
public void cry(){
System.out.println("喵")
}
}
public class Test(){
Animal a1 = new Cat();
a1.cry();
}
outpit:
喵
接口
- 接口可以看做是一种比抽象类更抽象的“类”(接口本身不是类)
- 不是类 👉 不能实例化
- 接口是抽象类的衍生,通过接口可以实现多重继承
- 实现接口的类必须要实现接口所有方法
注意事项
- 接口的所有方法自动被声明为public (为其他时会出错)
- 接口中的成员变量自动为(public static final) 可以通过ImplementClass.name访问
- 接口中不存在实现方法
- 实现接口的非抽象类必须实现接口所有方法,抽象类可以不用事先
- 实现多接口时注意避免方法名重复
抽象类与接口的区别
1.语言层次
- 抽象类可以有任意范围的成员数据,同时也可以有自己的非抽象方法;接口只能有静态且不能修改的成员数据,同时它所有的方法都为抽象
- 抽象类只能单继承;接口类可以实现多接口
2.设计层次
- 抽象层次不同,抽象类主要对应类抽象,根据不同类之间的共性提炼;接口主要是对行为的抽象
- 跨域不同;抽象类跨域的是具有相似特点的类(遵循is-a原则);接口则是跨越不同类
- 设计层次不同;抽象类一般自下而上设计,多个相似子类存在时,提取并新建父类;接口不用知道怎么实现,谁来实现
例子: 报警们(同时具有门的开/关方法,和报警方法)
abstract class Door(){
abstract void open();
abstract void close();
}
interface Alarm(){
void alarm();
}
class AlarmDoor extends Door implement Alarm(){
void open(){}
void close(){}
void alarm{}
}
如果在抽象类Door中加入alarm方法,则不符合isp原则,因为alarm不是Door的共性