以下胡扯纯属个人理解,有错误还请不吝指正
Java的三大特性:封装、继承、多态
多态的三个必要条件:继承、重写、父类引用指向子类对象
而抽象类满足了继承与重写,所以抽象类是多态的一种实现方式
接口被实现的过程就是实现类重写抽象方法的过程,所以接口也是多态的一种实现方式
抽象类抽象在哪里
1.正常的类可以加abstract关键字将其声明为抽象类
2.抽象类可以成员变量、成员方法(有完整的方法实现)、构造方法、也可以有抽象方法——即被abstract修饰的,只有方法声明,没有具体实现的方法。
3.抽象类不能实例化对象,必须被继承并实现了所有抽象方法之后才可以实例化对象
(既然抽象类不能实例化对象,为何会有构造方法?这是因为子类调用构造方法进行实例化的时候会优先调用父类对应的构造方法,super关键字显示调用,或隐式调用无参构造方法)
抽象类能否具象一点
抽象类及其衍生的子类可以理解为一栋大楼,抽象类就相当于这栋大楼的框架,这栋楼的安全通道,电梯等都是已经实现的方法,里面每一户(空着的)就相当于定义好的抽象方法,大楼要想营业挣钱(实例化),就必须招租(继承并实现抽象方法)让商户入驻才能开始营业挣钱。
然后我们来看抽象类的抽象描述
java通过类来描述一个对象,但并不是所有的类都是用来描述对象的,没有充分的信息描述对象的类就属于抽象类,这样官方的描述对我的理解起不到任何作用,结合上述理解:抽象类连同子类一起来将某个对象描述完整。
实战中,我们可以将通用的方法实现写好,差异性的定义为抽象方法,并将类声明为抽象类,具体差异性的实现,交由相应的子类去实现。将差异性解耦,共性聚集。
接口
1.抽象方法的集合,通过interface来声明接口
2.接口只能有public static final 修饰的常量,1.8之后可以有静态方法和default 修饰的方法了
3.接口中的方法都是隐式抽象,变量也是隐式指定为public static final
4.接口类型可以声明变量,可以成为一个空指针或其实现类的对象
5.实现接口的类如果没有重写所有抽象方法,就必须声明成抽象类
类 | 抽象类 | 接口 |
---|---|---|
实例化对象 | 不可以 | 不可以 |
构造方法 | 构造方法 | 不可以 |
单继承 | 单继承 | 多继承 |
成员变量+方法 | 成员变量+方法 | 只能有public static final修饰的常量+抽象方法(1.8之后可以有方法体) |
静态方法+代码块 | 静态方法+代码块 | 1.8之后静态方法 |
标记接口:不包含任何方法的接口,用来指定一个公共的父接口(指定该类型可以做一些特定的事情);用来声明变量