抽象类 将一些具有相同特征和行为的类抽象为抽象类(将许多相同特征和行为的对象抽象为一个类) 使用abstaract关键字声明一个抽象类 规则: 抽象类中可以没有抽象方法 不可以实例化 抽象方法用abstract声明, 由子类/抽象子类来实现 非抽象子类必须实现父类所有的抽象方法 抽象类继承抽象类, 可以不用实现 默认添加无参构造 不能为声明为final, 因为这样不能有子类, 则无意义 抽象类的意义: 为子类提供统一的类型 封装子类重复的内容(成员变量/方法) 定义有抽象方法, 各子类虽然有不同的实现, 但方法的定义是一致的
接口 接口是一组行为规范的定义, 没有实现 OOP原则, 面向接口编程 规则: 抽象方法默认: public abstract 常量默认默认:public static final, 接口中只能定义常量 不可以有静态/非静态代码块 类/抽象类可以实现多个接口, 使用implements. 类需要实现所有接口中抽象方法 接口继承接口用extends, 同样可以多继承. JDK 1.8之后 可以添加默认实现方法 格式: default T functionName(M m) {} --> 默认为public 接口不属于类, 与类平级(类似于注解, 枚举) 接口不能有构造方法 可以IA继承IB, A实现IA,IB, 不推荐 命名习惯ITest, Testable
多态 方法的重载与重写 对象的多态性 父类的引用指向子类的对象 编译期, 能调用什么看父类 运行期, 实际执行哪个实现看子类 使用父类引用传参, 便于扩展 多态的意义 同一个类型的引用指向不同的对象, 有不同的实现 同一个对象造型成不同的类型, 有不同的功能 Sport a = new Man() Wen a = new Man() 向上造型 父类的类型 实现的接口 强制转型 可以通过强制转型将父类型变量转为子类型变量, 前提是该变量指向的对象确实是该子类类型 也可以通过强制转型将变量转为某种接口类型, 前提是该该变量指向的对象确实实现了该接口 instanceof 子类 instanceof 父类/父抽象类/接口/父接口 均为true 重写与重载的区别 这是两种完全不同的语法现象: 重写是指一个类中定义多个方法名名相同但参数列表不同的方法, 在编译时, 根据参数的数量, 类型, 顺序, 来决定调用哪个方法重载是指在子类中定义与父类完全相同的方法, 在程序运行时根据对象的类型(不是引用变量的类型)来调用不同的实现方法 重要: 重载编译期绑定, 根据参数变量的类型来决定执行哪个重载方法重写运