多态
-
多态前提
a、要有继承
b、要有方法重写
c、要有父类引用指向子类对象 -
执行特点
成员变量
编译left(父类),运行left(父类)
成员方法
编译left(父类),运行right(子类)
静态方法
编译left(父类),运行left(父类)
成员方法执行属于动态绑定,执行子类方法,静态方法不存在动态绑定,执行父类方法 -
多态好处、弊端
提高了代码维护性(继承保证)
提高了代码扩展性(多态保证)
例:可以作为形式参数,接收任意子类对象 -
多态弊端
不能使用子类特有的属性和行为
抽象类
-
特点:
a、抽象类和抽象方法必须用abstract关键字修饰
abstract class 类名{}
public abstract void method();
b、抽象类不一定有抽象方法,有抽象方法的类一定是抽象类或者接口
c、抽象类不能实例化,那么抽象类如何实例化呢?
按照多态的方式,由具体的子类实例化,其实也属于多态的一种
d、抽象类的子类
要么是抽象类
要么重写抽象类中的所有抽象方法 -
抽象类成员特点
成员变量:既可以是变量,也可以是常量,abstract不能修饰成员变量
构造方法:有,用与子类访问父类数据的初始化
成员方法:既可以是抽象的,也可以是非抽象的
成员方法特性:
抽象方法:强制要求子类要做的的事情
非抽象方法:子类继承的事情,提高代码复用性 -
面试题
a、一个抽象类如果没有抽象方法,可不可以定义为抽象类?意义?
可以,目的只有一个,不让其他类创建本类对象,由子类来完成
b、abstract不能和哪些关键字共存
private
被abstract修饰是为了让子类看到并强制重写
被private修饰不让子类访问,继承发生矛盾
final
被abstract修饰的方法强制要求子类重写
被final修饰的方法不让子类重写,矛盾
static
被abstract修饰的方法没有方法体
被static修饰的方法可以用类名直接调用,但是调用抽象方法是 没有意义的,静态方法不存在继承、重载所以矛盾
接口
-
概述
从狭义的角度讲,就是值java中的interface
从广义的角度讲,对外提供规则的都是接口 -
特点
接口用关键字interface表示,interface 接口名{ }
类实现接口用implements表示,class 类名 implements 接口名{ }
接口不能实例化,按照多态的方式来实例化
接口的子类,可以是抽象类,意义不大;也可以是具体类,要重写接口中的所有抽象方法 -
接口成员特点
成员变量:只能是常亮,并且是静态的、公开的
默认修饰符 public static final
构造方法:接口没有构造方法
成员方法:只能是抽象方法,(随jdk版本而不同,Java8中允许接口定义默认方法,默认方法必须使用default修饰,且不能用static和final修饰,默认也只能用public修饰。通过默认方法实现“多继承”。不能直接使用接口中定义的默认方法,需要使用接口实现类来调用默认方法。)
默认修饰符 public abstract -
类与类、类与接口、接口与接口关系
类与类:
继承关系,只能单继承,可以多层继承
类与接口:
实现关系,可以单实现,也可以多实现,也可以继承一个类同时实现多 个接口
接口与接口:
继承关系,可以单继承,也可以多继承 -
抽象类与接口区别
a、成员区别
抽象类:
成员变量:可以是变量,也可以是常量
构造方法:有
成员方法:可以抽象,也可以非抽象
接口:
成员变量:只可以是常量
成员方法:只可以是抽象方法(注意jdk版本不同)
b、关系区别:
同上。。。
c、设计理念区别
抽象类,被继承体现的是“is a”的关系。抽先类中定义的是该继承体系的共性功能。
接口,被实现体现的是“like a”的关系,接口中定义的是该继承体系的扩展功能。