抽象和接口类
抽象类
抽象方法 : 没有方法体的方法。
抽象类:包含抽象方法的类。
public abstract calss Animal{
public abstract void eat();
}
- 不能直接new抽象类方法
- 必须用一个子类来继承extents抽象父类
- 继承抽象类的子类必须重写父类所有的抽象方法。
- 抽象类中,不一定包含抽象方法,但是有抽象方法的类必定是抽象类。
接口类
public interface 接口名称 {
//1. 抽象方法
public abstract void method();
//2. 默认方法:供子类调用或者子类重写
public default void method() {
// 执行语句
}
//3. 静态方法: 只能使用接口名调用,不可以通过实现类的类名或者实现类的对象调用
public static void method2() {
// 执行语句
}
//4. 私有方法:供接口中的默认方法或者静态方法调用。
private void method() {
// 执行语句
}
}
非抽象子类实现接口:
- 必须重写接口中所有抽象方法。
- 继承了接口的默认方法,即可以直接调用,也可以重写。
- 接口的多实现:一个类是可以实现多个接口的
class 类名 implements 接口名 {
// 重写接口中抽象方法【必须】
// 重写接口中默认方法【可选】
}
不同点:
-
每个类只能继承一个抽象类,但是可以实现多个接口
- 接口和抽象类的概念不一样。接口是一种公共的规范标准,这个可以理解为接口是对动作的抽象,抽象类是对根源的抽象(即对本质的抽象与其他类的本质不同)。
-
抽象类中不一定都是抽象的方法,也可以有具体实现的方法,这样就可以把大家公用的方法提升到抽象类中,然后具体的方法可以留给子类自己实现(此处经典的应用,模板方法设计模式)。所以抽象类可以更好的实现代码的复用
-
目的不同:
- 接口的设计目的,是对类的行为进行约束。它只约束了行为的又无,但不对如何实现精细限制;
- 抽象类的设计目的,是代码复用。当不同的类具有某些相同的行为,且其中一部分行为的实现方式一致时,可以让这些类都派生于一个抽象类。
-
本质:
- 抽象类时对类的本质的抽象。抽象类包含并实现子类的通用特性,而子类差异化的特性由子类来实现。
- 接口是对行为的抽象,核心是定义行为。即实现类可以做什么。
-
使用场景:当你关注一个事物的本质的时候,用抽象类;当你关注一个操作的时候,用接口