抽象方法
抽象方法分类
抽象方法存在两者情况下,分别是抽象类和接口。
抽象类中的抽象方法
必须用abstract修饰,只有方法头,没有方法体。
修饰符只有public、protected两种,不写默认时为public;
例如:
public abstract class Test {
public abstract void a();
abstract void b();
}
接口中的抽象方法
可不用abstract修饰,只有方法头,没有方法体。(接口中的抽象方法默认有public abstract 修饰,所以修饰符只能是public )
例如:
public interface Show1 {
public abstract void a();
abstract void b();
void c();
}
抽象方法的修饰符
抽象方法的修饰符只有public、protected两种,不写默认时为public;
抽象方法不能使用的修饰词(面试题)
- static(静态的)
- final(最终的)
- native(本地方法)
- synchronized(同步的)
- protected(受保护的)
- private(私有的)
public interface Show1 {
public abstract void a();//编译正确,完整写法
abstract void b();//编译正确,默认有public
void c();//编译正确,默认有public abstract
public abstract static void f1(); //编译时错误,抽象方法不能是静态的
final abstract void f2(); //编译时错误,抽象方法不能是final的
public abstract native void f3(); //编译时错误,抽象方法不能是本地方法
public abstract synchronized void f4(); //编译时错误,抽象方法不能是同步的
protected abstract void f5(); //编译时错误,接口的抽象方法不能用protected修饰,抽象类可以
private abstract void f6(); //编译时错误,抽象方法不能用private修饰
}
原因解析:
- 抽象方法需要被重写
- static、final修饰方法不能被重写
- private修饰的方法不能被访问
- protected修饰的方法只能被同包访问,使接口失去了面向接口编程的初衷
- native修饰的方法和抽象方法实现方式冲突,native修饰的方法的实现交由本地操作系统实现,抽象方法的实现交由子类
- synchronized对方法的具体实现细节有要求,抽象方法不考虑方法的实现
抽象类
什么是抽象类
- 用abstract修饰的类就是抽象类
抽象类的定义格式
abstract class 类名{
}
抽象类的特点
- 拥有抽象方法的类一定是抽象类
- 抽象可以有普通方法
- 抽象类不可以直接创建对象(防止抽象方法被调用,抽象方法被调用没有意义)
抽象类中可以没有抽象方法(其目的是使该类不能被实例化,但方法可交由子类实现)。
接口
什么是接口
- 接口是功能的集合,是一个比抽象类更加抽象的类,接口也是一种数据类型.
- 接口里面只描述做么些事情,并没有具体的实现
- 具体的实现由子类完成,将功能的定义与实现分离
- 世间万物均有接口
接口的要求
- 定义接口必须要用interface
- 接口的属性必须是常量,即初始化时就必须赋值
- 接口的方法必须是抽象方法
- 接口中的方法均为公共访问的方法
- 接口中无法定义普通的成员变量
- 接口的实现使用implements
public interface 接口名{
//属性的定义
public static final 数据类型 常量名 = 值;
// 抽象方法
public abstract viod 方法名();
}
使用接口的好处
- 解决多继承的弊端
- 接口的出现避免了单继承的局限性
- 多个接口之间可以使用extends进行继承
- 接口的出现降低了耦合性
接口与抽象类的区别
- 抽象类为部分方法提供实现,避免子类重复实现这些方法,提高代码重用性;接口只能包含抽象方法
- 一个类只能继承一个直接父类(可能是抽象类),却可以实现多个接口;(接口弥补了Java的单继承)
- 抽象类是这个事物中应该具备的内容, 继承体系是一种
- 接口是这个事物中的额外内容,继承体系是一种
接口与抽象类的使用场景
- 优先选用接口,尽量少用抽象类
- 需要定义子类的行为,又要为子类提供共性功能时才选用抽象类