接口(interface),主要用来描述类具有什么功能,并不给出每个功能的具体实现。
克隆对象,指创建一个新对象,且新对象的状态与原始对象的状态相同,当对克隆对象进行修改时,不会影响原始对象的状态。
内部类,定义在一个类的内部,其中的方法可以访问包含它们的外部类的域。主要用于设计具有相互协作关系的类集合。
6.1 接口
接口不是类,而是对类的一组需求描述,这些类要遵从接口描述的统一格式进行定义。
public interface Comparable{ int compareTo(Object other);}
任何实现Comparable接口的类都需要包含compareTo方法,并且这个方法的参数必须是一个Object对象,返回一个整型数值。
接口中可以定义常量,不能含有实例域,不能在接口中实现方法。可以将接口看成是没有实例域的抽象类。
让类实现某个接口需要两步:1.将类实现给定的接口,关键字implements,2.对接口中的所有方法进行定义。
6.1.1 接口的特性
接口不是类,不能使用new运算符实例化一个接口,可以声明接口的变量,接口变量必须引用实现了接口的类对象。可以使用instanceof检查一个对象是否实现了某个特定的接口。
接口中的所有方法自动地属于public,在接口中声明方法时,不必提供关键字public。接口中的域都将被自动设为public static final,即常量。
一个类可以实现(implement)一个或多个接口,并在需要接口的地方,随时使用实现了接口的对象。使用逗号将实现的各个接口分隔开。
6.1.2 接口域抽象类
使用抽象类表示通用属性时,由于每个类只能扩展于一个类,就不能扩展第二个类了。
Java不支持多继承(一个类有多个超类),通过接口机制实现多继承的大部分功能。
6.2 对象克隆(深拷贝)
拷贝一个变量时,原始变量与拷贝变量引用同一个对象,改变一个变量所引用的对象将会影响另一个变量。
clone方法是Object类的一个protected方法,由于这个类对具体的类对象一无所知,所以只能将各个域进行对应的拷贝。如果对象中的所有数据域都属于数值或基本类型,这样拷贝域没有任何问题。如果在对象中包含了子对象的引用,拷贝的结果会使得两个域引用同一个子对象,因此原始对象域克隆对象共享这部分信息。
Cloneable接口没有指定clone方法,这个方法是从Object类继承来的。接口在这里只是作为一个标记,表明类设计者知道要进行克隆处理。为了实现深拷贝,必须克隆所有可变的实例域。
6.3 接口与回调
6.4 内部类
内部类方法可以访问该类定义所在的数据域中数据,包括私有的数据。
内部类可以对同一个包中的其他类隐藏起来。
当想要定义一个回调函数且不想编写大量代码时,使用匿名内部类比较便捷。
6.4.1 使用内部类访问对象状态
6.4.2 内部类的特殊语法规则
6.4.3 内部类是否有用、必要和安全
6.4.4 局部内部类
6.4.5 由外部方法访问final变量
6.4.6 匿名内部类
6.4.7 静态内部类
6.5 代理