《Java 编程思想》--第十章:内部类
来源:互联网 发布:淘宝子账号验证不了 编辑:程序博客网 时间:2024/06/09 17:55
- 可以将一个类的定义放在另一个类的定义内部,这就是内部类
- 创建内部类的方法就是把类定义置于外围类的里面
- 内部类有隐藏代码的功能,但更重要的是它能访问外围对象的所有成员,而不需要任何特殊条件。内部类还拥有其他外围类的所有元素的访问权
- 内部类自动拥有对其外围类所有成员的访问权:当某个外围类的对象创建了一个内部类对象时,此内部类对象必定会秘密的捕获一个指向那个外围类对象的引用。然后,在你访问此外围类的成员时,就是用那个引用来选择外围类的成员。
- 内部类的对象只能在于其外围类的对象相关联的情况下才能被创建
- 需要生成对外部类的引用,可以使用外部类的名字后面紧跟远点和this也就是.this
- 去创建其某个内部类的对象,你必须在new表达式中提供对其他外部类对象的引用,需要使用.new方法
- DotNew dn = new DotNew();
- DotNew.Inner dni = dn.new Inner();
- 在拥有外部类对象之前是不可能创建内部类对象的。这是因为内部类对象会暗暗地连接到创建它的外部对象上。但是,如果创建的是嵌套类(静态内部类),那么它就不需要对外部类对象的引用
- 可以在一个方法里面或者在任意的作用于内定义内部类,这么做有两个理由:
- 如前所示,你实现了某类型的接口,于是可以创建并返回对其的引用
- 要解决一个复杂的问题,想创建一个雷来辅助你的解决方法,但是又不希望这个类是公共可用的。
- 在方法的作用域内创建一个完整的类,被称为局部内部类
- 创建匿名内部类:
return new Contents(){
private int i = 11;
public int value() {return i;}
};
12. 在匿名类中使用类似构造器的行为,可以通过实力初始化,能够达到为匿名内部类创建一个构造器的效果
public class AnonymousConstructor {public static Base getBase(int i) {return new Base(i){{System.out.println("Inside instance initializer");}public void f(){System.out.println("In anonymous f()");}}}public static void main(String[] args){Base base = getBase(47);base.f();}}
public abstract class Base {public Base(int i){System.out.println("Base constructor,i = " + i);}public abstract void f();}
13. 匿名内部类与正规的继承相比有些受限,因为匿名内部类既可以扩展类也可以实现接口,但是不能两者兼备,而且如果是实现接口,也只能实现一个接口
14. 嵌套类:如果不需要内部类对象与其外围类对象之间有联系,可以将内部类申明为static,普通的内部类对象隐式地保存了一个引用,指向创建它的外围类对象。
15. 嵌套类意味着:
1) 要创建嵌套类的对象,并不需要其外围类的对象
2) 不能从嵌套类的对象中访问非静态的外围对象
16. 不同内部类的字段与方法,只能放在类的外部层次上,所以普通的内部类不能有static数据和static字段,也不能包含嵌套类
17. 正常情况下,不能再接口内部放置任何代码,但嵌套类可以作为接口的一部分。放到接口中的任何类都自动的是public和static的。甚至可以在内部类中实现其外围接口。
18. 一个内部类被嵌套多少层并不重要,它能透明的访问所有他所潜入的外围类的所有成员
19. 每个内部类都能独立的继承自一个(接口的)实现,所以无论外围类是否已经继承了某个(接口的)实现,对于内部类都没有影响
20. 内部类允许继承多个非接口类型(类或抽象类),如果拥有的是抽象的类或具体的类,而不是接口,那就只能使用内部类才能实现多重继承
21. 如果使用内部类,可以获得一些其他特性:
1) 内部类可以有多个实例,每个势力都有自己的状态信息,并且与其外围类对象的信息相互独立
2)在单个外围类中,可以让多个内部类以不同的方式实现同一个接口,或继承同一个类。
3)创建内部类对象的时刻并不依赖与外围类对象的创建
4)内部类并没有令人迷惑的 is-a 关系,他就是一个独立的实体
22. 闭包是一个可调用的对象,它记录了一些信息,这些信息来自于创建它的作用域
23. 应用程序框架:就是被设计用以解决某类特定问题的一个类或一组类。
24. 内部类允许:
1)控制框架的完整实现是由单个的类创建的,从而使得实现的细节被封装了起来。
2)内部类能够很容易地访问外围类的任意成员,所以可以避免这种实现变得笨拙。
25. 从内部类继承:
public class InheritInner extends WithInner.Inner{
}
这样只继承内部类,而不是外围类
26. 每个内部类都会产生一个.class文件,内部类也必须生成一个.class文件以包含他们的Class对象信息。这些类文件的命名有严格的规则:外围类的名字,加上“$”,再加上内部类的名字
- 《Java 编程思想》--第十章:内部类
- JAVA编程思想-第十章 内部类
- 《Java编程思想》第十章 内部类
- 《java编程思想》第十章:内部类
- 《java编程思想》第十章内部类
- JAVA编程思想学习总结:第十章接口内部类
- java编程思想读书笔记 第十章 内部类(上)
- java编程思想读书笔记 第十章内部类(中)
- java编程思想读书笔记 第十章 内部类(下)
- java编程思想读书笔记----第十章 内部类
- Java编程思想笔记——第十章 内部类
- Java编程思想笔记第十章(内部类)
- Java编程思想第四版读书笔记——第十章 内部类
- Java编程思想第四版第十章学习——内部类(1)
- Java编程思想第四版第十章学习——内部类(2)
- Java编程思想 -- 内部类
- java编程思想--内部类
- java编程思想 -- 内部类
- C#.net 地图控件开发(十) 地图对象Map
- 网站搬迁需要注意的事情
- 如何快速阅读别人的源代码
- 问题Re-installation failed due to different application signatures.解决
- LeetCode - Triangle
- 《Java 编程思想》--第十章:内部类
- 从hbase(hive)将数据导出到mysql
- the trunk, branch, tag in SVN
- resource is out of sync with the file system 解决方法
- 匠人手记:单片机工作者的实践与思考
- windows 下使用zlib 方法
- C#.net 地图控件开发(十一) 地图控件MapControl
- jquery 调用wcf
- struts2+jquery实现ajax