多态
针对某个类型的方法调用,其真正执行的方法取决于运行时期实际类型的方法。多态具有一个非常强大的功能,就是允许添加更多类型的子类实现功能扩展,却不需要修改基于父类的代码。调用者只需要调用父类同名的方法,由具体子类来处理多种情况。
多态的实际意义在于屏蔽不同子类的差异性实现通用的编程带来不同的 效果。
- 当父类类型的引用指向子类类型的对象时,父类类型的引用可以直接调 用父类独有的方法。
- 当父类类型的引用指向子类类型的对象时,父类类型的引用不可以直接 调用子类独有的方法。
- 对于父子类都有的非静态方法来说,编译阶段调用父类版本,运行阶段 调用子类重写的版本(动态绑定)。
- 对于父子类都有的静态方法来说,编译和运行阶段都调用父类版本。
抽象类
抽象方法主要指不能具体实现的方法并且使用abstract关键字修饰,也就是没有方法体。不能创建对象。
访问权限 abstract 返回值类型 方法名(形参列表);
- 抽象类中可以有成员变量、构造方法、成员方法;
- 抽象类中可以没有抽象方法,也可以有抽象方法;
- 拥有抽象方法的类必须是抽象类,因此真正意义上的抽象类应该是具有抽象方法并且使用abstract关键字修饰的类。
抽象类的实际意义
抽象类的实际意义不在于创建对象而在于被继承。
当一个类继承抽象类后必须重写抽象方法,否则该类也变成抽象类,也 就是抽象类对子类具有强制性和规范性,因此叫做模板设计模式。
接口
接口就是一种比抽象类还抽象的类,体现在所有方法都为抽象方法。
定义类的关键字是class,而定义接口的关键字是interface。
类和接口之间的关系
抽象类和接口的主要区别
- 抽象类中可以有成员方法,而接口中只可以有抽象方法。
- 抽象类中增加方法时子类可以不用重写,而接口中增加方法时实现类需 要重写(Java8以前的版本)。
- 从Java8开始增加新特性,接口中允许出现非抽象方法和静态方法,但非 抽象方法需要使用default关键字修饰。
- 从Java9开始增加新特性,接口中允许出现私有方法。