用户自定义类
我们要想创建一个完整的程序,应该将若干类组合在一起,大部分类需要我们去编写,其中只有一个类用main方法。
Employee类
下面我们看一个非常简单的Employee类。以一个程序为例:
public class EmployeeTest {
public static void main(String[] args) {
Employee[] employees = new Employee[3];
employees[0] = new Employee("aaa", 75000, 1998, 8, 1);
employees[1] = new Employee("bbb", 85000, 1988, 4, 4);
employees[2] = new Employee("ccc", 95000, 1968, 6, 5);
for (Employee employee : employees) {
employee.raiseSalary(10);
}
for (Employee employee : employees) {
System.out.println(employee.toString());
}
}
private static class Employee {
private String name;
private double salary;
private LocalDate localDate;
public Employee(String name, double salary, int year,int month,int day) {
this.name = name;
this.salary = salary;
this.localDate = LocalDate.of(year,month,day);
}
public String getName() {
return name;
}
public double getSalary() {
return salary;
}
public LocalDate getLocalDate() {
return localDate;
}
public void raiseSalary(double bypercent){
double v = salary * bypercent / 100;
salary+=v;
}
@Override
public String toString() {
return "Employee{" +
"name='" + name + '\'' +
", salary=" + salary +
", localDate=" + localDate +
'}';
}
}
}
在这个程序中,构造了一个Employee数组,并填入了三个雇员对象;接下来,利用Employee类的raiseSalary方法将每个雇员的薪水提高5%;最后,调用toString方法,将雇员的信息打印出来。
在这个示例程序中包含两个类:Employee类和EmployeeTest 类,EmployeeTest 类带有public访问修饰符并包含main方法。源文件名是EmployeeTest .java,这是因为文件名必须与public类的名字相匹配。在一个源文件中,只能用一个公用类,但可以有任意数目的非公有类。
当编译这段源码的时候,编译器将在目录下创建两个类文件:EmployeeTest.class 和Employee.class。将程序中包含main方法的类名提供给字节码解释器,以便启动这个程序:
java EmployeeTest
输入之后,字节码解释器开始运行EmployeeTest 类的main方法中的代码。
剖析Employee类
首先从这个类的方法开始。从代码可知,这个类包含4个方法和一个构造器:
public Employee(String name, double salary, int year,int month,int day)
public String getName()
public double getSalary()
public LocalDate getLocalDate()
public void raiseSalary(double bypercent)
这个类的所有方法都被标记为public。关键字public意味着任何类的任何方法都是可以调用这些方法的。另外,Employee类的实例中有三个实例域用来存放将要操作的数据:
private String name;
private double salary;
private LocalDate localDate;
关键字private确保只有Employee类自身的方法能够访问这些实例域,而其他类的方法不能够读写这些域。
此外,这两个实例域本身就是对象。
构造器
由Employee的构造器可以看出,构造器与类同名,在构造Employee类的对象时,构造器会运行,以便将实例域初始化为所希望的状态。构造器与其他方法有一个重要的不同。就是构造器总是伴随着new操作符的执行被调用,而不能对一个已经存在的对象调用构造器来达到重新设置实例域的目的。
综上所诉,使用构造器时要注意:
- 构造器与类同名
- 每个类可以有一个以上的构造器
- 构造器可以有0、1或多个参数
- 构造器没有返回值
- 构造器总是伴随着new操作一起调用。
封装的优点
在Employee类中,getName方法、getSalary方法和getLocalDate方法。这些都是典型的访问器方法。由于它们只返回实例域值,因此又称为域访问器。
有些时候,需要获得或设置实例域的值。因此,应该提供下面三项内容:
- 一个私有的数据域
- 一个公有的域访问器方法
- 一个公有的域更改器方法
这样做要比提供一个简单的公有数据域复杂,但是用两个明显的好处:
- 可以改变内部实现,除了该类的方法外,不会影响其他代码。
- 更改器方法可以执行错误检测。
私有方法
在Java中,为了实现一个私有方法,我们可以将关键字public换成private即可。
对于一个私有方法,如果改用其他方法的实现相应操作,那么不必保留原有的方法。如果数据的表达方式发生了变化,这个方法可能会变得难以实现,或者不在需要。
final实例域
可以将实例域定义为final。构建对象时必须初始化这样的域。即,当这个域被初始化之后,在后面的操作中不能在对它进行修改。
final修饰符大都应用于基本类型域,或不可变类的域。