Java内部类和外部类互相访问问题
2016-06-28 17:32
639 查看
今天在分析android的AMS的时候,发现在AMS中出现了内部类访问外部类私有方法的操作,一时之间觉得有些奇怪:为毛private的方法可以被访问??之前的认识是private方法是不可以通过对象方式调用的,但是现在的代码确实这么做了!!为什么呢?
带着这个问题,我google了一下,最终找到了这个stackoverflow的帖子:
http://stackoverflow.com/questions/1801718/why-can-outer-java-classes-access-inner-class-private-members
帖子中有很多人给予了热情的回复,大家可以看一下。要说明这个问题,需要说明一下在什么样的情况下使用内部类:
1. 你的某个类中的部分功能需要放在一个单独的类中实现,这样比较有利于代码的可读性和可维护性
2. 但是这部分的功能和现在这个类中的一些方法有这密切的关系。
这个时候,你就应该使用内部类,可以看到,内部类的设计目的就是为了将外部类中的一些功能方便地隔离出来,但是为了方便这个类的操作,所以这个类需要对外部类的一些属性和方法进行访问。也就是说这个时候,内部类只是外部类的一部分和外部类中的某个成员变量没有什么区别,当然可以互相访问了,包括私有属性和方法!这是从设计上对这个问题的解释,从编译和JVM角度来说的话,那就是java在编译的时候内部类和外部类的数据处理是共享的,也就是说所有的数据都是可以互相看到的。
下面给出一个测试代码,实际测试一个内部类和外部类的互相访问的问题:
运行结果如下:
从实际的运行结果来看,内部类和外部类的访问就是通行的,可以自由访问!
带着这个问题,我google了一下,最终找到了这个stackoverflow的帖子:
http://stackoverflow.com/questions/1801718/why-can-outer-java-classes-access-inner-class-private-members
帖子中有很多人给予了热情的回复,大家可以看一下。要说明这个问题,需要说明一下在什么样的情况下使用内部类:
1. 你的某个类中的部分功能需要放在一个单独的类中实现,这样比较有利于代码的可读性和可维护性
2. 但是这部分的功能和现在这个类中的一些方法有这密切的关系。
这个时候,你就应该使用内部类,可以看到,内部类的设计目的就是为了将外部类中的一些功能方便地隔离出来,但是为了方便这个类的操作,所以这个类需要对外部类的一些属性和方法进行访问。也就是说这个时候,内部类只是外部类的一部分和外部类中的某个成员变量没有什么区别,当然可以互相访问了,包括私有属性和方法!这是从设计上对这个问题的解释,从编译和JVM角度来说的话,那就是java在编译的时候内部类和外部类的数据处理是共享的,也就是说所有的数据都是可以互相看到的。
下面给出一个测试代码,实际测试一个内部类和外部类的互相访问的问题:
/************************************************************************* > File Name: Demo.java > Author: Baniel Gao > Mail: createchance@163.com > Created Time: Tue 28 Jun 2016 04:25:01 PM CST ************************************************************************/ class OuterClass { private int OuterPrivateInt = 0; public int OuterPublicInt = 1; public OuterClass() { } private void OuterPrivateMethod() { System.out.println("outer private method."); } public void OuterPublicMethod() { System.out.println("outer public method."); } public void outerTest() { System.out.println("***********************Outer Test***********************"); InnerClass innerObj = new InnerClass(); // access inner private member System.out.println("inner class private int: " + innerObj.InnerPrivateInt); // access inner public member System.out.println("inner class public int: " + innerObj.InnerPublicInt); // call inner public method innerObj.InnerPublicMethod(); // call inner private method innerObj.InnerPrivateMethod(); System.out.println("***********************Outer Test*********************** \n"); // inner test one innerObj.innerTestOne(); // inner test two innerObj.innerTestTwo(); } class InnerClass { private int InnerPrivateInt = 2; public int InnerPublicInt = 3; private void InnerPrivateMethod() { System.out.println("inner private method."); } public void InnerPublicMethod() { System.out.println("inner public method."); } public void innerTestOne() { System.out.println("***********************Inner Test One***********************"); // call outer class private method OuterPrivateMethod(); // call outer class public method OuterPublicMethod(); // access outer class private member System.out.println("outer class private int: " + OuterPrivateInt); // access outer class public member System.out.println("outer class public int: " + OuterPublicInt); System.out.println("***********************Inner Test One*********************** \n"); } public void innerTestTwo() { System.out.println("***********************Inner Test Two***********************"); OuterClass outerObj = new OuterClass(); // access outer class private member System.out.println("outer class private int: " + outerObj.OuterPrivateInt); // access outer class public member System.out.println("outer class public int: " + outerObj.OuterPublicInt); // call outer class private method outerObj.OuterPrivateMethod(); // call outer class public method outerObj.OuterPublicMethod(); System.out.println("***********************Inner Test Two***********************"); } } } public class Demo { public static void main(String[] arg) { OuterClass obj = new OuterClass(); obj.outerTest(); } }
运行结果如下:
从实际的运行结果来看,内部类和外部类的访问就是通行的,可以自由访问!
相关文章推荐
- Java设置session超时(失效)的三种方式
- jdk1.8 ThreadPoolExecutor实现机制分析
- eclipse转成Android studio过程中遇到的问题
- spring boot 静态页面展示
- MyEclipse for mac retina屏模糊的问题
- 一个分布式Java Web Session
- eclipse一些设置方法
- Spring整合开发示例(分别与JDBC、Hibernate、Struts整合)
- [2016/06/28] LeetCode / Java - Day 06 -
- JavaWeb文件上传下载功能示例解析
- [改善Java代码]警惕泛型是不能协变和逆变的
- [改善Java代码]不同的场景使用不同的泛型通配符
- 设置日期和时间,弹出的对话框里面,默认日期或者时间看不到
- 关于Eclipse开发环境下 Spark+Kafka 获取topic的时候连接出错
- spring boot 实现Restful API
- java 多个文件上传 spring mvc
- java graphics2d 旋转图片
- [改善Java代码]强制声明泛型的实际类型
- Java开发中的23种设计模式详解
- java中常用的设计模式