/*内部类向上转型为接口
如果将一个权限修饰符为private的内部类向上转型为其父类对象,或者直接向上转型为一个接口,在程序中就可以完全隐藏内部类的具体实现过程。可以在外部提供一个接口,在接口中声明一个方法。
如果在实现该接口的内部类中实现该接口的方法,就可以定义多个内部类以不同的方式实现接口中的
同一个方法*/
interface OutInterface //定义一个接口
{
public void f();
}
class OuterClass
{
//定义一个内部类实现OutInterface接口
private class InnerClass implements OutInterface
{
InnerClass(String s){ //内部类构造方法
System.out.println(s);
}
public void f(){//实现接口中的f()方法
System.out.println("访问内部类中的f()方法");
}
}
//定义一个方法,返回值类型为OutInterface接口 可以被继承下去
public OutInterface doit(){
return new InnerClass("访问内部类构造方法");
}
}
public class InterfaceInner
{
public static void main(String[] args)
{
OuterClass out = new OuterClass(); //实例化一个OuterClass对象
OutInterface outinter = out.doit(); //调用doit()方法,返回一个OutInterface接口
outinter.f(); //调用f()方法
}
}
/*
OuterClass类中定义了一个修饰权限为private的内部类,这个内部类实现了OutInterface接口,
然后修改doit()方法,使该方法返回一个OutInterface接口。由于内部类InnerClass修饰权限为
private,所以除了OuterClass类可以访问该内部类之外,其他类都不能访问,而可以访问doit()方法。
由于该方法返回一个外部接口类型,这个接口可以作为外部使用的接口。如果某个类继承了外部类,
由于内部的权限不可以向下转型为内部类InnerClass,同时也不能访问f()方法,但是却可以访问接口
中的f()方法。
例如,InterfaceInner类中最后一句outinter.f();接口引用调用f()方法,从执行的结果可以看出,这条
语句执行的是内部类中的f()方法,很好地对继承该类的子类隐藏了实现细节,仅为编写子类的人留下一个
接口和一个外部类,同时也可以调用f()方法,但是f()方法的具体实现过程却被很好地隐藏了*/