THINKING IN JAVA 读书笔记——内部类

来源:互联网 发布:js 字符串包含子串 编辑:程序博客网 时间:2024/05/22 05:00

1 为什么要使用内部类?

  

     每个内部类都能独立地继承自一个实现,无论外围类是否继承了某个实现,对于内部类都没有影响。内部类使得多重继承的解决方案变得完整,接口解决了部分问题,而内部类有效地实现了“多重继承”。

 

2.创建一个内部类

 

     如果想从外部类的非静态方法之外的任意位置创建某个内部类对象,必须具体指明这个对象的类型:OuterClassName.InnerClassName.注意这里指的是外部类,而不是外围类,外围类是指包着内部类的那个类,在外围类中我们创建一个内部类对象不需要指明OuterClassName。

 

3链接到外部类

 

     当生成一个内部类对象时,此对象可以访问制造它的外围类的所有成员,包括private,因为当此内部类对象产生时,它会秘密的捕获一个外围类对象的引用,这是很关键的,就是拥有了这个引用,内部类才访问到了外围类的所有成员。

 

4.this和.new

 

    在非静态内部类想要返回一个外围类的引用时,就需要用外围类的名字后面紧跟圆点和this: return DotThis.this 

    想要创建内部类的对象,必须使用外部类的对象来创建该内部类对象 Out.Inner in = out.new Inner();在拥有外部类对象之前是不可能创建内部类对象的,这是因为内部类对象会暗暗地链接到外部类对象上。但若是嵌套类的话,就不需要对外部类对象的引用了。

 

5内部类和向上转型

 

   外围类是可以访问它的内部类的私有成员的,但是外部类却不能。

 

6局部内部类

 

    在这里我们需要注意的是,内部类的作用范围只是被限制在一定的区域内。

 

7匿名内部类

 

    它创建的是继承自某个类或是实现某个接口的子类对象,之所以叫它匿名内部类,是因为它没有名字。需要注意的是,在匿名类的末尾有分号:return new FatherClass(){}; 这个分号只是标记表达式的结束。

    另外有所迷惑的就是关于它使用外部定义的对象,编译器要求参数引用必须是final的,但若此参数并没有直接在匿名内部类中使用,可以不是final的,此外都必须是final的。

 

8嵌套类

 

    当把一个内部类声明为静态的时,它并没有普通的内部类对象那样保存了一个指向外围类对象的引用。要创建嵌套类对象,并不需要其外围类的对象,不能从嵌套类对象中访问非静态的外围类对象。普通内部类不能有static数据和static字段,也不能包含嵌套类,而嵌套类可以拥有这些。

 

   在接口中命名的内部类都自动地是public和static的。

 

   一个内部类被嵌套多少层并不重要,它能透明地访问所有它所嵌入的外围类的所有成员。

 

9内部类的继承

 

    class  InheritInner extends WithInner.Inner   在这个类中它默认的构造器并不好用,这是因为内部类必须要有指向它外围类的引用,这样我们必须自己显示的创建它

 

    InheritInner (WithInner wi){

 

            wi.super();

    }

    

    这样编译才能通过。

 

10 内部类覆盖

 

      当继承了某个外围类的时候,内部类并没有发生什么特别神奇的变化。这两个内部类是完全独立的两个实体,各自在自己的命名空间内。

    

原创粉丝点击