- final
- 声明一个属性表示常量, 需要声明时赋值/构造方法中赋值
- 通常与static连用, 只有一份, 类常量
- 否则每个对象堆中有一份该常量
- 声明一个方法
- 不可以被子类重写
- 声明一个类
- 不可以被继承
- String类为final类型类
- 应用: 常量类…
- 在参数中使用
- 表示不可以在方法内部对该参数重新赋值
- 声明一个属性表示常量, 需要声明时赋值/构造方法中赋值
- 抽象类
- 将一些具有相同特征和行为的类抽象为抽象类(将许多相同特征和行为的对象抽象为一个类)
- 使用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
重写与重载的区别
- 这是两种完全不同的语法现象:
- 重写是指一个类中定义多个方法名名相同但参数列表不同的方法, 在编译时, 根据参数的数量, 类型, 顺序, 来决定调用哪个方法
- 重载是指在子类中定义与父类完全相同的方法, 在程序运行时根据对象的类型(不是引用变量的类型)来调用不同的实现方法
- 重要:
- 重载编译期绑定, 根据参数变量的类型来决定执行哪个重载方法
- 重写运
- 这是两种完全不同的语法现象: