1、类(CLass)
类是构造对象的模板和蓝图。用类构造(construct)对象的过程称之为创建类的实例(instance)
通过扩展一个类来建立另一个类的过程称之为继承(inheritance)
1.1、对象
三个特性:
对象的行为是用可调用的方法定义的
对象的状态可能会随着时间而发生改变
每个对象都有一个唯一的身份(identity)
1.2、识别类的方法
首先你从设计类开始,然后往每个类中添加方法
识别类的简单规则:分析问题或者说类名一般用名词,而方法是动词或者动名词组合。
1.3、类之间的关系
- 依赖(dependence):如果一个类方法操纵另一个对象,则说明一个类依赖另一个类
[备注]:应该尽可能地将相互依赖的类减至最少,也就是让类之间的耦合度最小。 - 聚合(aggregation):类A的对象包含着类B的对象。
- 继承(inheritance):类A扩展类B,A不仅包含从类B继承的方法,还会拥有一些额外的功能。
- 其他关系
关系 | 箭头 |
---|---|
继承 | |
接口实现 | |
依赖 | |
聚合 | |
关联 | |
直接关联 |
2、使用预定义类
2.1 对象与对象的变量
使用构造器(constructor)构建一个新实例。构造器是一种特殊的方法,用来构造并初始化对象。构造器的名字应该和类名相同,要想构造一个新的对象,就需要在构造器前面加上new操作符。
Date date = new Date();
// new Date()构造了一个Date类型的对象,并且它的值是对新创建对象的引用,这个引用储存在变量date中。
表示时间点Date类,表示日历LocalData类。
2.2 更改器方法与访问器方法
LocalDate aThousandDayLater = newYearEve.plusDays(1000);
更改器方法(mutator method):方法前的对象值会改变
访问器方法(accessor method):只访问对象而不对对象进行修改。
3、用户自定义类
3.1 Employee类
public Employee(String n,double s,int year,int month,int day);
public String getName();
public Double getSalary();
public LocalDate getHireDay();
这个类的所有方法被标记为public,关键字public意味着任何类的任何方法都可以调用这些方法(共有4种访问级别)
3.2 构造器
public Employee(String n,double s,int year,int month,int day){
name = n;
salary = s;
hireDay = LocalDate.of(year, month, day);
}
构造器与类同名。在构造Employee类的对象时,构造器会运行,以便将实例域初始化为所希望的状态。
构造器与其他的方法有一个重要的不同。构造器总是伴随着new操作符的执行被调用,而不能对一个已经存在的对象调用构造器来达到重新设置实例域的目的。
3.3 隐式参数和显式参数
方法用于操作对象以及存取它们的实例域。
public void raiseSalary(double byPercent){
double raise = salary * byPercent /100;
salary += raise;
}
// raiseSalary方法有两个参数,第一个参数成为隐式参数(implict)参数,是出现在方法名前的Employee类对象。第二个参数位于方法名后面括号中的数值,这是一个显式(explicit)参数。
在每一个方法中,关键字this表示隐式函数。如果需要的话,可以改为
public void raiseSalary(double byPercent){
double raise = this.salary * byPercent /100;
this.salary += raise;
}
// 可以将实例域与局部变量明显的区分开来。
如果在类的内部定义方法,这个方法将自动地成为内联方法(inline)方法。
3.4 封装的优点
public String getName(){
return name;
}
public Double getSalary(){
return salary;
}
public LocalDate getHireDay(){
return hireDay;
}
以上三个函数都是典型访问器的方法,由于它们只返回实例域值,因此又称为域访问器。
【备注】:不要编写返回引用可变对象的访问器方法。如果有需要,对一个可变对象进行引用,应该对它首先进行克隆(clone)。
class Employee{
public Date hireDay(){
return (Date) hireDay.clone();
}
}
如果返回一个可变数据的拷贝,就需要进行克隆。
3.5 类的访问权限
方法可以访问所调用对象的私有数据。一个方法可以访问所属类的所有对象的私有数据
3.6 私有方法
在实现一个类时,公有数据很危险,所有应该将所有的数据都设置为私有的。也就是变量设置为私有。
方法也可以实现私有化,将方法作为一个辅助的方法的时候,那么只需要将public改为private就可以。
3.7 final实例域
- 可以将实例域定义为final,构建对象时,必须初始化这样的域。类中某个域被声明,在对象构建之后,则不会再有setName方法。
- final修饰符大都用在基本类型域(primitive),或不可变类的域(immutable)域。
4、方法参数
[按值调用]:表示方法接受的是调用者提供的值。
[引用调用]:表示方法接受的是调用者提供的变量地址。
方法得到的时所有参数值的一个拷贝。
5、对象构造
5.1 重载(overloading)
构造方法:
-
StringBuilder messages = new StringBuilder();
构造一个空的StringBuilder对象。 -
StringBuilder todolist = new StringBuilder("To do: ");
指定一个初始化字符串。
以上这两种特征就称之为重载(overloading)。