重学java-对象与类
1. 面向对象程序设计概述
面对对象程序设计(object-oriented programming,OOP)是当今主流的程序设计范式,取代了20世纪70年代的“结构化”编程技术。
面对对象的程序是由对象组成的,每个对象包含对用户公开的特定功能部分和隐藏的实现部分。程序中的对象可以来自标准库或者自定义。
传统结构化程序设计:首先确定如何操作数据,然后再决定如何组织数据结构,以便于操作数据;
OOP:将数据的结构放在第一位,然后再考虑操作数据的算法。
1.1类
- 类(class)是构造对象的模板或蓝图。由类构造(construct)对象的过程称为创建类的实例(instance)。
- 封装(encapsulation,有时也称数据隐藏),从形式上看,封装就是将数据和行为组合在一个包中,并对对象的使用者隐藏具体的实现方式。实现封装的关键在于,绝对不能让类中方法直接访问其他类的实例字段,程序只能通过对象的方法与对象数据进行交互。
- 对象中的数据称为实例字段(instance field),操作数据的过程称为方法(method)。作为一个类的实例,特定对象都有一组特定的实例字段值。这些值的集合就是这个对象的当前状态(state)。
- 继承(inheritance),是OOP的另一个原则,可以通过扩展其他类来构建新类,在扩展一个已有类时,这个扩展后的新类具有被扩展的类的全部属性和方法。
1.2对象
对象的三个特征:同时这些关键特征彼此之间会相互影响。
- 行为:可以对对象完成的操作和应用的方法;
- 状态:调用对象方法时,对象状态的变化;
- 标识:具有相同行为和状态的对象的区分;
**识别类:**识别类的一个简单经验是在分析问题的过程中寻找名词,而方法对应着动词。
1.3类之间的关系
- 依赖(“uses -a”):如果一个类的方法使用或操纵另一个类的对象,就说一个类依赖于另一个类。应该尽可能地将相互依赖的类减至最少。用软件工程的术语来说,就是尽可能减少类之间的耦合。
- 聚合(“has - a”):意味类A的对象包含类B的对象。
- 继承(“is -a”):表示一个更特殊的类与一个更一般的类之间的关系。
2.使用预定义类
要想使用对象,首先必须构造对象,并指定其初始状态。然后对对象应用方法。java中使用构造器(constructor, 或称构造函数)构造新实例。
以Date类对象构造为例:
Date deadline = new Date();
其中的deadline是日期类的对象变量,对象变量并没有实际包含一个对象,它只是引用了一个对象。在java中,任何对象变量的值都是对存储在另外 一个地方的某个对象的引用。表达式new Date()构造了一个Date类型的对象,它的值是对新创建对象的一个引用。
3. Java类库中的Date类与LocalDate类
Java类库设计者将保存时间和给时间点命名分开。标准的java类库中分别包含了两个类:一个是用来表示时间点的Date类;另一个是用熟悉的日历表示法表示日期的LocalDate类。
在构造LocalDate类的对象时,不用使用构造器,而是通过静态工厂方法(factory method),这些方法会调用构造器。
- LocalDate.now()
- LocalDate.of(1999, 12, 31)
- LocalDate的get方法:getYear、getMonthValue、getDayOfMonth
Date类更多细节:Date (Java SE 11 & JDK 11 ) (runoob.com)
- 常用:toString()、Date()
LocalDate类更多细节:LocalDate (Java SE 11 & JDK 11 ) (runoob.com)
- 常用方法:LocalDate.now()、LocalDate.of()、LocalDate.plusDays()
3.1 更改器方法与访问器方法
- 访问器方法:只访问对象而不修改对象的方法成为访问器方法。例如,LocalDate.getYear和GregorianCalendar.get等
- 更改器方法:调用更改器方法会使原来的对象状态改变,而不是新创建一个新的对象,例如GregorianCalendar.add方法。而LocalDate.plusDays方法会生成一个新的LocalDate对象,然后将新生成的对象赋值给一个对象变量。