1. 面向对象
面向对象程序化设计(Object Oriented Programming ,OOP):
第一位:Data Structures; 后续:Algorithms
1.1 类
类 ( class ) 是构造对象的模板或蓝图 。 我们可以将类想象成制作小甜饼的切割机 , 将对象想象为小甜饼 。 由类构造 ( construct ) 对象的过程称为创建类的实例 ( instance )。
封装:从形式上看 ,封装不过是将数据和行为组合在一个包中 ,并对对象的使用者隐藏了数据的实现方式。对象中的数据称为实例域 ( instance field ) , 操纵数据的过程称为方法 ( method ) 。实现封装的关键在于绝对不能让类中的方法直接地访问其他类的实例域 。程序仅通过对象的方法与对象数据进行交互,封装给对象赋予了 “ 黑盒 ” 特征 ,这是提高重用性和可靠性的关键。
继承: 扩展一个类来建立另外一个类的过程。在扩展一个已有的类时 这个扩展后的新类具有所扩展的类的全部属性和方法。在新类中,只需提供适用于这个新类的新方法和数据域就可以了。超类:Object。
1.2 对象
对象的三个特性:
• 对象的行为 ( behavior ) — 可以对对象施加哪些操作,或可以对对象施加哪些方法 ?
• 对象的状态 ( state ) — 当施加那些方法时,对象如何响应 ?
• 对象的标识 ( identity ) — 如何辨别具有相同行为与状态的不同对象 ?
1.3 类之间的关系
类之间的关系:
(1)依赖(dependence):即 “uses - a ” 关系 。如果一个类的方法操纵另一个类的对象,我们就说一个类依赖于另一个类 ,例如买东西时Account账户对象被订单Order对象访问。尽量减少类之间的依赖,专业术语叫让类之间的耦合度最小。
(2)聚合(aggregation):即 “ has - a ” 关系。 聚合关系意味着类 A 的对象包含类 B 的对象。例如买东西时Order订单对象包含了Item商品对象。
(3)继承(inheritance):即 “ is - a ” 关系。RushOrder类有Order继承而来,RushOrder中包含了其他的费用的计算方法。
UML符号:
类图具体实现:
2. 使用预定义类
2.1 对象与对象变量
使用对象时,必须首先构造对象,并指定其初始状态,然后对对象应用方法。在java中使用构造器(constructor)构造新实例。构造器的名字应该与类名相同:new操作符返回的是一个引用。
Date birthday = new Date();
Date deadline;
定义了一个对象变量deadline,它可以应用Date类型的对象,但是变量deadline不是一个对象,实际上也没有引用的对象。此时不能将任何Date方法应用于这个变量上,必须初始化。
一个对象变量没有实际包含一个对象,而仅仅是一个对象的引用。
2.2 Java类库中的LocalDate类
Java中的Date类的实例都有一个状态,即特定的时间点。时间是用距离一个固定时间点的毫秒数(可正可负)表示的,这个点就是纪元(epoch),它是UTC(Coordinate Universal Time)时间1970年1月1日00:00:00。
类库设计者决定将保存时间与给时间点命名分开。所以标准 Java 类库分别包含了两个类:一个是用来表示时间点的 Date 类;另一个是用来表示大家熟悉的日历表示法的 LocalDate 类。
日历格式化输出:
public static void Calendar() {
LocalDate date = LocalDate.now();
int month = date.getMonthValue();
int today = date.getDayOfMonth();
System.out.printf("month=%d\n",month);
System.out.printf("today=%d\n",today);
// 获取本月的第一天的日期
date = date.minusDays(today - 1); // 当前日期 - 已过去的天数 today - 1
System.out.println(date);
//返回星期
DayOfWeek weekday = date.getDayOfWeek();
int value = weekday.getValue();
System.out.println(weekday);
System.out.println(value); // Monday : 1 ; Tuesday : 2
// 格式化输出:
System.out.println("Mon Tue Wed Thu Fri Sat Sun");
// 1. 输出空格
for(int i = 1 ; i < value ; i++) {
System.out.print(" ");
}
// 2. 循环天数输出
while(date.getMonthValue() == month) {
System.out.printf("%3d",date.getDayOfMonth());
System.out.print(" ");
date = date.plusDays(1);
if (date.getDayOfWeek().getValue() == 1) {
System.out.println();
}
}
}
对象克隆
Employee origin = new Employee("Bob", 50000, 1666, 1, 1);
// origin.setSalary(11);
Employee copy = origin;
System.out.println(copy.getSalary());
// 输出
5000.0
copy是对Employee对象的拷贝,而且初始状态和origin一样,origin状态的改变随之带来的也是copy状态的改变,要使得相互之间能够各自改变不影响,就得使用克隆clone。