1、实例内部类
1.1在外部类的静态方法和外部类以外的其他类中,必须通过外部类的实例创建内部类的实例。
public class Outer { //实例内部类 class Inner1{ } Inner1 i=new Inner1(); public void methord(){ Inner1 ii=new Inner1(); } public static void methord1(){ Inner1 i=new Outer().new Inner1();//需要创建外部类实例 } }
1.2在实例内部类中可以访问外部类的所有成员,,多层嵌套也可以
1.3外部类不能直接去访问内部类的成员,必须通过内部类的实例去访问。
1.4if类A包含类B,类B 包含类C,则A不能直接访问C,而应该通过类B的实例去访问C。
1.5 外部类实例与内部类实例是一对多的关系,也就是说一个内部类实例志对应一个外部类实例,而一个外部类实例则可以对应多个内部类实例。
1.6如果实例内部类B与外部类A包含有同名的成员t,则在类B中:t和this.t都表示B中的成员t;A.this.t表示A中的成员t。
1.7在实例内部类中不能定义static成员,除非同事哟final和static修饰。
2.静态内部类
2.1在创建静态内部类的实例时,不需要创建外部类的实例。Outer.Inner1 i=new Outer.new Inner1();
2.2静态内部类中可以定义静态成员和实例成员
2.3外部类以外的其他类需要通过完整的类名访问静态内部类中的静态成员,如果要访问静态内部类中的实例成员,则需要通过静态内部类的实例。
public class Outer { static int h;
int k; //实例内部类 class Inner1{ } Inner1 i=new Inner1(); public void methord(){ Inner1 ii=new Inner1(); } public static void methord1(){ Inner1 i=new Outer().new Inner1();//需要创建外部类实例 } static class Inner{
Outer outer=new Outer();
int hh=outer.k;
int a=0; static int b=0; int g=h;//静态内部类可以直接访问外部类的静态成员 } } class OtherClass{ Outer.Inner i=new Outer.Inner(); int b=i.a; int c=Outer.Inner.b; }
3.局部内部类(指在一个方法中定义的内部类)
3.1局部内部类与局部变量一样,不能使用访问控制修饰符(public.private/protected/static)
3.2局部内部类只在当前方法有效。
3.2.1局部内部类中不能定义static成员
3.2.2在局部内部类中可以访问外部类的所有成员
3.2.3在局部内部类中志可以访问当前方法中final类型的参数与变量。如果方法中的成员与外部类中的成员同名,则可以使用《OuterClaaName》.this.<MenberName>的形式访问外部类中的成员。
4.匿名类
指没有类名的内部类,必须在创建时使用new语句来声明类。
public class Outer { static int h; //实例内部类 class Inner1{ } Inner1 i=new Inner1(); public void methord(){ Inner1 ii=new Inner1(); } public static void methord1(){ Inner1 i=new Outer().new Inner1();//需要创建外部类实例 } static class Inner{ int a=0; static int b=0; int g=h;//静态内部类可以直接访问外部类的静态成员 } } class OtherClass{ Outer.Inner i=new Outer.Inner(); int b=i.a; int c=Outer.Inner.b; private void show(){ Outer anonyInter=new Outer(){ void show(){ System.out.println("这是匿名类中的show方法"); } }; } }
4.1匿名类和局部内部类一样,可以访问外部类中的所有成员。如果匿名类喂鱼一个方法中,则匿名类只能访问方法中final类型的局部变量和参数。
4.2匿名类中允许使用费静态代码块进行成员初始化操作。非静态代码块会在父类的构造方法之后被执行。