TestInnerEtc.java


import java.io.*;

public class TestInnerEtc {
   public static void main (String[] args)throws IOException{
      
      // Nested class can be accessed just like top-level 
      // classes. Only need Outer.Nested to qualify it.
      Outer.Nested n = new Outer.Nested();
      Outer.Nested.NestedNested nn = new Outer.Nested.NestedNested();
      Outer.Nested.NestedInner  ni = new Outer.Nested().new NestedInner();
      
      
      // Inner class needs an instance of Outer class to
      // construct it.
      Outer.Inner  i = new Outer().new Inner();
      Outer.Inner.InnerInner  ii = new Outer().new Inner().new InnerInner();
      Outer.InnerI oi = i;
      
      // Local class cannot accessed from anywhere 
      // out of its own scope.
      // However, we are using the Local indirectly here.
      
      Outer o = new Outer();
      o.aMethod(3, 4);  // just guess what will be displayed  
      Outer.bMethod(3, 4);  // just guess what will be displayed  
      
      System.in.read();
   }
}

class Outer {
   public  int a  = 1;
   private int b  = 2;
   static  int sa = 1;
   static  int sb = 2;  
   
   public void aMethod(final int c, int d) {
      final  int e = 5;
             int f = 6;  
            
      // No public/protected/private modifier allowed
      // for Local classes
      class Local {
         int aLocalMtd(int g) {
            // Local class cannot access non-final 
            // local (automatic) variables or parameters
            return (a + b + + sa + sb + c + e + g);//No d,f allowed
         }
      }
      
      Local l = new Local();
      int x = l.aLocalMtd(7);  
      System.out.println(x);            
   }
   
   public static void bMethod(final int c, int d) {
      final int e = 5;
            int f = 6;  
            
      // No public/protected/private modifier allowed
      // for Local classes
      class LocalInStatic {
         int bLocalMtd(int g) {
            // LocalInStatic class cannot access non-final 
            // local (automatic) variables or parameters
            // LocalInStatic class cannot access non-static 
            // Enclosing class instance variables
            return (sa + sb + c + e + g);//No a, b, d,f allowed
         }
      }
      
      LocalInStatic l = new LocalInStatic();
      int x = l.bLocalMtd(7);  
      System.out.println(x);            
   }
   
   // any access modifier is allowed for Inner/Nested classes
   protected static class Nested {
      // You can difine anything in a Nested Top-level class
      static int s = 3;
             int i = 3;
      static int f() {return 1;}
             int g() {return 2;}
      static class NestedNested {
         NestedNested() {System.out.println("NestedNested");}
      }
      class NestedInner {
         NestedInner() {System.out.println("NestedInner");}
      }
   }
   	
   class Inner implements InnerI {
      // You cannot difine anything static in an Inner class
      class InnerInner {
         InnerInner() {System.out.println("InnerInner");}
      }
   }
   
   // all nested interface are implicitly static
   interface InnerI {
      interface InnerInnerI {
      }
   }
   
   interface InnerII {
   }
   
   // notice class cannot extends more than one super classes
   // interface can extends more than one interfaces
   static interface InnerIII extends InnerI, InnerII {
   }
}

// Not allowed
//static interface OutI {
//}


Last updated: 12-10-2002
Copyright © 1999 - 2003 Roseanne Zhang, All Rights Reserved
[ Java certification page] [ SCJP FAQ] [ JavaChina]