内部类拥有对外部类的访问权限。同时内部类和普通类一样,可以实现(implements)某一个接口。

根据以上两点,可以在一个类中声明多个内部类,而这多个内部类都实现了同一个接口,只是具体的实现方式不一样。这样就可以能过不同的内部类,以不同的方式对外部类进行处理,达到不同的效果。

以下是一个示例,用来描述用不同的方法做一条鱼:

Cook是一个接口,BoilFish和FryFish这两个内部类都实现了这个接口,分别用来描述煮和炸…它们都可以访问外部类(CookFish)中的元素,Fish。只是经过不同的处理,Fish分别成为了水煮的鱼和炸鱼…

CookFish.java:

  1. package com.xyn.cp08;
  2.  
  3. interface Cook{
  4.     public void doCook();
  5. }
  6.  
  7. class Fish{
  8.     private String cookMethod;
  9.  
  10.     public String getCookMethod() {
  11.         return cookMethod;
  12.     }
  13.  
  14.     public void setCookMethod(String cookMethod) {
  15.         this.cookMethod = cookMethod;
  16.     }
  17.    
  18. }
  19.  
  20. public class CookFish {
  21.     public Fish fish = new Fish();
  22.     //inner class BoilFish implements the interface:Cook
  23.     class BoilFish implements Cook{
  24.         public void doCook() {
  25.             fish.setCookMethod("boil fish!");
  26.             //inner class can access elements of outer class.
  27.         }       
  28.     }
  29.     //inner class FryFish also implements the interface:Cook
  30.     class FryFish implements Cook{
  31.         public void doCook() {
  32.             fish.setCookMethod("fry fish!");
  33.         }
  34.     }
  35.    
  36.     public BoilFish getBoilFish(){
  37.         return new BoilFish();
  38.     }
  39.     public FryFish getFryFish(){
  40.         return new FryFish();
  41.     }
  42.    
  43.     public static void main(String[] args) {
  44.         CookFish cookFish = new CookFish();
  45.         Cook cook = cookFish.getBoilFish();
  46.         //boil fish
  47.         cook.doCook();
  48.         System.out.println(cookFish.fish.getCookMethod());
  49.         //fry fish
  50.         cook = cookFish.getFryFish();
  51.         cook.doCook();
  52.         System.out.println(cookFish.fish.getCookMethod());
  53.     }   
  54. }