黑马程序员技术交流社区

标题: 内部类 [打印本页]

作者: 高泳    时间: 2014-9-25 17:28
标题: 内部类
内部类的访问规则:
1,内部类可以直接访问外部类的成员,包括私有。
        之所以可以直接访问外部类中的成员,是因为内部类中持有了外部类的引用。->外部类名.this.
2,外部类要访问内部类,必须建立内部类对象。

访问格式:
1,当内部类定义在外部类的成员位置上,而且非私有,可以在外部其他类中直接建立内部类对象。
格式:
        外部类名.内部类名 变量名 = 外部类对象.内部类对象;
        Outer.Inner in = new Outer.new Inner();
2,当内部类在成员位置上,就可以被成员修饰符所修饰。
        比如,private:将内部类在外部类中进行封装。
                static:内部类就具备了静态的特性。
                      当内部类被static修饰后,只能直接访问外部类中的static成员,出现了访问局限。
       
                在外部其他类中,如何直接访问static内部类的非静态成员?
                new Outer.Inner().function();
       
                在外部其他类中,如何直接访问static内部类的静态成员?
                Outer.Inner().function();
        注意:当内部类中定义了static成员,该内部类必须是static的。
              当外部类中的静态方法访问内部类时,内部类也必须是static的。


当描述物体时,事物的内部还有事物,该事物用内部类来描述。
因为内部事物在使用外部事物的内容。



当内部类定义在局部时:
1,不可以被成员修饰符修饰
2,可以直接访问外部类中的成员,因为还持有外部类中的引用
        但是不可以访问他所在的局部方法中的变量,只能访问被final修饰的局部变量


匿名内部类:
1,匿名内部类其实就是内部类的简写格式。
2,定义匿名内部类的前提:
        内部类必须是继承一个类或者实现一个借口。
3,匿名内部类的格式:new 父类或者接口(){定义子类的内容}
4,其实匿名内部类就是一个匿名类的子类对象,而且这个对象有点胖,也可以理解为带内容的对象。
5,匿名内部类中定义的方法最好不要超过三个。
作者: zuochbd    时间: 2014-9-25 18:54
-----以下是我昨天发在另一个版块的东西, 但没有人理我------------------
我来讲一点, 纯粹我个人的理解, 关于内部类的一些本质的内部, 纯干货, 但不把各种情况全部罗列出来的.
(仅罗列各种情况但不说明原因, 这样死记硬背也记不住的. 要记得住, 就得事物的本质)
希望能帮助到大家.
如果有讲得不对的, 或者不好的地方, 请指正. 谢谢.
(我理解一些东西时总是喜欢用指针的角度去理解.
Java的语法看似没有用到指针, 但其语言理论仍然需要用指针的, 比如引用, 本质仍然是指针)

对于非静态内部类, 其对象的空间中, 保留了一个指向外部类对象的指针.----这个很重要哦!
即, 意味着, 要创建非静态的内部类, 必须要有外部类对象先!
但是, 仅仅从外部类对象的空间, 是无法知道是否用这个外部类对象创建过其内部类对象,
因为外部类的存储空间中没有相关的数据域指向对应的内部类对象的空间.
所以, 在外部类中, 我们不能直接访问内部类的成员;
而, 在内部类中, 我们却可以直接访问外部类的成员.
局部内部类(匿名内部类其实也是局部内部类的一种) 中, 我们可以直接访问其所在方法的局部变量.
----至于, 为什么这个局部变量要求是final我就不知道了.
但我知道, JDK1.8的新特性是, 其不要求这个局部变量必须是final的.-----JDK1.8的新特性!

对于 静态内部类. 由于它是静态的, 所以其不依赖于外部类对象.
注意, 静态内部类也是可以有非静态成员的, 因此对静态内部类进行实例化也是有意义的,
但这个实例化不依赖于外部类对象(因为静态内部类是外部类的静态成员).
即, 在静态内部类的对象的存储空间中, 没有指向外部类对象的域.----很重要哦!
所以, 在静态内部类中, 不能直接访问外部类的非静态成员, 而只能访问外部类的静态成员.
而外部类 能访问静态内部类的静态成员, 但是不能直接访问静态内部类的非静态成员.




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2