内部类:在类A中定义类B,那么类B流式类A的内部类,也成为嵌套类,相对而言,类A就是类B的外部类
内部类特点:
- 1、内部类也是一个类,在编译之后内部类也会编译为一个.class文件,但是前面会冠以 外部类的类名(包名+类名)和$符号
- 2、内部类不能用普通的方式访问,内部类是外部类的一个成员,因此内部类可以访问外部类的成员变量。如果内部类是静态内部类,则无法访问外部类的实例成员变量,因为静态是随着类的加载而加载的,此时还没有初始化实例成员,所以静态成员无法访问实例成员。
注意:
- 1、外部类只有两种访问控制修饰符:public和默认。内部类有4种访问控制修饰符:public、protected、private和默认。
- 2、外部类访问内部类
格式:InnerClass ic = new InnerClass();
- 3、在外部类以外的其它类中访问内部类
格式:OuterClass.InnserClass oi = new OuterClass().new InnerClass();
java实例内部类:非静态内部类
- 1、在外部类的静态方法中或者在外部类以外的类中访问内部类,都需要通过创建外部类的实例来创建内部类实例
例如:OuterClass.InnserClass oi = new OuterClass().new InnerClass();
- 2、在实例内部类,可以访问外部类的所有成员。
- 3、在外部类中不能直接访问内部类,必须通过内部类的实例进行访问
- 4、外部类实例与内部类实例是一对多的关系。即一个内部类实例只对应一个外部类,而一个外部类实例则对应多个内部类实例
- 5、在实例内部类中不能定义静态成员,除非同时使用final和static修饰该成员
java静态内部类:
- 1、创建静态内部类实例时,不需要创建外部类的实例。
例如:OuterClass.InnerClass oi = new OuterClass.InnerClass();
- 2、静态内部类中可以定义静态成员和实例成员。外部类以外的其他类需要通过完整类名访问静态内部类中的静态成员,如果要访问静态内部类中的实例成员,则需要通过静态内部类的实例。
例如:class OuterClass{//外部类
public int a = 10;//外部类实例成员变量
static class InnerClass{//内部类
pubilc final static int b = 20;//静态成员变量
public int c = 30;//实例成员变量
}
public void method(){
//外部类访问静态内部类静态成员变量
System.out.println(OuterClass.InnerClass.b);
//外部类访问静态内部类实例成员变量
OuterClass.InnerClass oi = new OuterClass.InnerClass();
System.out.println(oi.c);
}
}
- 3、静态内部类可以直接访问外部类的静态成员,如果要访问外部类的实例成员,则需要通过外部类的实例进行访问。
例如:class OuterClass{//外部类
public static int a = 10;//外部类静态成员变量
public int b = 20;//外部类实例变量
static class InnerClass{//内部类
public void method(){
//静态内部类访问外部类静态成员变量
System.out.println(OuterClass.a);
//静态内部类访问外部类实例成员变量
OuterClass oc = new OuterClass();
System.out.println(oc.b);
}
}
}
java局部内部类:方法内或者代码块内定义的类
- 1、局部内部类和局部变量一样,不能使用访问控制修饰符(public、
protected、private、默认)以及static修饰符。 - 2、局部内部类只在当前方法中有效
- 3、局部内部类中不能定义静态成员
- 4、局部内部类也可以有内部类,但是该内部类也不能使用访问控制修饰符
- 5、局部内部类只能访问当前方法或代码块中final修饰的参数与变量。如果方法中的变量与外部类的成员重名,可以通过OuterClass.this.MemberName来访问外部类中的成员。