首页 / JAVA / Java编程思想学习笔记-第十章
Java编程思想学习笔记-第十章
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Java编程思想学习笔记-第十章,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含8399字,纯文字阅读大概需要12分钟。
内容图文
![Java编程思想学习笔记-第十章](/upload/InfoBanner/zyjiaocheng/1177/3067b63069e04549a8829d1ec3479ef7.jpg)
Java编程思想学习笔记-第十章
Table of Contents
1 内部类
- 可以将一个类的定义放在另一个类的定义内部,这就是内部类
1.1 使用.this和.new
- 如果你需要生成对外部对象的引用,可以使用外部类的名字后紧跟原点和
this
package innerclasses; publicclassDotThis{voidf(){ System.out.println("DotThis.f()"); }publicclassInner{publicDotThisouter(){return DotThis.this; // A plain "this would be Inner‘s "this"}}publicInnerinner(){returnnewInner(); }publicstaticvoidmain(String[]args){DotThisdt = newDotThis(); DotThis.Innerdti = dt.inner(); dti.outer().f(); }}
- 有时候想要告知某些其他对象去创建某个内部类的对象,必须在new表达式中提供对其他外部类对象的引用,
.new
语法
package innerclasses; publicclassDotNew{publicclassInner{}publicstaticvoidmain(String[]args){DotNewdn = newDotNew(); DotNew.Innerdni = dn.newInner(); }}
1.2 方法或者作用域内的内部类
- 在方法中的内部类,称为局部内部类
package innerclasses; publicclassParcel5{publicDestinationdestination(Strings){// 在方法中的内部类,局部内部类classPDestinationimplementsDestination{privateStringlabel; privatePDestination(StringwhereTo){ label = whereTo; }@OverridepublicStringreadLabel(){return label; }}returnnewPDestination(s); }publicstaticvoidmain(String[]args){Parcel5p = newParcel5(); Destinationd = p.destination("Tasmania"); }}
1.3 匿名内部类
- 匿名内部类末尾的分好,并不是用来标记此内部类的结束的,实际上,它标记的是表达式的结束.
- 如果定义一个匿名内部类,并且希望它使用一个在其外部定义的对象,那么编译器会要求其参数引用是final的.(jdk8后没有该问题出现)
- 匿名内部类想要实现构造器的行为,可以使用代码块进行示例初始化,因为匿名内部类中不可能有命名构造器.
- 匿名内部类与正规的继承相比有些受限,因为匿名内部类即可以扩展类,也可以实现接口,但是不能两者兼备.而且如果是实现接口,也只能是实现一个接口.
1.4 嵌套类
- 如果不需要内部类对象与其外围类对象之间有联系,那么可以将内部类声明为static.
- 普通的内部类对象隐式地保存了一个引用,指向创建它的外围类对象.
- 当内部类为static(即嵌套类)
- 要创建嵌套类的对象,并不需要其外围类的对象
- 不能从嵌套类的对象中访问非静态的外围类
- 普通内部类的字段与方法,只能放在类的外部层次上,所以普通的内部类不能由static数据和static字段,也不能包含嵌套类.但嵌套类可以包含所有这些东西
1.5 接口内部的类
- 嵌套类可以作为接口的一部分,因为接口中的任何类都是自动是public和static的,所以其作用就是将嵌套类置于接口的命名空间内.
- 一般用在:想要创建某些公共代码,使得它们可以被某个接口的所有不同实现所共用.
1.6 从多层嵌套类中访问外部类的成员
- 一个内部类被嵌套多少层并不重要,它能透明的访问所有它所嵌入的外围类的所有成员.
1.7 为什么需要内部类
- 每个内部类都能独立地继承自一个(接口的)实现,所以无论外围类是否已经继承了某个(接口的)实现,对于内部类都没有影响.
- 如果拥有的是抽象的类或具体的类,而不是接口,那就只能使用内部类才能实现多重继承.
1.8 闭包与回调
- 闭包(closure)是一个可调用的对象,它记录了一些信息,这些信息来自于创建它的作用域.
- 通过闭包的定义可以知道内部类是面向对象的闭包.
1.9 内部类的继承
- 因为内部类的构造器必须连接到指向其外围类对象的引用,所以在继承内部类的时候,情况会变得复杂.
package innerclasses; classWithInner{classInner{}}publicclassInheritInnerextendsWithInner.Inner{//! InheritInner() {} // Won‘t compileInheritInner(WithInnerwi){ wi.super(); }publicstaticvoidmain(String[]args){WithInnerwi = newWithInner(); InheritInnerii = newInheritInner(wi); }}
1.10 内部类可以被覆盖吗?
- 如果创建一个内部类,然后继承其外围类并重新定义内部类时,不会覆盖原有的内部类,两个同名的内部类是完全独立的两个实体.
1.11 内部类标识符
- 每个类都会产生一个
.class
文件,命名规则:外围类的名字+$
+ 内部类的名字.
原文:https://www.cnblogs.com/devinkin/p/9880195.html
内容总结
以上是互联网集市为您收集整理的Java编程思想学习笔记-第十章全部内容,希望文章能够帮你解决Java编程思想学习笔记-第十章所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。