内部类是在类级别(逻辑相关的类)上的封装,实现类名隐藏和进一步封装代码。内部类不同于组合。内部类与外部类的通信。

1. 链接到外部类(enclosing object)

当生成一个内部类的对象时,此对象与制造它的外为对象(enclosing object)之间就有了一种关系,它能访问其外围对象的所有成员,而无需任何条件。内部类拥有其外围类的所有元素的访问权(闭包机制,这与 C++ 的嵌套类的设计十分不同,在 C++ 中只是单纯的名字隐藏机制,与外围对象没有关系,也没有隐含的访问权)。

public class ArrayList<E> {

    public Iterator<E> iterator() {
        return new Itr();
    }

    // Itr 内部类共享其外层类的全部成员
    private class Itr implements Iterator<E> {
    }
}

2. Java 内部类与 C++ 的友元

java怎么没有友元类?

Java 采用内部类实现 C++ 友元的功能。事实上内部类就是一种面向对象的闭包,因为内部类有他的宿主类的一个 reference(所谓闭包是指一个对象,它记录了来自于创建它的作用域的所有信息),内部类本身可以利用这个引用访问宿主类的一切变量,包括 Private 级别。这不就是一个语法上的,一个类的所有成员变量能被另一个类完全访问吗?内部类不正是能当做宿主类的友元吗?

这一点参考 Java 实现 Memento 模式(备忘录模式)。

posted on 2017-08-19 16:56  未雨愁眸  阅读(185)  评论(0编辑  收藏  举报