黑马程序员技术交流社区

标题: 内部类的一些问题 [打印本页]

作者: 张敬培    时间: 2013-1-15 16:05
标题: 内部类的一些问题
为什么方法内部类中的方法要调用外面的局部变量,局部变量要使用final来修饰? target 和adrice
  1. //得到一个代理类
  2.         public static Object getProxy(final Object target, final Advice advice){
  3.                 // 创建一个proxy类的对象,
  4.                 Object proxy = Proxy.newProxyInstance(
  5.                                 target.getClass().getClassLoader(),
  6.                                 target.getClass().getInterfaces(),//接口
  7.                                 //InvocationHandler类的对象,使用匿名内部类创建
  8.                                 new InvocationHandler() {
  9.                                         //重写了invoke方法
  10.                                         @Override
  11.                                         public Object invoke(Object proxy, Method method, Object[] args)
  12.                                                         throws Throwable {
  13.                                                 advice.before();
  14.                                                 Object objVal = method.invoke(target, args);
  15.                                                 advice.after();
  16.                                                 return objVal;
  17.                                         }
  18.                                 });
  19.                 return proxy;
  20.         }
复制代码

作者: yong230    时间: 2013-1-15 16:27
Java中final修饰符既可以修饰类、方法,也可以修饰变量,基本规则如下:

1)用final修饰的类不能被扩展,也就是说不可能有子类;
2)用final修饰的方法不能被替换或隐藏:
  ①使用final修饰的实例方法在其所属类的子类中不能被替换(overridden);
  ②使用final修饰的静态方法在其所属类的子类中不能被重定义(redefined)而隐藏(hidden);
3)用final修饰的变量最多只能赋值一次,在赋值方式上不同类型的变量或稍有不同:
  ①静态变量必须明确赋值一次(不能只使用类型缺省值);作为类成员的静态变量,赋值可以在其声明
   中通过初始化表达式完成,也可以在静态初始化块中进行;作为接口成员的静态变量,赋值只能在其
   声明中通过初始化表达式完成;
  ②实例变量同样必须明确赋值一次(不能只使用类型缺省值);赋值可以在其声明中通过初始化表达式
   完成,也可以在实例初始化块或构造器中进行;
  ③方法参数变量在方法被调用时创建,同时被初始化为对应实参值,终止于方法体(body)结束,在此
   期间其值不能改变;
  ④构造器参数变量在构造器被调用(通过实例创建表达式或显示的构造器调用)时创建,同时被初始化
   为对应实参值,终止于构造器体结束,在此期间其值不能改变;
  ⑤异常处理器参数变量在有异常被try语句的catch子句捕捉到时创建,同时被初始化为实际的异常对象
   ,终止于catch语句块结束,在此期间其值不能改变;
  ⑥局部变量在其值被访问之前必须被明确赋值;
方法参数target 和adrice用final修饰 说明在它们一旦初始化,在整个方法执行期间,它们的值都不会改变






欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2