Java编程思想之内部类

来源:互联网 发布:axure8.0mac汉化版 编辑:程序博客网 时间:2024/06/05 14:32

1.     将一个类定义在另一个类的内部,这就是内部类。

2.     在外部类的方法中生成内部类的对象,直接使用内部类名就可以了。对于非静态内部类对象来说,创建时必须声明这个对象的引用类型:外部类名.内部类名。

3.     内部类的对象可以访问生成它的外围对象的所有成员,而不需要任何特殊条件。内部类还拥有其外部类的所有成员的访问权。当通过外部类对象创建内部类对象时,此内部类对象会得到一个指向此外部类对象的引用。在你访问此外部类的成员时,就是通过这个引用来选择外部类的成员。非static内部类的对象只能是在与外部类的对象相关联的时候才能被创建。

4.     如果需要生成对外部类对象的引用,可以使用:外部类名.this 这个语法来生成。生成内部类对象的语法:外部类对象的引用.new 内部类名(形参)。形参赋值给构造器。必须有外部类对象,才能创建内部类对象。因为内部类对象会暗暗地连接到创建它的外部类对象上。当如果创建的是嵌套类(static内部类),就不需要对外部类对象的引用。

5.     Private内部类给类的设计者提供了一种路径,通过这个方式可以完全阻止任何依赖于类型的编码,并完全隐藏了实现的细节。内部类向上转型成基类,可以很方便的隐藏实现细节。

6.     定义在方法和作用域内的内部类:在方法之外不能访问此内部类。当此方法执行结束后,并不意味着此内部类对象不可用了。当内部类定义在作用域内时,它也跟其他类一起编译过,但在作用域以外不可用,除此之外,它与普通的类一样。

7.     匿名内部类:new 类名(形参){},形参赋值给对类的对应构造器。如果该匿名内部类内部直接使用了外部定义的对象,则要求这个对象的参数引用必须是final的。如果是传给基类的构造器,则不需要定义为final。通过实例初始化可以达到为匿名内部类创建一个构造器的效果:{ }。你不能重载实例初始化方法,因为只有一个构造器。匿名类只能扩展一个接口或实现一个类。

8.     如果不需要内部类对象和外部类对象之间有联系,则可以将内部类声明成static,这称为嵌套类。这意味着:1).要创建嵌套类的对象,并不需要其外部类对象。2).不能从嵌套类的对象中访问非静态的外部类对象。普通的内部类不能有static元素,也不能包含嵌套类,而嵌套类可以包含这些东西。嵌套类没有特殊的.this引用。

9.     正常情况,不能在接口内部放任何代码,但嵌套类可以作为接口的一部分。放入接口中的类都自动是public和static的。可以在内部类中实现其外围接口。

10.  一个内部非static类被嵌套多少层并不重要,它可以透明访问所有它所嵌入的外部类的所有成员。

11.  内部类的代码可以操作创建它的外部类对象,所以可以认为内部类提供了某种进入外部类的窗口。内部类允许分开继承多个非接口类型,因此有效实现了“多重继承”。

12.  闭包是一个可调用的对象,它记录了一些信息,这些信息来自于创建它的作用域。内部类就是面向对象的闭包,因为它不仅包含外部类对象的信息,还自动拥有指向外部类对象的引用。在此作用域内,内部类有权操作所有成员,包括private成员。通过回调,对象能够携带一些信息,这些信息允许它在稍后某个时刻调用初始的对象。当创建一个内部类时,并没有在外部类的接口中添加东西,也没有修改外部类的接口。

13.  应用程序框架就是被设计用来解决某类特定问题的一个类或一组类。要运用框架,通常是继承一个或多个类,并覆盖某些方法。把变化的东西和不变的东西分离开,变化的东西是指可覆盖的方法,不变的东西是指模板方法。控制框架的工作就是在事物“就绪”的时候执行事件。使用内部类,可以在单一类中产生对同一个基类的多个导出版本。因为内部类自身可以继承一个类,又可以访问外部类的任何成员,因此实现了多重继承的功能。

14.  内部类的继承由于要考虑对外部类对象的引用,必须使用特殊语法来说明:在导出类的构造器中声明:外部类对象.super();

15.  如果创建了一个内部类,然后继承其外部类并重新定义此内部类,则内部类并没有发生变化,这两个内部类是完全独立的两个实体。必须指定extend原内部类,才能够达到覆盖的效果

16.  局部内部类不能有访问说明符,因为它不是外部类的一部分。但它可以访问当前当前代码块的常量,以及此外部类的所有成员。

17.  局部内部类和匿名内部类何时使用:需要一个已命名的构造器或需要重载构造器,而匿名内部类只能用于实例初始化。

18.  每个类都会产生.class文件,其中包含了如果创建该类型的对象的全部信息,此信息产生了Class对象。

原创粉丝点击