基本概念:对象、类、属性和方法
对象
一个对象是一个状态和行为的集合。
- 状态:对象中包含的数据。在Java中,这些是对象的字段。
- 行为:对象支持的操作。在Java中,这些被称为方法。
类
每个对象都有一个类,类定义了类型和实现:
一个类定义了方法和字段
方法和字段统称为成员
包括类成员变量和类方法。
静态/实例成员变量(方法)
类变量:与类相关而不是与类实例相关的变量。您还可以将方法与一个类——类方法关联起来。
使用‘.’来引用静态变量/方法。
那些不是类方法或类变量的方法和变量被称为实例方法和实例变量。
引用类实例中的方法和变量来使用实例方法/变量。
类变量和类方法与一个类相关联,并且每个类出现一次。使用它们不需要创建对象。实例方法和变量在每个类的实例中出现一次。
静态方法不与类的任何特定实例相关联,而实例方法(没有静态关键字的声明)必须在特定对象上调用。
接口和枚举
接口
Java的接口是设计和表达ADT的一种有用的语言机制,其实现是一个实现该接口的类。
Java中的接口是一个方法签名的列表,但没有方法体。
如果类在其实现子句中声明了接口,则会实现接口,并为接口的所有方法提供方法体。
一个接口可以扩展一个或多个其他接口。
一个类可以实现多个接口。
接口与类:
- 接口:确定ADT规约
- 类:实现ADT
也可以不需要接口而直接使用类作为ADT(既有ADT定义也有ADT实现),但实际中更倾向于使用接口来定义变量。
默认方法
接口中的每个方法在所有类中都要实现,而通过default方法,在接口中统一实现某些功能,无需在各个类中重复实现它。
接口中默认方法的最典型用法是逐步为给定类型提供额外的功能,而不分解实现类。
枚举:
类型具有小的有限的不可变取值集合
封装和隐藏信息
区分一个设计良好的模块和一个坏的模块的一个最重要的因素是它对其他模块隐藏内部数据和其他实现细节的程度。
接口隐藏的信息:
使用接口类型声明变量
客户端仅使用接口中定义的方法
客户端代码无法直接访问属性
成员修饰符
private:仅当前类
default:当前类及同一包内
protected:当前类、同一包内以及子孙类
public:当前类、同一包内、子孙类及其他包
继承和重写
重写(overriding):
可重写的方法:一种允许重新实现的方法。
在Java中,默认情况下是可重写的,即没有特殊的关键字。
严格继承:子类只能添加新方法,无法重写超类中的方法
子类只能向超类添加新的方法,它不能覆盖它们
如果一个方法不能在Java程序中被覆盖,它必须以关键字final作为前缀。
final
- final字段:防止在初始化后重新分配到字段
- final方法:防止覆盖方法
- final类:防止扩展类
重写
方法重写是一种语言特性,它允许子类或子类提供方法的特定实现,该方法已经由其超类或父类提供。
重写方法需要有完全同样的方法签名。
所执行的方法的版本将由用于调用它的对象决定。
如果使用父类的对象来调用该方法,则将执行父类中的版本;如果使用子类的对象来调用该方法,则将执行子类中的版本。
当一个子类包含一个覆盖超类的方法的方法时,它还可以通过使用关键字super来调用超类方法。
- this:调用自身的方法
- super:调用超类的方法
抽象类
只有定义没有实现
抽象类不能实例化(不能用new 生成对象)
继承某个抽象类的子类在实例化时,所有父类中的抽象方法必须已经实现
多态、子类型、重载
三种类型多态:
特殊多态:一个方法可以有多个同名的实现
参数化多态:一个类型名字可以代表多个类型(泛型编程)
子类型多态、包含多态:.一个变量名字可以代表多个类的实例(子类型)
特殊多态与重载(Overloading)
重载:多个方法具有同样的名字,但有不同的参数列表或返回值类型
作用:方便client调用,client可用不同的参数列表,调用同样的函数
函数重载是一个静态多态。
函数根据参数列表进行解析,根据参数列表进行最佳匹配
静态类型检查,对象类型作为参数时取决于引用类型
在编译阶段时决定要具体执行哪个方法 (static type checking)重写的方法则是在运行时进行动态检查!
参数多态性与泛型编程
参数多态性是指方法针对多种类型时具有同样的行为,此时可使用统一的类型变量表达多种类型
泛型:在运行时根据指定类型确定具体类型(编译成class文件时,会用指定类型替换类型变量“擦除”)
泛型编程是一种编程风格,其中数据类型和函数是根据待指定的类型编写的,随后在需要时根据参数提供的特定类型进行实例化。
使用**菱形操作符<>**来帮助声明类型变量。
使用泛型变量的三种形式:泛型类、泛型接口和泛型方法
泛型类:类中如果声明了一个或多个泛型变量,则为泛型类
这些类型变量称为类的类型参数
泛型接口:接口中声明一个或多个泛型变量
子类型多态:
一个类只有一个父类,但可以实现多个接口
B是A的一个子类型,意思是,每个B都是A,每个B都满足A的Spec。
子类型的规约不能弱化超类型的规约
子类型多态:不同类型的对象可以统一的处理而无需区分