内部类的重要价值在于其隐藏实现细节的能力,做法是将内部类访问属性设置为private,并且内部类实现了一个接口或者继承了一个类。然后由外围类建立方法以生成这些内部类的实例,而这些方法的返回类型必须是父类。

下面是这种编程方式的一个范例:

package Stephen.Class.chapter7;
//以内部类实现隐藏具体类信息测试
public class InnerClassUpperCase {
    public static void main(String[] args){
        Cat cat = new Cat();//创建对象
        PetStore petStore = new PetStore();
        cat.eat(petStore.provideSardine());
        cat.eat(petStore.provideHerring());
        cat.eat(petStore.provideTuna());
    }
}
//
class Cat{
    public void eat(Fish fish){
        System.out.println("正在吃" + fish);
    }
}
//
interface Fish{
    String bone = "鱼骨";
    boolean swimming = true;
}
//宠物店
class PetStore{
    //沙丁鱼
    private class Sardine implements Fish{
        private String name;
        public Sardine(){
            name = "沙丁鱼";
        }
        public String toString(){
            return name;
        }
    }
    //大青鱼
    private class Herring implements Fish{
        private String name;
        public Herring(){
            name = "大青鱼";
        }
        public String toString(){
            return name;
        }
    }
    //金枪鱼
    private class Tuna implements Fish{
        private String name;
        public Tuna(){
            name = "金枪鱼";
        }
        public String toString(){
            return name;
        }
    }
    //供应沙丁鱼
    public Fish provideSardine(){
        return new Sardine();
    }
    //供应青鱼
    public Fish provideHerring(){
        return new Herring();
    }
    //供一个金枪鱼
    public Fish provideTuna(){
        return new Tuna();
    }
}

运行结果为:

  这个程序中得类PetSore内部有三个内部类,分别是Sardine。Herring 、Tuna。这三个类是私有的,因此只能在PetSore类内部可见,并且都实现了接口Fish。而三个创建内部类的方法provideSardine、provideHerring、provideTuna其返回值类型都是Fish,因此对于外部的调用者而言,内部类Sardine。Herring 、Tuna是不可见的。

  Cat类表示猫, 对于猫而言, 只要是鱼都可以入口,因此其eat方法接受的是Fish的类型的参数,在main方法中Cat的实例cat调用了三次eat方法, 三次接受的实际类型分别是Sardine。Herring 、Tuna。但是Cat对象并不知道这种情况,他只知道刚才“吃了一条鱼”。这种编程方式有效的实现了类型的隐藏。

 
posted on 2012-06-25 23:26  Stephen Li  阅读(1197)  评论(0编辑  收藏  举报