一、接口
1.接口不是类,是对类的一组需求描述
2.接口可以定义常量(自动设置为public static final),不能含有实例域,也不能在接口中实现方法,因此可以将其看成没有实例域的抽象类
3.使用sort方法对数组中的元素进行排序时要求数组中的元素是实现了Comparable接口的类,且元素间是可比较的
4.接口不能用new实例化,但可以声明接口的变量,接口变量必须引用实现了接口的类对象
5.实现ActionListener接口的类,当到达指定的时间间隔,定时器就调用actionPerformed方法
二、对象克隆
1.默认的克隆操作是浅拷贝,没有克隆包含在对象中的内部对象
2.对象克隆需要对类实现Cloneable接口,并重新定义clone方法
3.即使clone的默认实现(浅拷贝)能够满足要求,也应该实现Cloneable接口,将clone重定义为public,并调用super.clone()
4.所有数组类型均包含一个clone方法,可以直接调用 变量名.clone() 进行深拷贝
三、内部类
1.只有内部类可以是私有的,这样一来,只有外部类的方法才能够生成此内部类的对象
2.内部类既可以访问自身的数据域,也可以访问创建它的外围类对象的数据域
3.在外部类之外使用内部类的语法是 OuterClass.InnerClass ,前提是要同时具有这个内部类和其所在的外部类的访问权限
4.局部内部类在一个方法中定义,不能用public或private进行声明,作用域被限定在这个方法中,除了这个方法,没有任何方法知道此类的存在
5.局部类还可以引用定义为final的局部变量(方法中的参数变量)
6.匿名内部类是局部内部类的深入,即在只创建这个类的一个对象情况下,无需对其命名
7.当内部类不需要引用外围类对象时,可以将内部类声明为static,以便取消产生的引用
四、代理
1.代理类的核心意义在于提供一种代理访问模式,即不直接访问最终要访问的类,而是通过一个中间代理类来间接访问最终要访问的类。其作用是可以在代理类的层面中加入一些附加的处理,而不用修改最终要访问的类
2.使用代理类的主要过程:
1)通过Proxy.newProxyInstance方法生成代理类
2)客户代码使用给定的接口访问生成的代理类
3)所生成的代理类借助InvocationHandler来实现对最终类的调用,调用中可以加入一些附加的处理
4)在后端最终类中完成最终的处理逻辑
3.代理类的例子
1)访问接口代码
1.接口不是类,是对类的一组需求描述
2.接口可以定义常量(自动设置为public static final),不能含有实例域,也不能在接口中实现方法,因此可以将其看成没有实例域的抽象类
3.使用sort方法对数组中的元素进行排序时要求数组中的元素是实现了Comparable接口的类,且元素间是可比较的
4.接口不能用new实例化,但可以声明接口的变量,接口变量必须引用实现了接口的类对象
5.实现ActionListener接口的类,当到达指定的时间间隔,定时器就调用actionPerformed方法
二、对象克隆
1.默认的克隆操作是浅拷贝,没有克隆包含在对象中的内部对象
2.对象克隆需要对类实现Cloneable接口,并重新定义clone方法
3.即使clone的默认实现(浅拷贝)能够满足要求,也应该实现Cloneable接口,将clone重定义为public,并调用super.clone()
4.所有数组类型均包含一个clone方法,可以直接调用 变量名.clone() 进行深拷贝
三、内部类
1.只有内部类可以是私有的,这样一来,只有外部类的方法才能够生成此内部类的对象
2.内部类既可以访问自身的数据域,也可以访问创建它的外围类对象的数据域
3.在外部类之外使用内部类的语法是 OuterClass.InnerClass ,前提是要同时具有这个内部类和其所在的外部类的访问权限
4.局部内部类在一个方法中定义,不能用public或private进行声明,作用域被限定在这个方法中,除了这个方法,没有任何方法知道此类的存在
5.局部类还可以引用定义为final的局部变量(方法中的参数变量)
6.匿名内部类是局部内部类的深入,即在只创建这个类的一个对象情况下,无需对其命名
7.当内部类不需要引用外围类对象时,可以将内部类声明为static,以便取消产生的引用
四、代理
1.代理类的核心意义在于提供一种代理访问模式,即不直接访问最终要访问的类,而是通过一个中间代理类来间接访问最终要访问的类。其作用是可以在代理类的层面中加入一些附加的处理,而不用修改最终要访问的类
2.使用代理类的主要过程:
1)通过Proxy.newProxyInstance方法生成代理类
2)客户代码使用给定的接口访问生成的代理类
3)所生成的代理类借助InvocationHandler来实现对最终类的调用,调用中可以加入一些附加的处理
4)在后端最终类中完成最终的处理逻辑
3.代理类的例子
1)访问接口代码
public interface TheInterface {
public int op();
}
2)最终类的代码
public class BusinessClass implements TheInterface {
public int op() {
System.out.println("实际业务处理逻辑。");
return 1 + 1;
}
}
3)InvocationHandler实现类的代码
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class InvocationHandlerClass implements InvocationHandler {
private Object object = new BusinessClass();
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("在Handler中进行一些附加处理。")
Object ret = method.invoke(this.object, args);
return ret;
}
}
4)客户代码
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
public class ProxyClientClass {
public static void main(String[] args) {
InvocationHandler handler = new InvocationHandlerClass();
Class[] interfaces = {TheInterface.class};
TheInterface proxyObj = (TheInterface) Proxy.newProxyInstance(
InvocationHandlerClass.class.getClassLoader(),
interfaces,
handler);
proxyObj.op();
}
}