java内部类有java中什么是内部类作用?

解析JAVA编程中内部类的种类及各自的使用
发布人:&&发布日期: 09:01&&共1973人浏览
  内部类,计算机面向对象程序设计概念。向对象程序设计中,可以在一个类的内部定义另一个类,这种类称为嵌套类(nested classes),它有两种类型,即静态嵌套类和非静态嵌套类。静态嵌套类使用很少,最重要的是非静态嵌套类,也即是被称作为内部类(inner)。内部类是JAVA语言的主要附加部分。内部类几乎可以处于一个类内部任何位置,可以与实例变量处于同一级,或处于方法之内,甚至是一个表达式的一部分。
1. 普通内部类
普通内部类的一个最简单的例子:
1.//&外部类&&& &
2.class&OutterClass&{&&& &
3.&&&&//&内部类&&& &
4.&&&&public&class&InnerClass&{&&& &
5.&&&&&&&&private&int&i&=&0;&&& &
6.&&&&&&&&public&int&getInt(){&&& &
7.&&&&&&&&&&&&return&i;&&& &
8.&&&&&&&&}&&& &
9.&&&&}&&& &
10.&&&&public&void&proc(){&&& &
11.&&&&&&&&InnerClass&inClass&=&new&InnerClass();&&& &
12.&&&&&&&&System.out.println(inClass.getInt());&&& &
13.&&&&}&&& &
16.public&class&Main&{&&&&&&& &
17.&&&&public&static&void&main(String[]&args)&{&&& &
18.&&&&&&&&OutterClass&outClass&=&new&OutterClass();&&& &
19.&&&&&&&&outClass.proc();&&& &
20.&&&&}&&& &
外部类可以访问内部类的私有成员,内部类也可以访问外部类的私有成员:
1.//&外部类&&& &
2.class&OutterClass&{&&& &
3.&&&&private&int&mOut&=&10;&&& &
4.&&&&//&内部类&&& &
5.&&&&public&class&InnerClass&{&&& &
6.&&&&&&&&private&int&mIn&=&0;&&& &
7.&&&&&&&&public&void&printOutPrivate(){&&& &
8.&&&&&&&&&&&&//&直接打印外部类的成员&&& &
9.&&&&&&&&&&&&System.out.println(mOut);&&& &
10.&&&&&&&&}&&& &
11.&&&&}&&& &
12.&&&&public&void&printInPrivate(){&&& &
13.&&&&&&&&InnerClass&inClass&=&new&InnerClass();&&& &
14.&&&&&&&&//&直接打印内部类的私有成员&&& &
15.&&&&&&&&System.out.println(inClass.mIn);&&& &
16.&&&&}&&& &
17.&&&&public&void&printOutPrivate(){&&& &
18.&&&&&&&&InnerClass&inClass&=&new&InnerClass();&&& &
19.&&&&&&&&inClass.printOutPrivate();&&& &
20.&&&&}&&& &
23.public&class&Main&{&&&&&&& &
24.&&&&public&static&void&main(String[]&args)&{&&& &
25.&&&&&&&&OutterClass&outClass&=&new&OutterClass();&&& &
26.&&&&&&&&outClass.printInPrivate();&&& &
27.&&&&&&&&outClass.printOutPrivate();&&& &
28.&&&&}&&& &
如果外部类的成员变量与内部类的成员变量名字相同,当内部类要访问外部类的该成员时,可以使用&OutClass.this.mem&来区分:
1.//&外部类&&& &
2.class&OutterClass&{&&& &
3.&&&&private&int&mMem&=&10;&&& &
4.&&&&//&内部类&&& &
5.&&&&public&class&InnerClass&{&&& &
6.&&&&&&&&private&int&mMem&=&0;&&& &
7.&&&&&&&&public&void&printOutPrivate(){&&& &
8.&&&&&&&&&&&&//&直接打印外部类的成员&&& &
9.&&&&&&&&&&&&System.out.println(OutterClass.this.mMem);&&& &
10.&&&&&&&&}&&& &
11.&&&&}&&& &
要创建普通内部类,必须先创建相应的外部类:
1.//&外部类&&& &
2.class&OutterClass&{&&& &
3.&&&&private&int&mMem&=&10;&&& &
4.&&&&//&内部类&&& &
5.&&&&public&class&InnerClass&{&&& &
6.&&&&&&&&private&int&mMem&=&0;&&& &
7.&&&&&&&&public&void&printOutPrivate(){&&& &
8.&&&&&&&&&&&&//&直接打印外部类的成员&&& &
9.&&&&&&&&&&&&System.out.println(OutterClass.this.mMem);&&& &
10.&&&&&&&&}&&& &
11.&&&&}&&& &
14.public&class&Main&{&&&&&&& &
15.&&&&public&static&void&main(String[]&args)&{&&& &
16.&&&&&&&&OutterClass&outClass&=&new&OutterClass();&&& &
17.&&&&&&&OutterClass.InnerClass&inClass&=&outClass.new&InnerClass();&&& &
18.&&&&&&&&inClass.printOutPrivate();&&& &
19.&&&&}&&& &
也可以用下面的方式:
1.//&外部类&&& &
2.class&OutterClass&{&&& &
3.&&&&private&int&mMem&=&10;&&& &
4.&&&&//&内部类&&& &
5.&&&&public&class&InnerClass&{&&& &
6.&&&&&&&&private&int&mMem&=&0;&&& &
7.&&&&&&&&public&void&printOutPrivate(){&&& &
8.&&&&&&&&&&&&//&直接打印外部类的成员&&& &
9.&&&&&&&&&&&&System.out.println(OutterClass.this.mMem);&&& &
10.&&&&&&&&}&&& &
11.&&&&}&&& &
12.&&&&public&InnerClass&newInnerClass()&{&&& &
13.&&&&&&&&return&new&InnerClass();&&& &
14.&&&&}&&& &
17.public&class&Main&{&&&&&&& &
18.&&&&public&static&void&main(String[]&args)&{&&& &
19.&&&&&&&&OutterClass&outClass&=&new&OutterClass();&&& &
20.&&&&&&&OutterClass.InnerClass&inClass&=&outClass.newInnerClass();&&& &
21.&&&&&&&&inClass.printOutPrivate();&&& &
22.&&&&}&&& &
2. 静态内部类
普通内部类前面加上static修饰符,就成为静态内部类,静态内部类类似于C++的嵌套类,与普通内部类相比有如下区别:
静态内部类没有指向外部类的引用,外部类对于它来说更像一个名字空间。
普通内部类不能有静态成员,静态方法,或另一个静态内部类;而静态内部类可以有这一切。
静态内部类可以直接创建,不必先创建外部类:
1.//&外部类&&& &
2.class&OutterClass&{&&& &
3.&&&&private&int&mMem&=&0;&&& &
4.&&&&//&静态内部类&&& &
5.&&&&static&public&class&InnerClass&{&&& &
6.&&&&&&&&private&int&mMem&=&0;&&& &
7.&&&&&&&&public&void&printOutPrivate(){&&& &
8.&&&&&&&&&&&&//&这是错误的&&& &
9.&&&&&&&&&&&&//&System.out.println(OutterClass.this.mMem);&&& &
10.&&&&&&&&}&&& &
11.&&&&}&&& &
12.&&&&public&void&printInPrivate()&{&&& &
13.&&&&&&&&InnerClass&inClass&=&new&InnerClass();&&& &
14.&&&&&&&&//&可以直接访问静态内部类的成员&&& &
15.&&&&&&&&System.out.println(inClass.mMem);&&& &
16.&&&&}&&& &
18.public&class&Main&{&&&&&&& &
19.&&&&public&static&void&main(String[]&args)&{&&& &
20.&&&&&&&&//&直接创建静态内部类&&& &
21.&&&&&&&&OutterClass.InnerClass&inClass&=&new&OutterClass.InnerClass();&&& &
22.&&&&&&&&inClass.printOutPrivate();&&& &
23.&&&&}&&& &
从上面描述可以看出,静态内部类与一般类没有太大区别,只不过它是放在一个类的里面,这个类相当于它的名字空间,可以防止命名冲突。
3. 局部内部类
Java可以把一个类定义在一个方法里面,甚至是一个{}块里面,它的作用域就在这个块里面:
1.//&外部类&&& &
2.class&OutterClass&{&&& &
3.&&&&public&void&testLocalInner()&{&&& &
4.&&&&&&&&if&(true)&&& &
5.&&&&&&&&{&&& &
6.&&&&&&&&&&&&class&LocalInner&{&&& &
7.&&&&&&&&&&&&&&&&public&void&proc()&{&&& &
8.&&&&&&&&&&&&&&&&&&&&System.out.println(&hello&);&&& &
9.&&&&&&&&&&&&&&&&}&&& &
10.&&&&&&&&&&&&}&&& &
11.&&&&&&&&&&&&//&可以创建使用&&& &
12.&&&&&&&&&&&&LocalInner&localInner&=&new&LocalInner();&&& &
13.&&&&&&&&&&&&localInner.proc();&&& &
14.&&&&&&&&}&&& &
15.&&&&&&&&//&错误:超出类定义的作用域&&& &
16.&&&&&&&&LocalInner&localInner&=&new&LocalInner();&&& &
17.&&&&&&&&localInner.proc();&&& &
18.&&&&}&&& &
局部内部类的一般用途是实现某个接口,并作为这个接口传出方法被使用:
1.//&接口&&& &
2.interface&Talker&{&&& &
3.&&&&public&void&Talk();&&& &
6.//&外部类&&& &
7.class&OutterClass&{&&& &
8.&&&&public&Talker&getTalker()&{&&& &
9.&&&&&&&&//&现实该接口的局部内部类&&& &
10.&&&&&&&&class&SomeTalker&implements&Talker&{&&& &
11.&&&&&&&&&&&&public&void&Talk()&{&&& &
12.&&&&&&&&&&&&&&&&System.out.println(&hello&);&&& &
13.&&&&&&&&&&&&}&&& &
14.&&&&&&&&}&&& &
15.&&&&&&&&//&创建类实例并作为Talker返回&&& &
16.&&&&&&&&SomeTalker&talker&=&new&SomeTalker();&&& &
17.&&&&&&&&return&&&& &
18.&&&&}&&& &
21.public&class&Main&{&&&&&&& &
22.&&&&public&static&void&main(String[]&args)&{&&& &
23.&&&&&&&&OutterClass&outClass&=&new&OutterClass();&&& &
24.&&&&&&&&Talker&talker&=&outClass.getTalker();&&& &
25.&&&&&&&&talker.Talk();&&& &
26.&&&&}&&& &
4. 匿名内部类
匿名内部类的语法如下:
1.new&InterfaceName(){......};&或&new&SuperclassName(){......};&&&
它被认为是InterfaceName的实现者,或是SuperclassName的继承类,匿名内部类没有构建函数,如果SuperclassName有带参数的构造函数,必须在创建匿名内部类时带上这些参数,下面是匿名内部类最常见的使用场合:
1.//&接口&&& &
2.interface&Talker&{&&& &
3.&&&&public&void&Talk();&&& &
6.//&外部类&&& &
7.class&OutterClass&{&&& &
8.&&&&public&void&Talk(Talker&talker)&{&&& &
9.&&&&&&&&talker.Talk();&&& &
10.&&&&}&&& &
13.public&class&Main&{&&&&&&& &
14.&&&&public&static&void&main(String[]&args)&{&&& &
15.&&&&&&&&OutterClass&outClass&=&new&OutterClass();&&& &
16.&&&&&&&&//&直接生成一个匿名内部类&&& &
17.&&&&&&&&outClass.Talk(new&Talker(){&&& &
18.&&&&&&&&&&&&public&void&Talk()&{&&& &
19.&&&&&&&&&&&&&&&&System.out.println(&hello&);&&& &
20.&&&&&&&&&&&&}&&& &
21.&&&&&&&&});&&& &
22.&&&&}&&& &
来源:网络
我的电子书<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
您的访问请求被拒绝 403 Forbidden - ITeye技术社区
您的访问请求被拒绝
亲爱的会员,您的IP地址所在网段被ITeye拒绝服务,这可能是以下两种情况导致:
一、您所在的网段内有网络爬虫大量抓取ITeye网页,为保证其他人流畅的访问ITeye,该网段被ITeye拒绝
二、您通过某个代理服务器访问ITeye网站,该代理服务器被网络爬虫利用,大量抓取ITeye网页
请您点击按钮解除封锁&内部类可以引用它的包含类的成员吗?有没有什么限制?
内部类可以引用它的包含类的成员吗?有没有什么限制?
完全可以。如果不是静态内部类,那没有什么限制!
如果你把静态嵌套类当作内部类的一种特例,那在这种情况下不可以访问外部类的普通成员变量,而只能访问外部类中的静态成员,例如,下面的代码:
class Outer
staticclass Inner
voidtest()
答题时,也要能察言观色,揣摩提问者的心思,显然人家希望你说的是静态内部类不能访问外部类的成员,但你一上来就顶牛,这不好,要先顺着人家,让人家满意,然后再说特殊情况,让人家吃惊。
是本站开发的一款收藏记录创意分享 ,开启高效之门的在线应用。点击: 收藏此文
你可能对这些文章感兴趣.
Copyright & 2013 java面试题推荐这篇日记的豆列
······

我要回帖

更多关于 java内部类有什么用 的文章

 

随机推荐