一、预定义类
1、对象与对象变量
使用对象两个步骤:首先构造对象,指定初始状态;然后对对象应用方法。
- 使用构造器构造新实例。构造器是一种特殊方法,用来构造并初始化对象。
- 构造器的名字应该与类名相同。以Data类为例,构造Data对象,
new Data()
,构造了一个新对象,并被初始化为当前的日期和时间。也可以将该对象应用toString()方法,返回字符串:String s = new Data().toString();
。 - 如果对象需要多次使用,就需要将对象放在一个变量中:
Date birthday = new Date();
- 对象与对象变量的区别:
Data deadline;
中deadlin仅仅是一个对象变量,可以引用Data类型的对象,但是没有初始化时只能是一个对象变量,不能应用toString()方法,否则产生编译错误。 - 在 Java 中,任何对象变量的值都是对存储在另外一个地方的一个对象的引用。new 操作符的返回值也是一个引用。
Date deadline = new Date();
,new Data()构造了一个 Date 类型的对象, 并且它的值是对新创建对象的引用。这个引用存储在变量 deadline 中。
2、LocalData类
以标准 Java 类库分别包含了两个类:一个是用来表示时间点的 Date 类;另一个是用来表示大家熟悉的日历表示法的 LocalDate 类。
- 构造对象:
Local Date.now()
表示构造这个对象时的日期,LocalDate.of(1999, 12, 31)
构造特定日期的对象。 - 构造对象并保存在对象变量中:
LocalDate newYearsEve = Local Date.of(1999, 12, 31);
,然后可以应用其他方法:getYear、 getMonthValue 和 getDayOfMonth
3、更改器方法与访问器方法
LocalDate aThousandDaysLater = newYearsEve.plusDays(1000);
plusDays 方法会生成一个新的 LocalDate 对象,然后把这个新对象赋给aThousandDaysLater变量。原来的对象不做任何改动。
CregorianCalendar someDay = new CregorianCalendar(1999, 11, 31);
// Odd feature of that cl ass: month numbers go from 0 to 11
someDay.add(Calendar.DAY_0F_M0NTH, 1000);
- 更改器方法 ( mutator method ):调用CregorianCalendar.add()方法后,someDay 对象的状态会改变
- 访问器方法(accessor method):只访问对象而不修改对象
LocalTime.now():构造一个表示当前日期的对象
LocalTime.of(int year, int month, int day):构造一个表示给定日期的对象
getYear( )/getMonthValue( )/getDayOfMonth( ):得到当前日期的年、月、日
二、用户自定义类
设计复杂应用程序的各种主力类,通常这些类是没有main方法,却又自己的实例域和实例方法。
1、Employee类
最简单的类定义形式为:
class ClassName
{
field~1~
field~2~
……
constructor~1~
constructor~2~
……
method~1~
method~2~
……
}
例如:
1 class Employee
2 {
3 // instance fields
4 private String name ;
5 private double salary;
6 private LocalDate hireDay;
7 // constructor
8 public Employee(String n , double s, int year, int month , int day) {
9 name = n;
10 salary = s;
11 hireDay = LocalDate.of(year, month, day);
12 }
13 // a method
14 public String getName(){
15 return name;
16 }
17 public double getSalary()
18 {
19 return salary;
20 }
21 public LocalDate getHireDay()
22 {
23 return hireDay;
24 }
25 public void raiseSalary(double byPercent)
26 {
27 double raise = salary * byPercent / 100;
28 salary += raise;
29 }
30}
- 在一个源文件中, 只能有一个公有类,但可以有任意数目的非公有类。
2、多个源文件的使用
可以将每一个类存在一个单独的源文件中,也可以将其放入同一个源文件中,后者必须保证一个源文件中只有一个共有类。如果采用前者,则有两种编译程序的方法:
1、使用通配符调用Java编译器:javac Employee*.java
2、直接键入命令:javac EmployeeTest.java
,原因在于当 Java 编译器发现 EmployeeTestjava 使用丫 Employee 类时会查找名为 Employee.class 的文件。如果没有找到这个文件, 就会自动地搜索 Employeejava, 然后,对它进行编译。
3、剖析Employee类
- 类的方法都是public,意味着任何类的任何方法都可以调用这些方法
- 实例域用来存放将要操作的数据,关键字确保只有Employee类自身可以访问这些实例域
- 构造器:与类同名,在构造Employee类的对象时,构造器会运行,以便将实例域初始化为所希望的状态。构造器与其他方法不同的是,总是伴随着new操作符的
执行被调用
•构造器与类同名
•每个类可以有一个以上的构造器
•构造器可以有 0 个、1 个或多个参数
•构造器没有返回值
•构造器总是伴随着 new 操作一起调用(所有的java对象都是在堆中构造的)
注意:不要在构造器中定义域实例域重名的局部变量,实例域的局部变量只能在构造器内部访问。
- 方法用于操作对象以及存取它们的实例域。
- 隐式参数与显示参数:27行中第一个参数salary为隐式参数,是出现在方法名前的Employee类对象;27行第二个参数byPercent为显示参数,位于方法名后面后好中的数值。在方法中,关键字this表示隐式参数,27行可以换成
double raise = this.salary * byPercent / 100;
- 需要获得或设置实例域的值,应该提供下面三项内容:一个私有的数据域、一个共有的域访问器方法、一个公有的域更改器方法
- 一个方法可以访问所属类的所有对象的私有数据
class Employee
{
……
public boolean equals(Employee other) {
return name.equals(other.name);
}
}
调用方式:if(harry.equals(boss))……
,该方法访问harry私有域,还能访问boss的私有域,原因在于boss是Employee对象,而Employee类的方法可以访问Employee类的任何一个对象的私有域。、
- 私有方法private,不能被外部的其他类操作调用给,可以将其删去
- final实例域,在构建对象时必须初始化这样的域,即必须确保在每一个构造器执行之后,这个域的值被设置,并且在后面的操作中,不能再对它进行修改。比如private final String name;不需要setName方法。final 修饰符大都应用于基本 (primitive ) 类型域,或不可变(immutable) 类的域(如果类中的每个方法都不会改变其对象, 这种类就是不可变的类。