12-内部类
来源:互联网 发布:sql执行顺序 编辑:程序博客网 时间:2024/05/19 00:42
<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"><span style="font-size:14px;">可以将一个类的定义放在另一个类的定义内部,这就是内部类。内部类自动拥有对其外围类所有成员的访问权。</span></span>
1. 使用 .this与 .new:
如果你需要生成对外部类对象的引用,可以使用外部类的名字后面紧跟圆点和this。这样产生的引用自动地具有正确的类型,这一点在编译器就被知晓并受到检查,因此没有任何运行时开销。下面的示例展示了如何使用.this:
<span style="font-size:14px;">public class DotThis {void f(){System.out.println("DotThis.f()");}public class Inner{public DotThis outer(){return DotThis.this;}}public Inner inner(){return new Inner();}@Testpublic void test() {DotThis dt = new DotThis();DotThis.Inner dti = dt.inner();Inner inner = dt.new Inner();dti.outer().f();}}</span>要想直接创建内部类的对象,必须使用外部类的对象来创建该内部类对象,即dt.new Inner()
2. 匿名内部类
<span style="font-size:14px;">public class Parce17 {public Contents contents(){return new Contents(){private int i = 11;public int value(){return i;}};}@Testpublic void test() {Parce17 p = new Parce17();Contents c = p.contents();}}</span>
该示例表示:创建一个继承自Contents的匿名类的对象。通过new表达式返回的引用被自动向上转型为对Contents的引用。
如果定义一个匿名内部类,并且希望它使用一个在其外部定义的对象,那么编译器会要求其参数引用是final的。如果你忘记了,将会得到一个编译时错误消息。但是如果该对象被传递给匿名类的基类的构造器,它并不会在匿名内部类中直接使用,此时,该对象不要求使用final修饰。
在匿名类中不可能有命名构造器(因为匿名内部类根本没有名字!),但通过实例初始化,就能够达到为匿名内部类创建一个构造器的效果。
3. 限制
匿名内部类与正规的继承相比有些受限,因为匿名内部类既可以扩展类,也可以实现接口,但是不能两者兼备。而且如果是实现接口,也只能实现一个接口。
4. 为什么需要内部类
每个内部类都能独立的继承自一个(接口的)实现,所以无论外围类是否已经继承了某个(接口的)实现,对于内部类都没有影响。
0 0
- 12-内部类
- java笔记12 内部类
- 内部类
- 内部类
- 内部类
- 内部类
- 内部类
- 内部类
- 内部类
- 内部类
- 内部类
- 内部类
- 内部类
- 内部类
- 内部类
- 内部类
- 内部类
- 内部类
- Docker 使用指南 (三)—— 网络配置
- hdu - 5945 Fxx and game 【dp + 单调队列】
- BFS+DFS---简介与模板
- 说下入职IT小公司的感想
- *[Lintcode]Perfect Square
- 12-内部类
- tomcat远程debug
- 109. Convert Sorted List to Binary Search Tree
- 线程的生死
- 我为什么选择了sublime text
- TCP/IP illustrated 阅读笔记(六) ICMP协议
- hdoj2037 贪心算法——今年暑假不AC
- read代码阅读一(linux3.10.14)
- java虚拟机内存区域