对于隐藏性来说,平时我们对类的访问权限,都是通过类前面的访问修饰符来限制的,一般的非内部类,是不允许有 private 与protected权限的,但内部类可以,所以我们能通过内部类来隐藏我们的信息。可以看下面的例子
InterfaceTest:
package com.mode.infa;
public interface InterfaceTest {
public void test();
}
Example:
package com.mode;
import com.mode.infa.InterfaceTest;
public class Example {
private String name = "Example";
private static String staticName = "Static Name";
/*成员内部类:
* 需要等外部类创建了对象以后才会被加载到JVM中,
* 它属于外部类的某个实例,因此它可以访问外部类的静态和非静态成员。
*对于构造方法来说,系统会为它们自动加上一个外部类的参数以及一个外部类的成员变量,
*这是因为要遵循先有外部类实例才能有内部类实例的原则。
*/
private class InsideClass implements InterfaceTest
{
private String innerName = "Example";
private String name = "Example";
public void test()
{
System.out.println("This is insideClass's name = " + name);
System.out.println("This is insideClass's innerName = " + innerName);
System.out.println("This is the out class's name = " + Example.this.name);
}
}
/*静态内部类:
* 在外部类加载的时候,静态内部类也随之加载,它的完整类名是,编译后的class的文件名为。
* 由于静态内部类是静态的,所以它无法访问外部类的非静态成员。
* 其实,静态内部类相对外部类来说,几乎是独立的,它可以在没有外部类对象的情况下,单独创造一个内部类的对象。
* 从某种程度来说,公开的静态内部类就相当于一个普通的类。
* 其相对于外部类来说,仅仅是包含关系,缩小了命名空间,完整类名中多了一个外部类的名称。
* 本质上是两个独立的类,JVM也不知道它们两个有包含关系。
*/
public static class StaticClass
{
public void testStaticClass()
{
System.out.println("This is StaticClass's static name = " + staticName);
}
}
public InterfaceTest getIn()
{
return new InsideClass();
}
}
测试类TestExample:
import com.mode.Example;
import com.mode.infa.InterfaceTest;
public class TestExample {
public static void main(String[] args) {
//InterfaceTest 如果为非public的话,对外是不可见的。
Example a=new Example();
InterfaceTest a1=a.getIn();
a1.test();
//StaticClass 如果为public的话,可以通过以下方法访问
Example.StaticClass st = new Example.StaticClass();
st.testStaticClass();
//InterfaceTest 如果为public的话,可以通过以下方法访问
//Example.InsideClass ei = new Example().new InsideClass();
//ei.test();
}
}
从这段代码里面我只知道Example的getIn()方法能返回一个InterfaceTest 实例但我并不知道这个实例是这么实现的。而且由于InsideClass 是private的,所以我们如果不看代码的话根本看不到这个具体类的名字,所以说它可以很好的实现隐藏。