Java内部类和外部类互相访问问题

Posted createchance

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java内部类和外部类互相访问问题相关的知识,希望对你有一定的参考价值。

今天在分析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在编译的时候内部类和外部类的数据处理是共享的,也就是说所有的数据都是可以互相看到的。
下面给出一个测试代码,实际测试一个内部类和外部类的互相访问的问题:

/*************************************************************************
    > 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内部类和外部类互相访问问题的主要内容,如果未能解决你的问题,请参考以下文章

Java内部类

java-07 内部类匿名内部类局部内部类lambda

内部类和外部类的实例变量可以共存

成员内部类的优点

内部类和静态内部类有什么区别?

java 面向对象内部类和接口