第四章 对象和类
4.1 面向对象程序设计概述
-
对象的三个主要特性
- 对象的行为(behavior)
- 对象的状态(state)
- 对象标识(identity)
-
类之间的关系
-
依赖(“uses-a”):如果一个类的方法操纵另一个类的对象, 我们就说一个类依赖于另一个类。
-
聚合(“has-a”):聚合关系意味着类A 的对象包含类B 的对象。
-
继承(“is-a”):如果类A 扩展类B, 类A 不但包含从类B 继承的方法,还会拥有一些额外的功能
-
4.2 使用预定义类
-
Date类
Date birthday = new Date();
-
LocalDate 类
LocalDate example = LocalDate.now(); LocalDate newYearsEve = LocalDate.of(1999, 12, 31); int year = newYearsEve.getYearO; // 1999 int month = newYearsEve.getMonthValueO; // 12 int day = newYearsEve.getDayOfMonth(); // 31 // plusDays 方法会得到一个新的LocalDate LocalDate aThousandDaysLater = newYearsEve.piusDays(1000): year = aThousandDaysLater.getYear();// 2002 month = aThousandDaysLater.getMonthValue(); // 09 day = aThousandDaysLater.getDayOfMonth(); // 26 // Date 类还有getDay、getMonth 以及getYear 等方法, 然而并不推荐使用这些方法
4.3 用户自定义类
Java类封装注意:
- 不要在构造器中定义与实例域重名的局部变量
- 不要编写返回引用可变对象的访问器方法
- 如果需要返回一个可变数据域的拷贝, 就应该使用clone方法
- 方法可以访问所属类的私有特性( feature ), 而不仅限于访问隐式参数的私有特性
4.5 方法参数
Java 程序设计语言对对象采用的不是引用调用,而是值传递
public static void swap(Employee x, Employee y){
Employee temp = x;
x = y;
y = temp;
}
Employee a = new Employee("Alice");
Employee b = new Employee("Bob");
swap(a, b);
// x和y分别为a和b的拷贝,并不是引用,如下图
// 一个方法不能修改一个基本数据类型的参数(即数值型或布尔型)。
// 一个方法可以改变一个对象参数的状态
// 一个方法不能让对象参数引用一个新对象
4.6 对象构造
如果在构造器中没有显式地给域赋予初值, 那么就会被自动地赋为默认值: 数值为0、布尔值为false、对象引用为 null。
4.10 类设计技巧
- 一定要保证数据私有
- 一定要对数据初始化
- 不要在类中使用过多的基本类型
- 不是所有的域都需要独立的域访问器和域更改器
- 将职责过多的类进行分解
- 类名和方法名要能够体现它们的职责
- 优先使用不可变的类(如果类是不可变的,就可以安全地在多个线程间共享其对象)
API注释
4.2.3 更改器方法与访问器方法
java.time.LocalDate 8
static LocalTime now()
// 构造一个表示当前日期的对象。
static LocalTime of (int year, int month, int day)
// 构造一个表示给定日期的对象。
int getYear()
int getMonthValue()
int getDayOfMonth()
// 得到当前日期的年、月和曰。
DayOfWeek getDayOfWeek()
// 得到当前日期是星期几, 作为DayOfWeek 类的一个实例返回。调用getValue 来得到1 ~ 7 之间的一个数, 表示这是星期几, 1 表示星期一, 7 表示星期日。
LocalDate piusDays(int n)
LocalDate minusDays(int n)
// 生成当前日期之后或之前n 天的日期。
4.6.7 初始化块
java.util.Random 1.0
Random()
// 构造一个新的随机数生成器。
int nextInt(int n) 1.2
// 返回一个0 ~ n-1之间的随机数。
评论区