黑马程序员技术交流社区

标题: 内部类有什么作用 [打印本页]

作者: 王_强    时间: 2013-3-30 23:33
标题: 内部类有什么作用
本帖最后由 张熙韬 于 2013-3-31 13:14 编辑

内部类到底有什么作用,使用的时候注意些什么呢?
作者: 郭沐昌    时间: 2013-3-30 23:36
本帖最后由 Harry 于 2013-3-30 23:39 编辑

可将一个类定义置入另一个类定义中。这就叫作“内部类”。内部类对我们非常有用,因为
利用它可对那些逻辑上相互联系的类进行分组,并可控制一个类在另一个类里的“可见性”。然而,我们必
须认识到内部类与以前讲述的“合成”方法存在着根本的区别。
通常,对内部类的需要并不是特别明显的,至少不会立即感觉到自己需要使用内部类。
static 内部类
为正确理解 static在应用于内部类时的含义,必须记住内部类的对象默认持有创建它的那个封装类的一个对
象的句柄。然而,假如我们说一个内部类是static 的,这种说法却是不成立的。static内部类意味着:
(1) 为创建一个 static内部类的对象,我们不需要一个外部类对象。
(2) 不能从 static内部类的一个对象中访问一个外部类对象。
但在存在一些限制:由于static 成员只能位于一个类的外部级别,所以内部类不可拥有static 数据或
static内部类。
倘若为了创建内部类的对象而不需要创建外部类的一个对象,那么可将所有东西都设为static。为了能正常
工作,同时也必须将内部类设为static。
内部类标识符
由于每个类都会生成一个.class 文件,用于容纳与如何创建这个类型的对象有关的所有信息(这种信息产生
了一个名为 Class对象的元类),所以大家或许会猜到内部类也必须生成相应的.class 文件,用来容纳与它
们的Class 对象有关的信息。这些文件或类的名字遵守一种严格的形式:先是封装类的名字,再跟随一个$,
再跟随内部类的名字。例如,由InheritInner.java创建的.class 文件包括:
InheritInner.class
WithInner$Inner.class
WithInner.class
如果内部类是匿名的,那么编译器会简单地生成数字,把它们作为内部类标识符使用。若内部类嵌套于其他
内部类中,则它们的名字简单地追加在一个$以及外部类标识符的后面。

作者: HM刘俊    时间: 2013-3-30 23:38
百度摘要,这个全面点。
1)根据位置的不同,Java中的内部类分为四种: 静态内部类 使用static修饰,声明在类体中 静态内部类中可以访问外部类的静态成员 成员内部类 声明在类体中,不使用static,具有类的成员特征,也就是,必须有类的实例才能创建内部类实例 内部类实例可以访问共享外部类的成员变量(很常用) 如:链表的节点就可以定义为内部类 局部内部类 把类声明在方法中,就是局部内部类,作用域 类似局部变量(很少见) 匿名内部类 匿名类,非常常见,可以写在任何地方,就像一般的语句 语法更象是创建对象:Date d = new Date(){//...}; 匿名类是对原类的一个继承,同时创建了实例,{} 就是继承以后的类体类体中可使用所有类的语法 匿名类不能写构造器 匿名类可以从抽象类或者接口继承,必须提供抽象方法的实现2) 任何内部类都编译成独立的class文件3) 最大的作用:封装! 匿名类可以封装内部概念:情侣间的“土豆”和菜市场的“土豆”是不一样的
作者: 郭兴业    时间: 2013-3-31 00:04
当描述事物时,事物的内部还有事物,这时就需要用到内部类
作者: 李红志    时间: 2013-3-31 00:53
一、 定义
放在一个类的内部的类我们就叫内部类。
二、 作用
1.内部类可以很好的实现隐藏
  一般的非内部类,是不允许有 private 与protected权限的,但内部类可以
2.内部类拥有外围类的所有元素的访问权限
3.可是实现多重继承
4.可以避免修改接口而实现同一个类中两种同名方法的调用。
作者: 黄小贝    时间: 2013-3-31 01:31
楼上几位是来框技术分来的,都不够专业,看洒家给你分析一下~~~

我只是说说我见得多的关于内部类的用法~~

第一,匿名内部类~~我不希望任何的地方能够用到这个类,,最小访问权限原则




JDK里面我没有想到用到匿名内部类的,spring里面有




第二,普通的内部类,这个是比较常见的,可以在类中使用,但是其他类不能访问

比如最经典的Collection的迭代器的实现,每一种Collection的迭代器的实现都不同,所以,毫无疑问用内部类封在里面是最好的选择

举个例子,LinkedList里面的这个迭代器




以及它的节点类也是一个静态内部类





第三,方法里面的内部类,这个我在spring里面见过,感觉蛮巧妙的,比匿名内部类看起来代码清晰一些




第四,内部接口,这个我只发现到一个,Map里面的Entry,方便子类实现自己的Entry




我从来没有去记过内部类的定义,分类什么的,看多了,自然而然就会用~~

这要是再不加分,我就真的不相信爱情了,强烈谴责斑竹上次只点评不加分的行为




作者: 王_强    时间: 2013-3-31 12:50
呵呵,知道了!




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