黑马程序员技术交流社区

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

作者: haixian    时间: 2014-4-6 10:03
标题: 静态内部类
我发现java的内部类也可以是静态static的,他的作用是什么,为什么要设置成静态的,他是在什么时候被加载的。
作者: 1453149997    时间: 2014-4-6 10:33
本帖最后由 1453149997 于 2014-4-6 10:35 编辑

如果内部类写在成员位置上,那么它就相当于类的成员,修饰成员的修饰符都可以用来修饰内部类;内部类要被static修饰有两种情况:
(1)内部类要被其它静态成员使用;
(2)内部类里面有静态成员
想想其它成员什么时候加载就知道内部类什么时候加载了。

作者: y200745    时间: 2014-4-6 10:41
内部类:定义在一个类内部的类叫内部类,包含内部类的类称为外部类。内部类可以声明public、protected、private等访问限制,可以声明为abstract的供其他内部类或外部类继承与扩展,或者声明为static、final的,也可以实现特定的接口。外部类按常规的类访问方式使用内部类,唯一的差别是外部类可以访问内部类的所有方法与属性,包括私有方法与属性。
为何要用内部类?
     内部类一般只为其外部类使用;
内部类提供了某种进入外部类的窗户;
也是最吸引人的原因,每个内部类都能独立地继承一个接口,而无论外部类是否已经继承了某个接口。因此,内部类使多重继承的解决方案变得更加完整。


静态内部类

定义静态内部类:在定义内部类的时候,可以在其前面加上一个权限修饰符static。此时这个内部类就变为了静态内部类。通常称为嵌套类,当内部类是static时,意味着:
要创建嵌套类的对象,并不需要其外围类的对象;
不能从嵌套类的对象中访问非静态的外围类对象(不能够从静态内部类的对象中访问外部类的非静态成员);
嵌套类与普通的内部类还有一个区别:普通内部类的字段的字段与方法,只能放在类的外部层次上,所以普通的内部类不能有static数据和static字段,也不能包含嵌套类。但是在嵌套类里可以包含所有这些东西。也就是说,在非静态内部类中不可以声明静态成员,只有将某个内部类修饰为静态类,然后才能够在这个类中定义静态的成员变量与成员方法。
另外,在创建静态内部类时不需要将静态内部类的实例绑定在外部类的实例上。普通非静态内部类的对象是依附在外部类对象之中的,要在一个外部类中定义一个静态的内部类,不需要利用关键字new来创建内部类的实例。静态类和方法只属于类本身,并不属于该类的对象,更不属于其他外部类的对象。

作者: 张治国    时间: 2014-4-6 11:43
1453149997 发表于 2014-4-6 10:33
如果内部类写在成员位置上,那么它就相当于类的成员,修饰成员的修饰符都可以用来修饰内部类;内部类要被st ...

我的想法与你有些不同!
外部类一加载,内部类就加载了,因为它也是外部类的成员啊,而这个成员被静态修饰的。
作者: 黄泉    时间: 2014-4-6 11:48
需要了解2个概念:内部类和静态修饰符static
1)首先,用内部类是因为内部类与所在外部类有一定的关系,往往只有该外部类调用此内部类。所以没有必要专门用一个Java文件存放这个类。
2)静态都是用来修饰类的内部成员的。比如静态方法,静态成员变量,静态常量。它唯一的作用就是随着类的加载(而不是随着对象的产生)而产生,以致可以用类名+静态成员名直接获得。
这样静态内部类就可以理解了,因为这个类没有必要单独存放一个文件,它一般来说只被所在外部类使用。并且它可以直接被用 外部类名+内部类名 获得。

以下举例说明怎么使用:
Student类有个叫School的内部类(非静态)
Student stu = new Student();
stu.School sch = new stu.School();
sch就是School的一个对象。

假如School是内部静态类:
Student.School sch = new Student.School();




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