您的位置:首页 > 编程语言 > Java开发

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在编译的时候内部类和外部类的数据处理是共享的,也就是说所有的数据都是可以互相看到的。

下面给出一个测试代码,实际测试一个内部类和外部类的互相访问的问题:

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

}


运行结果如下:



从实际的运行结果来看,内部类和外部类的访问就是通行的,可以自由访问!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: