关于java中的静态内部类和非静态内部类

1 篇文章 0 订阅
0 篇文章 0 订阅

最近在做mapreduce的时候突然对内部类有了疑问,于是翻书做测试算是搞明白一些了,记录下来备以后查阅。

-------------------------------------------------------------------------------------------------------------------------------------------

内部类是什么?

顾名思义,内部的类,类中类(这里只讨论成员类),即跟初始化块,成员变量,方法,构造函数一样是类的成员,包含内部类的类又叫做外部类或者宿主类。

为什么要用内部类?

比如我们要构造一个人的类,人的构造很复杂,为了更清晰的凸显出人的结构,我们需要把一些相对完备的模块抽象出来变成类的形式,比如胳膊、腿,但是人的胳膊、腿只有在人这个对象中才有意义,所以我们提出了一个内部类的概念。

内部类怎么用?

java中的内部类机制主要分为 静态内部类非静态内部类

一、非静态内部类

内部类只有在类内部才有意义,所以,内部类的一个重要的特点就是只有在外部类内部的方法,构造函数,初始化块中才可以申请内部类的对象,其他的类都不可以访问。 同其他类成员一样,内部类也有private, 包, protected, pulbic四种访问控制权限,但是注意即使内部类设为public权限,其他类也不能访问。
如下图所示,内部类A为public访问控制权限,外部类可以Test可以正常实例化A,而其他类B则不可以(下面的红色波浪线表示编译未通过)


然后说一下其他类中一类特殊的类-外部类的子类,外部类的子类是可以正常访问内部类的(内部类不是private的权限),这个很好理解,比如学生是人的子类,而学生肯定也是有胳膊有腿的。P.S. 关于权限,java的权限机制跟C++不太一样,java中的public和private和C++是一致的,但是protected不一致,java中的protected的访问范围为包内其他类以及不同包的子类,所以protected要比包权限大一些。
由于内部类类成员的身份,类中其他成员对于内部类来说都是透明的,内部类中的方法可以随意访问外部类中的private方法,变量。但是外部类能不能访问内部类的中的private成员呢?有些参考书上说不可以,但是亲测的结果是可以的。如下图所示,Test的构造函数中实例化了一个内部类的对象a, 可以直接访问对象a中private成员而正常运行代码。

二、静态内部类

静态内部类稍复杂些,首先要理解静态的含义,静态指的是类相关而不是对象相关,也就是说静态内部类是属于类的。静态内部类可以有静态成员也可以有非静态成员,但是静态内部类中的成员函数却不可以访问外部类中的非静态变量和函数,哪怕内部类中的非静态函数!反过来外部类中的成员函数依然是可以访问静态内部类以及其中的private成员函数的。这个很好理解,正如静态变量可以访问一样,静态内部类也可以被非静态的函数实例化访问。如下图所示,Test的构造函数中可以正常申请A的对象且能正确执行。


外部类说完了,那其他类呢,我们知道其他类是不能实例化非静态内部类的,但是其他类是可以实例化静态内部类的!这个很好理解,既然是类相关那么如果这个类可以被其他的类访问,那该类对应的内部类可以被访问且实例化以后该类中所有的成员都可以被访问(private除外)。
如下图所示,在类B中可以申请到A的对象实例,不过注意不用直接用A,而是Test.A!


先整理这些,以后遇到新的内容再添加进来。

------------------------------------------------------------------------------------------------------------------------------------------------------
参考资料:
书籍:《疯狂java讲义》

本文系原创,如有转载或引用请附上本文链接,谢谢。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值