内部类分为以下两种:

1、成员内部类

  成员内部类中包括(实例内部类、静态内部类)

  《实例内部类》

  实例内部类就是定义在类里的类,而且不是static的,外部类的访问修饰符可以是public  和默认的,而内部类可以是public、private、protected,实例内部类可以访问外部类的任何成员,但外部类如果想要访问内部类必须通过实例的方式进行访问,也就是说要先实例外部类,才能实例内部类。如:

  (1) 在创建实例内部类的实例的时候,外部类的实例必须已经存在   

  Outer.InnerTools its = new Out().new InnerTools();        

   以上代码等价于:        

  Outer out = new Outer(); 

  Outer.InnerTools its = out.new InnerTools();     

  (2) 实例内部类的实例【自动】持有对外部类的实例的引用,所以在实例内部类中,可以直接访问外部类的[所有]成员(这里指的是外部类当中所有的public,protected,private,static的方法和成员变量)之所以能访问,是因为在实例内部类中需要现有外部类的实例,才能有内部类的实例         

  Outer.InnerTools its = new Outer().newInnerTools();  

  【注意:】在多重嵌套中,实例内部类可以访问所有外部类的成

  Class A{

    Private void methodA(){} 

  Class B{       

    Private void methodB(){}              

  Class C{         

    Private void MethodC(){       

       methodA();       

      methodB();      

    }    

  }

  }

}

  (3) 在实例内部类中,外部类的实例与内部类的实例是一对多的关系,一个内部类实例 只会引用一个外部类实例,而一个外部类实例对应0个或n个内部类实例,在外部类 中【不能】直接访问内部类的成员,必须通过内部类的实例去访问才可以。

  (4) 在实例内部类中不能定义静态成 

  《静态内部类》

  (1) 静态内部类的实例【不会自动持有】外部类的实例的引用,在创建内部类的实例时,不必创建外部类的实例 

Class A{  

Public static class B{        

    Int v;      

  }

Class Test{     

Public void test(){     

    A.B b = new A.B();        

    b.v = 1;      

  }

}

  (2) 静态内部类可以直接访问外部类的静态成员,如果访问外部类的实例成员,就必须通过外部类的实例去访问 

class A  { 

  private int a1; 

  private static int a2;  

public static class B  {  

    int b1 = a1;  

    int b2 = a2;  

    int b3 = new A().a1; 

}

  (3) 在静态内部类中可以定义静态成员和实例成员 

class A { 

public static class B  {  

    int v1;  

    static int v2;   

public static class C   {   

    static int v3;  

    }

  }

}

  (4) 测试类可以通过完整的类名来直接访问静态内部类的静态成员 

class A { 

public static class B  {  

    int v1;  

    static int v2;   

public static class C   {   

    static int v3;   

    int v4;  

    }

  }

public class Client { 

public void test(){  

    A.B b = new A.B();  

    A.B.C c = new A.B.C();  

    b.v1 = 1;  

    b.v2 = 1;  

    A.B.v1 = 1//error  

    A.B.v2 = 1;  

    A.B.C.v3 = 1; 

}

2、局部内部类

  局部内部类(在方法中定义的内部类)

  局部内部类是在一个方法当中定义的内部类,它的可见范围是当前方法。和局部变量一样,局部内部类不能使用访问修饰符(public , private , protected) 以及 static 来修饰,局部内部类的特点是:  

  (1) 局部内部类只能在当前方法中使用. 

class A { 

    B b = new B();//error  

    public void method(){  

class B   {   

    int v1;   

    int v2;    

class C    {    

    int v3;   

  }  

  }  

    B b = new B();  

    B.C c = b.new C(); 

  }

(2) 局部内部类和实例内部类一样,不能包含静态成员。 

class A { 

public void method(){  

class B   {   

    static int v1;//error   

    int v2;    

static class C //error    {

     int v3;   

    }

  } 

  }

}

(3) 在局部内部类中定义的内部类同样也不能被public  protected, private这些访问修饰符修饰(局部内部类不能被public  protected  private访问修饰符修饰) 

(4)  局部内部类和实例内部类一样,可以访问外部类的所有成员,此外,局部内部类还可以访问所在方法中的final类型的参数和变量 

class A { 

    int a; 

public void method(final int p1,int p2){  

    int localV1 = 1;  

    final int localV2 = 2;   

class B   {   

  int b1 = a;    int b2 = p1;    int b3 = p2;//error    int b4 = localV1//error    int b5 = localV2;  

  } 

  }

}

posted on 2012-11-28 14:56  ̶G̶a̶v̶i̶n̶  阅读(545)  评论(0编辑  收藏  举报