Java中内部类揭秘(一):外部类与非静态内部类的”相互可见性“
2016-05-22 19:20
387 查看
Java中内部类揭秘(一):外部类与非静态内部类的”相互可见性“
转载地址:http://www.2cto.com/kf/201405/304482.html
我们都知道,非静态内部类可以访问外部类的私有成员(包括私有变量和方法),这也正是使用非静态内部类与普通类的一个重要区别:非静态内部类是依赖于外部类对象而存在的,这种依赖就包括它要能自由地访问外部类对象的所有成员(因为private成员都可以访问了,其他权限的成员更不在话下。不过一般来说一个内部类只会访问外部类的部分成员而不是全部)。比如心脏作为单独的一个类存在可能没有太大的意义,它必须依附于具体的Person对象存在才有意义,而且心脏它要能够自由地访问Person对象的一些成员,如血液、营养等。
显然,外部类对于非静态内部类而言是完全透明的。但是实际上,外部类与非静态内部类的另一个特征虽然不常用,却也值得注意,那就是非静态内部类其实跟外部类的其他成员类似,只是它的一个成员而已,因而即使非静态内部类的修饰符为private、即使非静态内部类的构造器修饰符为private,外部类也可以新建非静态内部类的对象。如下例所示:
?
输出结果如下图所示:
![](http://www.2cto.com/uploadfile/Collfiles/20140527/20140527093240241.jpg)
显然,由输出结果可看出:第一,虽然非静态内部类的修饰符和构造器均为private,但是外部类仍然可以创建内部类对象;第二,非静态内部类可以使用外部类的private成员(如此处的private成员变量gasType及gasAmount);
另一个常常被人忽略的地方是:在外部类的方法中,也可以通过创建非静态内部类的对象来访问内部类包括private成员在内的所有成员,不过注意必须是外部类的实例成员才行,而不能在外部类的静态成员(包括静态方法和静态初始化块)中使用非静态内部类,原因很简单:非静态内部类可看作是外部类的一个实例成员,而静态成员不能访问实例成员。如下例所示:
?
输出结果如下图:
![](http://www.2cto.com/uploadfile/Collfiles/20140527/20140527093240243.jpg)
从输出结果可以看出,在外部类的方法printRotateSpeed()中,通过非静态内部类的对象来a访问了其private成员rotateSpeed,这其实跟实际中的情况很像,即发动机从汽车处获得燃料信息,汽车再从发动机处获得转速并显示在仪表盘上。
综上,非静态内部类可自由访问外部类包括privated成员在内的所有成员,外部类也可通过创建内部类的对象来访问其包括private成员在内的所有成员,所以它们虽然在类层面不是相互可见的,但是从广义上来说具有相互可见性,这也是我在题目上打上双引号的原因。
转载地址:http://www.2cto.com/kf/201405/304482.html
我们都知道,非静态内部类可以访问外部类的私有成员(包括私有变量和方法),这也正是使用非静态内部类与普通类的一个重要区别:非静态内部类是依赖于外部类对象而存在的,这种依赖就包括它要能自由地访问外部类对象的所有成员(因为private成员都可以访问了,其他权限的成员更不在话下。不过一般来说一个内部类只会访问外部类的部分成员而不是全部)。比如心脏作为单独的一个类存在可能没有太大的意义,它必须依附于具体的Person对象存在才有意义,而且心脏它要能够自由地访问Person对象的一些成员,如血液、营养等。
显然,外部类对于非静态内部类而言是完全透明的。但是实际上,外部类与非静态内部类的另一个特征虽然不常用,却也值得注意,那就是非静态内部类其实跟外部类的其他成员类似,只是它的一个成员而已,因而即使非静态内部类的修饰符为private、即使非静态内部类的构造器修饰符为private,外部类也可以新建非静态内部类的对象。如下例所示:
?
![](http://www.2cto.com/uploadfile/Collfiles/20140527/20140527093240241.jpg)
显然,由输出结果可看出:第一,虽然非静态内部类的修饰符和构造器均为private,但是外部类仍然可以创建内部类对象;第二,非静态内部类可以使用外部类的private成员(如此处的private成员变量gasType及gasAmount);
另一个常常被人忽略的地方是:在外部类的方法中,也可以通过创建非静态内部类的对象来访问内部类包括private成员在内的所有成员,不过注意必须是外部类的实例成员才行,而不能在外部类的静态成员(包括静态方法和静态初始化块)中使用非静态内部类,原因很简单:非静态内部类可看作是外部类的一个实例成员,而静态成员不能访问实例成员。如下例所示:
?
![](http://www.2cto.com/uploadfile/Collfiles/20140527/20140527093240243.jpg)
从输出结果可以看出,在外部类的方法printRotateSpeed()中,通过非静态内部类的对象来a访问了其private成员rotateSpeed,这其实跟实际中的情况很像,即发动机从汽车处获得燃料信息,汽车再从发动机处获得转速并显示在仪表盘上。
综上,非静态内部类可自由访问外部类包括privated成员在内的所有成员,外部类也可通过创建内部类的对象来访问其包括private成员在内的所有成员,所以它们虽然在类层面不是相互可见的,但是从广义上来说具有相互可见性,这也是我在题目上打上双引号的原因。
相关文章推荐
- 简单算法之冒泡排序(Java)
- spring整合技术之---利用JDBC访问数据库
- NetBeans8.1开发Spring MVC的基础代码
- Spring IoC容器的初始化过程
- 服务器性能监控javamelody配置使用
- AtomicBoolean 介绍和使用
- 完全解决MyEclipse运行中可能存在的乱码问题
- Spring4 MVC Hibernate4集成 Annotation
- Javaweb项目虚拟路径
- Java学习_运算符优先级
- Java注解学习-自定义注解
- Spring核心技术(五)——Spring中Bean的作用域
- Spring核心技术IoC容器(五)
- Java注解学习-3种基础注解
- Java流(Stream)、文件(File)和IO
- JAVA学习总结十
- Java学习之HashMap: 如何正确实现Map的entrySet()方法
- Java的File类
- Java动态编程---动态代理
- JAVA学习总结九