面向对象编程思维
1.职责
在一起
属性:方法计算所需要的属性
方法:拥有数据之后必须体现出的方法
面向对象过程中职责的分配
类与对象:抽象与具体
视角的变化:
- 行为视角:结构化方法
- 数据视角:数据为中心方法
- 职责视角:面向对象方法
如何获得对象?
- 寻找候选对象:名词:类、属性+动词:行为
什么是类?
- 类是指具有共同属性的对象的描述
- 类是一个描述或蓝图,用于定义组成某类特定的对象的所有的特性
- 把编程思想跟现实世界中的事物分类思想相一致
创建类的原因:
- 对现实世界中的对象建模
- 对抽象对象建模
- 降低复杂度
- 隔离复杂度
- 隐藏实现细节
- 限制变化所影响的范围
- 创建中心控制点
2.合作
面向对象分析
- 用例分析
- CRC卡:类、职责、协作卡片
- 非正式英语描述
- 结构化分析
封装
类
对象:属性、方法
防御式编程、独立方案
让职责局限于类中,是变更只出现在内部
程序的完备性:增删改查完整功能
封装规则:
- 数据和方法在同一个类里
- 数据和行为共同体现一个职责:“在一起”
- 程序的完备性
类的职责与封装
- 数据职责
- 表征对象的本质特征
- ⾏为(计算)所需要的数据
- 教务系统中学⽣对象:计算年龄
- 税务系统中纳税⼈:计算所得税
- ⾏为职责
- 表征对象的本质⾏为
- 拥有数据所应该体现的⾏为
- 出⽣年⽉
- 个⼈收⼊
数据职责和行为职责要“在一起”
类
静态与非静态方法调用:
静态方法:用类的方法来调用
非静态方法:用对象的成员变量和成员方法来调用
static
方法中不能调用non-static
方法,准确地说是不能直接调用non-static
方法。
其实可以间接地通过将一个对象的引用传入static
方法中,再去调用该对象的non-static
方法。
例如:在主函数(static方法)中创建某个类的实例,再利用其引用变量调用它的非静态方法。 但通常要达到这样的效果,只需写一个非静态方法即可。
静态与非静态变量调用:
静态方法不能(直接)调用非静态变量
非静态方法可以引用静态变量。
静态方法不属于对象,是属于类的,不需要实例化; 而非静态变量是属于对象的,需要先实例化。 在一个类的静态成员中去访问其非静态成员,因为类的静态成员先于类的非静态成员存在,访问一个内存中不存在的东西会出错。
相反,非静态方法可以引用静态变量。 因为静态变量是存储在静态内存单元内,可以直接用类进行调用,也可以用实例化的对象对其引用。
关键字static
Java是面向对象的,但是有一种特殊情况,不需要类的实例。关键字static让方法在没有任何实例的情况下运行类。静态方法意味着“行为不依赖于实例变量,因此不需要实例/对象”
初始化静态变量(必须初始化且不可变)
加载类时初始化静态变量。
加载类是因为JVM决定是时候加载该类了。
静态初始化有两个保证:
类中的静态变量在创建该类的任何对象之前初始化。
类中的静态变量在类的任何静态方法运行之前初始化。
类变量:必须要在静态初始化块中指定初始值或者声明该类变量时指定初始值,而且只能在这两个地方之一进行指定;
实例变量:必要要在非静态初始化块,声明该实例变量或者在构造器中指定初始值,而且只能在这三个地方进行指定。
final方法:
使⽤final ⽅法的原因有两个。
- 第⼀个原因是把⽅法锁定,以预防任何继承类修改它的意义。这是出于设计的考虑:你想要确保在继承中⽅法⾏为保持不变,并且不会被重载。
- 使⽤final⽅法的第⼆个原因是效率。如果你将⼀个⽅法指明为final,就是同意编译器将针对该⽅法的所有调⽤都转为内嵌(inline)调⽤。直接将方法主体插入到调用处,而不是进行例行的方法调用
对象
对象初始化
在调用任何方法(甚至构造函数)之前初始化变量;
- 先初始化静态数据,再初始化非静态数据;
- 初始化的静态数据和块将按文本顺序执行
静态变量:使用 static 修饰符进行声明,在所属类被装载时,创建通过类进行访问,所属类的所有实例的同一静态变量都是同一个值
非静态变量:不带有 static 修饰符声明的变量称做非静态变量,在类被实例化时,创建通过对象进行访问,同一个类的不同实例的同一非静态变量可以是不同的值。