内部类的重要价值在于其隐藏实现细节的能力,做法是将内部类访问属性设置为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对象并不知道这种情况,他只知道刚才“吃了一条鱼”。这种编程方式有效的实现了类型的隐藏。