java提高篇之详解匿名内部类-编程开发技术

java提高篇之详解匿名内部类-编程开发技术

ID:31191941

大小:75.50 KB

页数:5页

时间:2019-01-07

java提高篇之详解匿名内部类-编程开发技术_第1页
java提高篇之详解匿名内部类-编程开发技术_第2页
java提高篇之详解匿名内部类-编程开发技术_第3页
java提高篇之详解匿名内部类-编程开发技术_第4页
java提高篇之详解匿名内部类-编程开发技术_第5页
资源描述:

《java提高篇之详解匿名内部类-编程开发技术》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、java提高篇Z详解匿名内部类-编程开发技术java提高篇之详解匿名内部类原文出处:chenssy在九腹提高篇一-详解内部类中对匿名内部类做了一个简单的介绍,但是内部类还存在很多其他细节问题,所以就衍生出这篇博客。在这篇博客中你可以了解到匿名内部类的使用、匿名内部类要注意的事项、如何初始化匿名内部类、匿名内部类使用的形参为何要为final。一、使用匿名内部类内部类匿名内部类由于没有名字,所以它的创建方式有点儿奇怪。创建格式如2new父类构造器(参数列表)丨实现接口(){〃匿名内部类的类体部分}在这里我们看到使用匿名内部类我

2、们必须要继承一个父类或者实现一个接口,当然也仅能只继承一个父类或者实现一个接口。同时它也是没有class关键字,这是因为匿名内部类是直接使用new來生成一个对象的引用。当然这个引用是隐式的。publicabstractclassBird{privateStringnamc;publicStringgetName(){returnname;}publicvoidsetName(Stringname){this,name=name;}publicabstractintfly();publicclassTest{publicvo

3、idtest(Birdbird){System,out.printin(bird.getName()+〃能够飞"+bird,fly()+publicstaticvoidni3in(String[]args){Testtest=newTest();test,test(newBird(){publicintfly(){return10000;}publicStringgetName(){return〃大雁〃;}});Output:大雁能够飞10000米在Test类中,testO方法接受一个Bird类型的参数,同时我们知道一个抽

4、象类是没有办法直接new的,我们必须要先有实现类才能new出來它的实现类实例。所以在mian方法中直接使用匿名内部类来创建一个Bird实例。出于匿名内部类不能是抽象类,所以它必须要实现它的抽象父类或者接口里面所有的抽象方法。对于这段匿名内部类代码其实是可以拆分为如下形式:publicclassWildGooseextendsBird{publicintfly(){return10000;}publicStringgetName(){return"大雁";}}WildGoosewildGoose二newWildGoose()

5、;test,test(wildGoose);在这里系统会创建一个继承自Bird类的匿名类的对象,该对象转型为对Bird类型的引用。对于匿名内部类的使用它是存在一个缺陷的,就是它仅能被使用一次,创建匿名内部类时它会立即创建一个该类的实例,该类的定义会立即消失,所以匿名内部类是不能够被重复使用。对于上而的实例,如果我们需要对tcstO方法里而内部类进行多次使用,建议重新定义类,而不是使用匿名内部类。二、注意事项在使用匿名内部类的过程屮,我们需要注意如下几点:?1、使用匿名内部类时,我们必须是继承一个类或者实现一个接口,但是两者

6、不可兼得,同时也只能继承一个类或者实现-个接口。2、匿名内部类屮是不能定义构造函数的。3、匿名内部类中不能存在任何的静态成员变量和静态方法。4、匿名内部类为局部内部类,所以局部内部类的所有限制同样对匿名内部类生效。5、匿名内部类不能是抽象的,它必须耍实现继承的类或者实现的接I」的所有抽彖方法。三、使用的形参为何要为final参考文件:http://android,blog.51cto.com/268543/384844我们给匿名内部类传递参数的时候,若该形参在内部类中需耍被使用,那么该形参必须要为final。也就是说:当所

7、在的方法的形参需要被内部类里面使用时,该形参必须为finalo??????为什么必须要为final呢?首先我们知道在内部类编译成功后,它会产生一个class文件,该class文件与外部类并不是同一class文件,仅仅只保留对外部类的引用。当外部类传入的参数需要被内部类调用时,从java程序的角度来看是直接被调用:publicclassOuterClass{publicvoiddisplay(finalStringname,Stringage){classTnnerClass{voiddisplay(){System・out

8、・println(name);从上而代码小看好像name参数应该是被内部类直接调用?其实不然,在java编译之后实际的操作如下:publicclassOuterClass$InnerClass{publicInnerClass(Stringname,Stringage){this.TnnerClass$

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。