多态 polymorphism
- 同一个对象,在不同时刻表现出来的不同状态
1.多态存在的3个必要条件:
- 要有继承/实现关系
- 要有方法重写
- 因为没有方法重写的多态是没有意义的
- 有父类引用指向子类对象
- Animal a = new Cat();
2.多态中成员访问特点
成员变量
- 编译看左边,执行看左边
- 父类引用不能使用子类特有的成员变量
成员方法
- 编译看左边,执行看右边
- 父类引用不能使用子类特有的成员方法,但可使用重写方法
- 因为成员方法有 重写,成员变量没有
3.多态的好处和弊端
好处
- 提高程序的 扩展性
- 使用父类型作为参数,使用时用具体的子类型参与操作
弊端
- 不能访问子类的特有成员变量、特有成员方法
4.多态的转型
- 向上转型
- 从子到父
- 父类引用指向子类对象
- Animal a = new Cat();
- 向下转型
- 从父到子
- 父类引用转为子类对象
- Cat c = (Cat)a;
抽象类
- 在java中,一个没有方法体的方法应该被定义为抽象方法
- 如果类中有抽象方法,该类必须被定义为抽象类
抽象类特点
- 抽象类和抽象方法必须使用 abstract 关键字修饰
- public abstract class name{}
- public abstract void eat();
- 抽象类中不一定有抽象方法,有抽象方法的类一定是抽象类
- 抽象类不能实例化
- 因为抽象方法没有方法体,实例化对象调用抽象方法会出错
- 只能参照多态的方式,对子类对象实例化,这叫抽象类多态
- 抽象类的子类
- 要么重写抽象类中的所有抽象方法
- 要么本身是抽象类
抽象类的成员特点
- 成员变量
- 可以是变量
- 也可以是常量
- 构造方法
- 有构造方法,但不能实例化
- 此处的构造方法是用于子类访问父类数据的初始化
- 成员方法
- 可以有抽象方法:限定子类必须完成某些动作
- 也可以有非抽象方法:提高代码复用性
abstract 不能和哪些关键字共存
private
- 因为抽象方法存在的意义就是为了让子类重写的,如果有private修饰的话,子类看不到所以无法重写。
final
- final 修饰的类不能被继承,修饰的方法不能被重写,修饰的成员变量只能为常量。
- 继承的子类要重写这个抽象方法,会出现矛盾
static
- static修饰后可以直接 类名. 调用方法,但是抽象方法没有实现体,调用无意义
接口 interface
- 接口就是一种公共的规范标准,只要符合,即可通用
- java中的接口更多地体现在对行为的抽象
1.接口的特点
- 接口用关键字 interface 修饰
- public interface 接口名{}
- 类实现接口用 implements 接口名{}
- public class 类名 implements 接口名{}
- 接口不能实例化
- 参照多态的方式,通过实现类对象实例化,这叫接口多态
- 多态的前提:
- 有继承/实现关系
- 有方法重写
- 有父(类/接口)引用指向(子/实现)类对象
- 接口的实现类
- 要么重写接口中的所有抽象方法
- 要么是抽象类
2.接口的成员特点
- 成员变量
- 只能是自定义常量(默认是常量)
- 默认修饰符: public static final
- 构造方法
- 接口没有构造方法,因为接口主要是对行为进行抽象的,没有具体存在
- 一个类中没有父类,默认继承Object 类
- 成员方法
- 只能是抽象方法 (JDK 1.7前)
- 默认修饰符: public abstract
3.接口和类的关系
类和类的关系
- 继承关系,只能单继承,不可以多继承;可以多层继承,不可以循环继承
类和接口的关系
-
实现关系,可以单实现,也可以多实现,还可以在继承一个类的同时实现多个接口
-
class A implements B,C{
}
接口和接口的关系
- 继承关系,可以单继承,也可以多继承
4.抽象类和接口的区别
- 成员区别
- 抽象类
- 变量,常量;构造方法;有抽象方法,也有非抽象方法
- 接口
- 常量;抽象方法
- 抽象类
- 关系区别
- 类与类
- 继承、单继承
- 类与接口
- 实现、可以单实现、也可以多实现
- 接口与接口
- 继承、单继承、多继承
- 类与类
- 设计理念区别
- 抽象类
- 对类抽象,包括属性、行为
- 抽象类与子类存在 “is a” 的关系,让子类继承抽象类
- 接口
- 对行为抽象、主要是行为
- 接口与子类存在 “like” 的关系,让子类实现接口
- 抽象类
- 接口就是类,所以Object就是接口超类?
- 接口根本就不是类,接口是接口,类是类
- 接口、抽象类、类都能生成 .class 文件