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();
    }

}

运行结果如下:
这里写图片描述
从实际的运行结果来看,内部类和外部类的访问就是通行的,可以自由访问!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值