-
目录
多态
抽象类
接口
1、多态的概述
-
多态概述
同一种事物,在不同时刻表现出来的不同状态;
例如:Cat c=new Cat(); Animal a=new Animal(); 猫可以是猫类型,同时猫也是动物的一种,就是动物类型
-
多态的前提
A:要有继承关系
B:要有方法重写。其实没有也是可以的,但是如果没有这个,语法上不报错,那么多态就没有意义。
C:要有父类引用指向子类对象。父 f=new 子();
2、多态中的成员访问特点
-
成员变量
编译看左边,运行看左边------我们采用多态的形式去访问成员变量,访问的是父类
-
构造方法
创建子类对象时,会访问父类的构造方法,对父类的数据进行初始化
-
成员方法
编译看左边,运行看右边-------我们采用多态的形式调用成员方法(用父类引用调用方法),以子类重写过后的为准
-
静态方法
编译看左边,运行看左边。(静态和类相关,算不上重写,所以还是左边父类的为准)
3、多态的好处
- 提高了代码的维护性(继承保证)
- 调高了代码的扩展性(由多态保证)
4、多态的弊端以及多态中向上转型和向下转型
-
多态的弊端
不能调用子类特有的方法/功能
-
解决办法
把父类的引用强制转换为子类的引用(向下转型)
-
多态本身就是一种向上转型
注意事项:堆内存中,父类空间标识在子类里面,先初始化父类
5、抽象类的概述及其特点
-
抽象类的概述
我们将多个子类的共性功能向上抽取到父类当中,我们父类肯定知道这些子类的共性功能,但是父类没有必要知道这些功能的具体实现是怎么样,因为也没有必要知道,因为每个子类都有差异性,如果我在父类中给出了这个功能的具体实现,那么每个子类的这个功能其实都是一样的,并不能体现出每个子类对这个功能的具体实现,所以父类只需要给出这个功能的声明,而不需要给出功能的具体实现,具体实现交由子类根据自身的差异去实现。
在Java中,一个没有方法体的方法应该定义为抽象方法(交给子类去做),而类中如果有抽象方法,该类必须定义为抽象类。
-
抽象类的特点
A:抽象类和抽象方法必须用abstract关键字修饰
抽象类格式:abstract class 类名{}
抽象方法格式:public abstract void eat(){};
B:抽象类不一定有抽象方法,有抽象方法的类一定是抽象类
C:抽象类中可以有构造方法,抽象类不能进行实例化(抽象类不能创建对象),那么要构造方法有什么作用呢?
用于子类访问父类数据时的初始化
D:抽象类不能直接实例化,那么抽象类如何实例化呢?
按照多态的方式,由具体的子类实例化。这也是多态的一种,抽象类多态。
E:抽象类的子类
要么是抽象类,要么重写抽象类中的所有抽象方法。
当一个类继承了一个抽象类,抽象类中的抽象方法是要求子类必须重写,非抽象方法子类可以直接继承使用。
-
抽象类的成员特点
成员变量:既可以是变量,也可以是常量。
构造方法:有。在创建子类对象时,对父类数据进行初始化。作用就是我们采用多态的形式可以间接的初始化抽象类。
成员方法:既可以是抽象的,也可以是非抽象的。
抽象方法:带有强制性,要求子类必须重写。
非抽象方法:子类继承的事情,提高代码的复用性。
6、抽象类中的面试题
-
一个类如果没有抽象方法,可不可以定义为抽象类?如果可以,有什么意义?
可以,外界不能创建该类的对象
-
abstract不能和哪些关键字共存?
private ------------冲突(abstract强制重写,private私有的不能继承,何谈重写)
final---------------- 冲突(abstract强制重写,final不让重写)
static---------------不能共存,没有意义
7、接口的概述及其特点--------接口与类同级别
-
接口概述
为了体现事物功能的扩展性,java中就提供了接口来定义这些额外的扩展功能,并不给出具体实现。接口中定义的方法是抽象的,不给出功能的具体实现。
接口也会定义规范和规则;
-
接口特点
A:接口用关键字interface表示 格式:interface 接口名{}
B:类实现接口用implments表示 格式:class 类名 implments 接口名 {}–>父子关系,子类实现接口
C:接口不能实例化也就是接口不能创建对象,那么接口如何实例化呢?
按照多态的方式来实例化。
D:接口的子类
可以是抽象类,但意义不大
可以是具体类,要重写接口中的所有抽象方法
8、接口的成员特点
-
接口成员特点
成员变量:只能是常量,并且是静态的。接口中的成员变量全部是公共的静态常量,接口名直接调用。默认修饰符:public static final 建议自己手动给出
构造方法:接口中没有构造方法
成员方法:接口中的所有方法都是抽象方法。默认修饰符:public abstract ,建议自己手动给出
9、类、接口以及之间的关系
-
类与类
继承关系***extends***,只能单继承,可以多层继承
-
类与接口
实现关系***implments***,可以单实现,也可以多实现。一个类可以实现多个接口
一个类在继承一个类的同时,也可以实现多个接口,用逗号隔开。
-
接口与接口
继承关系***extends***,可以单继承,也可以多继承
10、抽象类和接口的区别
-
抽象类和接口均不能实例化,不能new对象
-
成员区别:
抽象类:
成员变量:可以是变量,也可以是常量
构造方法:有
成员方法:可以抽象,也可以非抽象
接口:
成员变量:只可以是常量
没有构造方法
成员方法:只可以是抽象方法,没有非抽象方法
-
关系区别:
类与类 ------继承,单继承,多层继承
类与接口-------实现,单实现,多实现
接口与接口-------继承,单继承,多继承
-
设计理念区别
抽象类 被继承体现的是is a的关系。抽象类中定义的是该继承体系的共性功能。
接口 被实现体现的是like a的关系。接口中定义的是该继承体系的扩展功能。
-
JDK1.8之后在接口中提供了用default修饰的方法,可以给出功能的具体实现,子类可以继承下去用