第4章 对象与类
1.不要编写返回引用可变对象的访问器方法
例如:
class Employee
{
private Date hireDay;
public Date getHireDay()
{
return hireDay;
}
}
Employee e = ...;
Date d = e.getHireDay();
此时,d就是e的hireDay,对d的更改会直接造成e的hireDay的更改。
2.如果两个对象属于同一个类,那么一个对象的方法可以访问另一个对象的私有数据。
也就是说,Employee类的方法可以访问Employee类的任何一个对象的私有域。例如:
class Employee
{
...
public boolean equals(Employee other)
{
return name.equals(other.name);
}
}
调用:if(harry.equals(boss))…
此时,不仅访问了harry的私有域,而且访问了boss的私有域。
3.private final Date hiredate;仅仅意味着hiredate变量中的对象 引用 在对象构造之后不能被改变。hiredate的非final数据域是可以更改的。
4.静态方法是一种不能向对象实施操作的方法,也就不能访问静态域,但是可以访问静态域。
例如:Math.pow(x,a);
在以下3种情况可以使用静态方法:
(1)一个方法不需要访问对象状态,其所需参数都是通过显式参数提供的。
(2)一个方法只需要访问类的静态域。
(3)像NumberFormat类一样,使用工厂方法创建不同类型的对象。
NumberFormat currencyFormatter = NumberFormat.getCurrencyInstance();//静态方法
NumberFormat percentFormatter = NumberFormat.getPercentInstance();//静态方法
5.每一个类都可以有一个main方法。
这是一个对类用于单元测试的技巧。
例如,Employee类有一个main方法,Application类是一个更大的类,也有一个main方法。此时想要独立测试Employee类,只需java Employee;而使用java Application时,只会调用Application的main方法,不会执行Employee的main方法。
6.隐式参数和显示参数
例如,number007.raiseSalary(5);其中number007就是隐式参数,而5就是显示参数。
this可以用来表示隐式参数。
7.方法参数。
两种:值调用和引用调用
Java中在函数参数中采用的对象引用,属于值调用,而不是引用调用。就是说无法让对象参数引用一个新的对象。
总结:(1)方法的参数是一个引用类型时,对参数的数据域的更改,会直接造成真正的对象的数据域发生改变。
(2)
public static void swap(Employee x, Employee y)
{
Employee temp = x;
x = y;
y = temp;
}
执行语句swap(employee1, employee2);
注意:此时employee1和employee2所引用的对象并没有发生交换。
8.仅当类没有提供任何构造器的时候,系统才会提供一个没有参数的默认构造器。
9.在一个构造器中,可以使用this来调用另一个构造器。例如,
public Employee(double s)
{
this("Employee #" + nextId, s);
nextId++;
}
在调用Employee(double)构造器时,同时会调用Employee(String, double)构造器。
10.初始化块
初始化数据域三种方式:(1)在声明中赋值 (2)在构造器中赋值 (3)使用初始化块
像下面这样的成为初始化块:
class Employee
{
private static int nextId;
private int id;
//初始化块
//只要构造类的对象,初始化块就会被执行
{
id = nextId;
nextId++;
}
//静态的初始化块(静态初始化块会优先执行)
static
{
Random generator = new Random();
nextId = generator.nextInt(10000);
}
//构造器
...
}
初始化数据域顺序:先执行初始化块(先执行静态的),再调用构造器。
11.包
(1)一个类可以使用所属包中的所有类,以及其他包中的公有类。
(2)不能导入以java为前缀的所有包,例如import java.*;这样是不行的。
(3)import语句不仅可以导入包和类,还可以导入类中的静态域和静态方法。例如import static java.lang.System.out;
(4)编译命令:javac com/mycompany/PayrollApp.java
而解释器命令: java com.mycompany.PayrollApp 使用的是.而不是/
(5)如果一个类的包名写错,可以正常编译这个源文件(如果不依赖于其他包),但是将无法执行,因为虚拟机找不到.class类文件。
(6)包作用域。变量标记为public的可以被任意类访问;标记为private的只可以被定义他们的类使用;如果没有指定,则可以被同一个包中的方法访问。
12.Java只会对数据域进行初始化,而不会对局部数据变量进行初始化。