一、抽象类
1、理解
用abstract关键字定义的类,称为抽象类
用abstract关键字定义的方法,称为抽象方法
意义:
当设计父类时,发现该父类根本不需要创建对象,并且里面有不好描述的方法。这个时候往往将该父类设计成抽象类!
2、abstract关键字
abstract属于一种修饰符,只能用于修饰类或方法,不能修饰属性、构造器、局部变量
3、抽象类
语法:
[修饰符] abstract class 类名{}
特点:
①抽象类不可以使用final修饰符,原因:和抽象类的意义冲突(final修饰的类不可以被继承)
②抽象类中可以有普通成员,也可以有抽象方法
③抽象类中有构造器,目的:为了初始化信息
④抽象类不可以创建本类对象
⑤抽象类的扩展:子类继承抽象类时,如果子类是具体的实现类,要求必须实现抽象类中的抽象方法,否则,不用实现抽象类的抽象方法
4、抽象方法
语法:
[修饰符] abstract 返回类型 方法名(参数列表);
特点:
①抽象方法没有实现体,只有方法签名,使用分号结尾
②修饰符不可以是private、static、final,因为违背了实现的意义
③抽象方法只能出现在抽象类或接口中,不能出现在具体的实现类中
④当含有抽象方法的类或接口,被实现类实现时,要求必须实现里面所有的抽象方法
二、接口
1、好处
①避免了单继承局限性
②接口的实现更加灵活,实现类和接口之间不再是is-a 的关系,仅仅需要 like-a 的关系
③提高代码的解耦性,降低依赖性
2、定义特点
①使用interface关键字定义,修饰符只能是public或默认
②jdk8之前,接口中只能是静态常量+抽象方法
静态常量的修饰符,只能是public static final ,可以省略
抽象方法的修饰符,只能是public abstract,可以省略
jkd8对接口的改进:接口中可以有静态方法和默认方法
静态方法:
public static 返回类型 方法名(参数列表){
//实现体
}
默认方法:
pubilc default 返回类型 方法名(参数列表){
//实现体
}
jdk9对接口的改进:接口中可以有私有方法(jdk8增加了可以实现的方法,为了方法体中调用一些共同的代码,增加私有方法,供本接口内部使用)
private 返回类型 方法名(参数列表){}
注意:
当实现的接口和父类中有同名的实现方法时,子类默认执行的是父类的方法,遵循"类优先"原则
当实现的多个接口中有同名的实现方法时,子类必须重写该方法,否则有歧义,编译报错
③接口中没有构造器
④接口不能创建本身对象
3、使用特点
①类可以实现多个接口,使用implements关键字
class A implements 接口1,接口2{}
②类可以既继承父类,又实现接口
class A extends B implements 接口1,接口2{}
③接口可以继承多个接口,使用extends关键字
interface Inter extends 接口1,接口2{}
④普通的实现类实现接口的话,必须实现里面所有抽象方法;抽象类实现接口的话,不用全部实现所有抽象方法
三、抽象类和接口比较
定义关键字 |
构造器 | 创建对象本身 | 能否有普通成员 | 里面的属性 | 里面的抽象方法 | 继承 | |
抽象类 | abstract class | 有 | 否 | 可以 | 无要求 |
不能是private、final、static, 其他修饰符可以 |
单继承 |
接口 | interface | 无 | 否 | 不可以 |
要求必须是静态的常量属性 修饰符只能是public static final,可以省略 |
jdk8之前只能是public abstract,可以省略 jkd8之后可以是静态方法和默认方法 jkd9之后可以是私有方法 |
多继承多实现 |