抽象方法
抽象类中的抽象方法的修饰符
修饰符只有public、protected两种,不写默认时为public;
抽象类中的抽象方法
必须用abstract修饰(因为抽象类中可以有普通方法),只有方法头,没有方法体。例如:
public abstract class Test {
public abstract void methodA();
abstract void methodB();
}
接口中方法的修饰符
接口中的抽象方法默认有public abstract 修饰,所以修饰符只能是public
接口中的抽象方法
可以不用abstract修饰,只有方法头,没有方法体。例如:
public interface Show1 {
public abstract void methodA();
abstract void methodB();
void methodC();
}
抽象方法中不能使用的修饰符
- static(静态的)
- final(最终的)
- native(本地方法)
- synchronized(同步的)
- protected(受保护的)
- private(私有的)
原因分析
- static、final修饰方法不能被重写
- private修饰的方法不能被访问
- protected修饰的方法只能被同包访问,使接口失去了面向接口编程的初衷
- 抽象方法需要被重写
- synchronized对方法的具体实现细节有要求,抽象方法不考虑方法的实现
抽象类的特点
- 拥有抽象方法的类一定是抽象类
- 抽象可以有普通方法
- 抽象类不可以直接创建对象(防止抽象方法被调用,抽象方法被调用没有意义)
抽象类中可以没有抽象方法(其目的是使该类不能被实例化,但方法可交由子类实现)。
接口的特点
- 接口的属性必须是常量,即初始化时就必须赋值
- 接口的方法必须是抽象方法
- 接口中的方法均为公共访问的方法
- 接口中无法定义普通的成员变量
使用接口的好处
- 解决多继承的弊端
- 接口的出现避免了单继承的局限性
- 多个接口之间可以使用extends进行继承
- 接口的出现降低了耦合性
接口和抽象类的区别与联系
- 接口只能做方法的声明,抽象类可以做方法的声明,也可以做方法的实现。
- 接口里定义的变量只能是公共的静态常量,抽象类中定义的变量是普通变量。
- 接口是设计的结果,抽象类是重构的结果。
- 抽象类里可以没有抽象方法。
- 如果一个类里有抽象方法,那么该类只能是抽象类。
- 抽象方法要被实现,所以不能是静态的,也不能是私有的。
- 接口可以继承接口,并可多继承接口,但类只能单继承。(很重要)
- 接口中的常量:有固定的修饰符public static final(不能用private和protected修饰/本质上都是static的而且是final类型的,不管加不加static修饰)。
- 接口中的抽象方法:有固定的修饰符public abstract 。
- 抽象类可以有 main 方法,接口没有 main 方法。
- 抽象类的访问速度比接口要快,接口是稍微有点慢,因为它需要时间去寻找在类中实现的方法。
- 抽象类和接口都是用来抽象具体的对象的,但是接口的抽象级别更高。
关于接口与抽象类的使用场景
- 优先选用接口,尽量少用抽象类
- 需要定义子类的行为,又要为子类提供共性功能时才选用抽象类