编程知识 cdmana.com

《JAVA编程思想》学习笔记:第10章(内部类)

目录
Java编程思想(一)第1~4章:概述
Java编程思想(二)第5章:初始化和清理
Java编程思想(三)第6章:访问权限
Java编程思想(四)第7章:复用类
Java编程思想(五)第8章:多态
Java编程思想(六)第9章:接口
Java编程思想(七)第10章:内部类
Java编程思想(八)第11章:持有对象
Java编程思想(九)第12章:异常
Java编程思想(十)第13章:字符串
Java编程思想(十一)第14章:类型信息
Java编程思想(十二)第15章:泛型
Java编程思想(十三)第16章:数组
Java编程思想(十四)第17章:深入研究容器
Java编程思想(十五)第18章:Java I/O系统
Java编程思想(十六)第19章:枚举
Java编程思想(十七)第20章:注解
Java编程思想(十八)第21章:并发

第10章 内部类

目录

10.1 链接到外部类

10.2 .this 与 .new

10.3 匿名内部类

10.4 Java嵌套类

10.5 为什么需要内部类

10.6 闭包与回调

10.7 局部内部类

10.8 Java接口和内部类总结


10.1 链接到外部类

Java非static的普通内部类自动拥有对其外围类所有成员的访问权。

a. Java&C++的区别:

Java普通内部类能访问其外围对象(enclosing object)的所有成员,而不需要任何特殊条件 。C++嵌套类的设计只是单纯的名字隐藏机制,与外围对象没有联系,也没有隐含的访问权。

b. Java实现原理:

在Java中,当某个类创建一个内部类对象时,此内部类对象必定会秘密地捕获一个指向那个外围类的对象的引用。然后,在你访问此外围类的成员时,就是用那个引用来选择外围类的成员。这些细节是由编译器处理的。Java的迭代器复用了这个特性。

 

10.2 .this 与 .new

Java非static的普通内部类可应用.this返回其外围对象的引用。

外围对象可应用.new来生成一个内部类对象。

public class DotThis{
    public class Inner{
        public DotThis outer(){
            return DotThis.this; // a plain "this" would be Inner's "this"
        }
    }
    public Inner inner(){ return new Inner(); }
    public static void main(String[] args){
        DotThis dt = new DotThis();
        DotThis.Inner dti = dt.inner();
        dti.outer().f();
    }
}

10.3 匿名内部类

Anonymous Inner Class.:没有定义class name的内部类。

 

10.4 Java嵌套类

嵌套类:内部类声明为static时,不再包含外围对象的引用.this,称为嵌套类(与C++嵌套类大致相似,只不过在C++中那些类不能访问私有成员,而在Java中可以访问)。

- 创建嵌套类,不需要外围对象。

- 不能从嵌套类的对象中访问非静态的外围对象。

10.4.1 接口内部的类

嵌套类可以作为接口的一部分(正常情况下,接口内部不能放置任何代码)。放到接口中的任何类都自动是public和static的。因为类是static的,只是将嵌套类置于接口的命名空间内,这并不违反接口的规则。

10.4.2 从多层嵌套类中访问外部类的成员

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

 

10.5 为什么需要内部类

内部类继承自某个类或实现某个接口,内部类的代码操作创建它的外围类的对象。所以可以认为内部类提供了某种进入其外围类的窗口。

内部类实现一个接口与外围类实现这个接口有什么区别呢?答案是:后者不是总能享用到接口带来的方便,有时需要用到接口的实现。所以,使用内部类最吸引人的原因是:

每个内部类才能独立地继承自一个(接口的)实现,所以无论外围类是否已经继承了某个(接口的)实现,对于内部类都没有影响。

内部类使得多重继承的解决方案变得完整。接口解决了部分问题,而内部类有效地实现了“多重继承”。也就是说,内部类使得Java实现继承多个非接口类型(类或抽象类)。

 

10.6 闭包与回调

闭包(closure)是一个可调用的对象,它记录了一些信息,这些信息来自于创建它的作用域。通过这个定义可以看出内部类是面向对象的闭包,因为它不仅包含外围类对象(创建内部类的作用域)的信息,还自动拥有一个指向此外围类对象的引用(.this),在此作用域内,内部类有权操作所有的成员,包括private成员。

回调(callback),通过回调,对象能够携带一些信息,这些信息允许它在稍后的某个时刻调用初始的对象。Java中没有指针,通过内部类提供的闭包功能可以实现回调。

 

10.7 局部内部类

在代码块|方法中定义的类。

应用场景:class定义&和new Object() 均位于方法内部。

 

 

10.8 Java接口和内部类总结

Java的接口和内部类比其他面向对象的概念更深奥复杂,C++没有这些,将两者结合起来,同样能够解决C++中的用多重继承所能解决的问题。

 

版权声明
本文为[架构师训练营]所创,转载请带上原文链接,感谢
https://cbk419323.blog.csdn.net/article/details/104095233

Scroll to Top