这个月已过去大半了,都没怎么学习Java。事情多也不能当做借口,按部就班地学习吧。
接口中的所有方法自动地属于public。因此,在借口中声明方法时,不必提供关键字public。
接口绝不能含有实例域,也不能在接口中实现方法。
为了使用Arrays类的sort方法对Employee对象数组进行排序,Employee类就必须实现 Comparable接口。
public interface Comparable<T>
{
int compareTo(T other);
}
在调用x.compareTo(y)的时候,x小于y,返回一个负数;x等于y返回0;否则返回一个正数。
为了让类实现一个接口,通常需要下面两个步骤:
1)将类声明为实现给定的接口; class Employee implements Compareble<Employee>
2)对接口中的所有方法进行定义。
public int compareTo(Employee other)
{
if(salary < other.salary) return -1;
if(salary > other.salary) return 1;
return 0;
}
接口不是类,不能使用new运算符实例化一个接口。然而,尽管不能构造接口对象,却能声明接口变量。
Compareble x; //OK
接口变量必须引用实现了接口的类的对象:
x = new Employee(...);
可以使用instanceof检查一个对象是否实现了某个特定的接口: if(anObject instanceof Compareble){...}
接口也可以继承。
public interface Moveable
{
void move(double x, double y);
}
public interface Powered extends Moveable
{
double milesPerGallon();
}
尽管在接口中不能包含实例域或静态方法,但是可以包含常量。例如:
public interface Powered extends Moveable
{
double milesPerGallon();
double SPEED_LIMIT = 95; // a public static final constant
}
尽管每个类只能够拥有一个超类,但却可以实现多个接口。这也就是抽象类和接口的使用区别。使用逗号将实现的各个接口分隔开。
class Employee implements Cloneable, Comparable
对象克隆
对象变量只是标签,相互赋值只是让多个标签引用同一个对象而已。如果要创建一个对象的新拷贝,就要使用clone方法。
clone是Object类的一个protected方法。它的默认操作是“浅拷贝”,即如果对象中包含了子对象的引用,那么拷贝的结果会使得两个域引用同一个子对象。
对于每一个类,都必须做出下列判断:
1)默认的clone方法是否满足要求。
2)默认的clone方法是否能够通过调用可变子对象的clone得到修补。
3)是否不应该使用clone。
实际上,选项3是默认的。如果要选择1或2,类必须:
1)实现Cloneable接口。
2)使用public访问修饰符重新定义clone方法。
由于默认的clone方法被声明为protected,因此无法直接调用anObject.clone(),必须重新定义clone方法,并将它声明为public。
在这里,Cloneable并没有指定clone方法,这个方法是从Object类继承而来的。接口在这里只是作为一个标记,表明类设计者知道要进行克隆处理。如果一个对象需要克隆,而没有实现Cloneable接口,就会产生一个已检验异常。
即使clone的默认实现(浅拷贝)能够满需求,也应该实现Cloneable接口,将clone重定义为public。
class Employee implements Cloneable
{
public Employee clone() throws CloneNotSupportedException
{
return super.clone();
}
}
下面是一个建立深拷贝clone方法的例子:
class Employee implements Cloneable
{
public object Employee() throws CloneNotSupportedException
{
Employee cloned = (Employee)super.clone();
cloned.hireDay = (Date)hireDay.clone();
return cloned;
}
}