-----以下是我昨天发在另一个版块的东西, 但没有人理我------------------
我来讲一点, 纯粹我个人的理解, 关于内部类的一些本质的内部, 纯干货, 但不把各种情况全部罗列出来的.
(仅罗列各种情况但不说明原因, 这样死记硬背也记不住的. 要记得住, 就得事物的本质)
希望能帮助到大家.
如果有讲得不对的, 或者不好的地方, 请指正. 谢谢.
(我理解一些东西时总是喜欢用指针的角度去理解.
Java的语法看似没有用到指针, 但其语言理论仍然需要用指针的, 比如引用, 本质仍然是指针)
对于非静态内部类, 其对象的空间中, 保留了一个指向外部类对象的指针.----这个很重要哦!
即, 意味着, 要创建非静态的内部类, 必须要有外部类对象先!
但是, 仅仅从外部类对象的空间, 是无法知道是否用这个外部类对象创建过其内部类对象,
因为外部类的存储空间中没有相关的数据域指向对应的内部类对象的空间.
所以, 在外部类中, 我们不能直接访问内部类的成员;
而, 在内部类中, 我们却可以直接访问外部类的成员.
局部内部类(匿名内部类其实也是局部内部类的一种) 中, 我们可以直接访问其所在方法的局部变量.
----至于, 为什么这个局部变量要求是final我就不知道了.
但我知道, JDK1.8的新特性是, 其不要求这个局部变量必须是final的.-----JDK1.8的新特性!
对于 静态内部类. 由于它是静态的, 所以其不依赖于外部类对象.
注意, 静态内部类也是可以有非静态成员的, 因此对静态内部类进行实例化也是有意义的,
但这个实例化不依赖于外部类对象(因为静态内部类是外部类的静态成员).
即, 在静态内部类的对象的存储空间中, 没有指向外部类对象的域.----很重要哦!
所以, 在静态内部类中, 不能直接访问外部类的非静态成员, 而只能访问外部类的静态成员.
而外部类 能访问静态内部类的静态成员, 但是不能直接访问静态内部类的非静态成员. |