关于JAVA匿名内部类的一点讨论 - 编程入门网
关于JAVA匿名内部类的一点讨论时间:2007-05-30 基本理论:关于JAVA内部类:一个内部类的定义是定义在另一个类内部的类。 存在它的原因是: 1.一个内部类的对象能够访问创建它的对象的实现,包括私有数据。即内部类实例对包含它的哪个类的实例来说,是特权的。 2.对于同一个包中的其他类来说,内部类能够隐藏起来,换句话说,内部类不管方法的可见性如何,那怕是public,除了包容类,其他类都无法使用它。 3.匿名内部类可以很方便的定义回调。 4.使用内部类可以非常方便的编写事件驱动程序。其实它真正的目的仅仅为了定义回调--进一步就是事件驱动。接口和回调:编程一个常用的模式是回调模式,在这种模式中你可以指定当一个特定时间发生时回调对象上的方法。注意事项:匿名类和内部类中的中的this :有时候,我们会用到一些内部类和匿名类。当在匿名类中用this时,这个this则指的是匿名类或内部类本身。这时如果我们要使用外部类的方法和变量的话,则应该加上外部类的类名。如下面这个例子: public class A { int i = 1; public A() { Thread thread = new Thread() { public void run() { for(;;) { A.this.run(); try { sleep(1000); } catch(InterruptedException ie) { } } } }; thread.start(); } public void run() { System.out.println("i = " + i); i++; } public static void main(String[] args) throws Exception { new A(); } } 在上面这个例子中, thread 是一个匿名类对象,在它的定义中,它的 run 函数里用到了外部类的 run 函数。这时由于函数同名,直接调用就不行了。这时有两种办法,一种就是把外部的 run 函数换一个名字,但这种办法对于一个开发到中途的应用来说是不可取的。那么就可以用这个例子中的办法用外部类的类名加上 this 引用来说明要调用的是外部类的方法 run。 对于这个例子: this.test(new Inner(){ public void method1(){ System.out.print("1111"); } public void method2(){ System.out.print("22222"); } }); 这个时候调用test()方法,那Inner类的method1和method2是什么时候被调用的?难道也是this对象向他们发消息(比如传入一个参数)吗?还是直接显式的调用??对于Inner类,除了this这个类,就是this.test(...那句中的this,它能够调用Inner类的方法,其他地方都不行,然而,这也需要你在类中有个地方保存有对这个内部类实例的引用才可以。再说明一次,内部类是用来在某个时刻调用外面的方法而存在的--这就是回调。为了说明内部类实例的方法只能在包容类的实例中调用,其他地方无法调用,给个例子如下:JAVA2实用教程源码: /** 一个应用程序,用来演示内部类的使用 *//** 类Outer */class Outer{private static int size;/** 内部类Inner的声明 */public class Inner{private int size;/** 方法doStuff() */public void doStuff(int size){size++; //存取局部变量this.size++; //存取其内部类的成员变量Outer.this.size++; //存取其外部类的成员变量System.out.println(size+" "+this.size+" "+Outer.this.size);}}//内部类Inner结束/** 类Outer中定义的实例方法testInner()方法 */public void testInner(){Inner i=new Inner();i.doStuff(5);}/** main()方法 */public static void main(String[] a){Outer o=new Outer();o.testInner();}}//类Outer结束 关于 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |