Java内部类有哪些

Java内部类有哪些

本篇内容介绍了“Java内部类有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

内部类,计算机面向对象程序设计概念。向对象程序设计中,可以在一个类的内部定义另一个类,这种类称为嵌套类(nested classes),它有两种类型,即静态嵌套类和非静态嵌套类。静态嵌套类使用很少,最重要的是非静态嵌套类,也即是被称作为内部类(inner)。内部类是JAVA语言的主要附加部分。内部类几乎可以处于一个类内部任何位置,可以与实例变量处于同一级,或处于方法之内,甚至是一个表达式的一部分。

Java内部类有哪些

1. 普通内部类

普通内部类的一个最简单的例子:

//外部类classOutterClass{//内部类publicclassInnerClass{privateinti=0;publicintgetInt(){returni;}}publicvoidproc(){InnerClassinClass=newInnerClass();System.out.println(inClass.getInt());}}publicclassMain{publicstaticvoidmain(String[]args){OutterClassoutClass=newOutterClass();outClass.proc();}}

外部类可以访问内部类的私有成员,内部类也可以访问外部类的私有成员:

//外部类classOutterClass{privateintmOut=10;//内部类publicclassInnerClass{privateintmIn=0;publicvoidprintOutPrivate(){//直接打印外部类的成员System.out.println(mOut);}}publicvoidprintInPrivate(){InnerClassinClass=newInnerClass();//直接打印内部类的私有成员System.out.println(inClass.mIn);}publicvoidprintOutPrivate(){InnerClassinClass=newInnerClass();inClass.printOutPrivate();}}publicclassMain{publicstaticvoidmain(String[]args){OutterClassoutClass=newOutterClass();outClass.printInPrivate();outClass.printOutPrivate();}}

如果外部类的成员变量与内部类的成员变量名字相同,当内部类要访问外部类的该成员时,可以使用“OutClass.this.mem”来区分:

//外部类classOutterClass{privateintmMem=10;//内部类publicclassInnerClass{privateintmMem=0;publicvoidprintOutPrivate(){//直接打印外部类的成员System.out.println(OutterClass.this.mMem);}}}

要创建普通内部类,必须先创建相应的外部类:

//外部类classOutterClass{privateintmMem=10;//内部类publicclassInnerClass{privateintmMem=0;publicvoidprintOutPrivate(){//直接打印外部类的成员System.out.println(OutterClass.this.mMem);}}}publicclassMain{publicstaticvoidmain(String[]args){OutterClassoutClass=newOutterClass();OutterClass.InnerClassinClass=outClass.newInnerClass();inClass.printOutPrivate();}}

也可以用下面的方式:

//外部类classOutterClass{privateintmMem=10;//内部类publicclassInnerClass{privateintmMem=0;publicvoidprintOutPrivate(){//直接打印外部类的成员System.out.println(OutterClass.this.mMem);}}publicInnerClassnewInnerClass(){returnnewInnerClass();}}publicclassMain{publicstaticvoidmain(String[]args){OutterClassoutClass=newOutterClass();OutterClass.InnerClassinClass=outClass.newInnerClass();inClass.printOutPrivate();}}

2. 静态内部类

普通内部类前面加上static修饰符,就成为静态内部类,静态内部类类似于C++的嵌套类,与普通内部类相比有如下区别:

静态内部类没有指向外部类的引用,外部类对于它来说更像一个名字空间。

普通内部类不能有静态成员,静态方法,或另一个静态内部类;而静态内部类可以有这一切。

静态内部类可以直接创建,不必先创建外部类:

//外部类classOutterClass{privateintmMem=0;//静态内部类staticpublicclassInnerClass{privateintmMem=0;publicvoidprintOutPrivate(){//这是错误的//System.out.println(OutterClass.this.mMem);}}publicvoidprintInPrivate(){InnerClassinClass=newInnerClass();//可以直接访问静态内部类的成员System.out.println(inClass.mMem);}}publicclassMain{publicstaticvoidmain(String[]args){//直接创建静态内部类OutterClass.InnerClassinClass=newOutterClass.InnerClass();inClass.printOutPrivate();}}

从上面描述可以看出,静态内部类与一般类没有太大区别,只不过它是放在一个类的里面,这个类相当于它的名字空间,可以防止命名冲突。

3. 局部内部类

Java可以把一个类定义在一个方法里面,甚至是一个{}块里面,它的作用域就在这个块里面:

//外部类classOutterClass{publicvoidtestLocalInner(){if(true){classLocalInner{publicvoidproc(){System.out.println("hello");}}//可以创建使用LocalInnerlocalInner=newLocalInner();localInner.proc();}//错误:超出类定义的作用域LocalInnerlocalInner=newLocalInner();localInner.proc();}}

局部内部类的一般用途是实现某个接口,并作为这个接口传出方法被使用:

//接口interfaceTalker{publicvoidTalk();}//外部类classOutterClass{publicTalkergetTalker(){//现实该接口的局部内部类classSomeTalkerimplementsTalker{publicvoidTalk(){System.out.println("hello");}}//创建类实例并作为Talker返回SomeTalkertalker=newSomeTalker();returntalker;}}publicclassMain{publicstaticvoidmain(String[]args){OutterClassoutClass=newOutterClass();Talkertalker=outClass.getTalker();talker.Talk();}}

4. 匿名内部类

匿名内部类的语法如下:

newInterfaceName(){......};或newSuperclassName(){......};

它被认为是InterfaceName的实现者,或是SuperclassName的继承类,匿名内部类没有构建函数,如果SuperclassName有带参数的构造函数,必须在创建匿名内部类时带上这些参数,下面是匿名内部类最常见的使用场合:

//接口interfaceTalker{publicvoidTalk();}//外部类classOutterClass{publicvoidTalk(Talkertalker){talker.Talk();}}publicclassMain{publicstaticvoidmain(String[]args){OutterClassoutClass=newOutterClass();//直接生成一个匿名内部类outClass.Talk(newTalker(){publicvoidTalk(){System.out.println("hello");}});}}

“Java内部类有哪些”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注亿速云网站,小编将为大家输出更多高质量的实用文章!

发布于 2022-01-06 23:29:46
收藏
分享
海报
0 条评论
35
上一篇:Java中Struts2处理流程是怎样的 下一篇:Java虚拟机怎么用
目录

    0 条评论

    本站已关闭游客评论,请登录或者注册后再评论吧~

    忘记密码?

    图形验证码