Java中的成员内部类(实例内部类):相当于类中的一个成员变量,下面通过一个例子来观察成员内部类的特点
public class Outer { //定义一个实例变量和一个静态变量 private int a; private static int b; //定义一个静态方法和一个非静态方法 public static void say(){} public void test(){ //在外部类中调用内部类的属性和方法 Inner inner = this.new Inner(); inner.d = 1; //通过创建内部类实例来调用内部类属性 inner.walk(); //通过创建内部类实例来调用内部类方法 } //成员内部类 public class Inner{ //定义一个静态常量 static final int m = 1; //在内部类中定义一个静态变量和一个实例变量 //static int c; 编译出错 int d; //定义一个匿名代码块和一个静态代码块 {} //static{} 编译出错 //定义一个静态方法和一个普通方法 //public static void go(){} 编译出错 public void walk(){ //在内部类中调用外部类的属性和方法 a = 1; b = 1; say(); test(); //内部类可以直接访问外部类的所有属性和方法 } } }
总结:1、成员内部类可以由public protected default private修饰
2、成员内部类是依赖于外部类的对象而存在的,在创建成员内部类的实例时,外部类的实例必须已经存在。
3、成员内部类可以包含哪些内容
1)匿名代码块
2)非静态属性
3)非静态方法
注意:成员内部类中不能有静态属性和方法但可以有静态常量(即用static final修饰的属性),因为在类加载时会初始化static修饰的内容,而成员内部类必须依赖于内部类对象,即成员内部类要在外部类加载之后加载,所以不能包含静态的变量和方法。使用final修饰的静态变量类加载时会自动初始化其值,将其作为一个常量,所以可以出现在内部类中。
4、外部类访问内部类
外部类可以通过创建成员内部类实例来访问成员内部类中的属性和方法
5、成员内部类访问外部类
成员内部类可以直接访问外部类的所有属性和方法
注意: 如果成员内部类B与外部类A包含同名的成员,那么在类B中, this.v表示类B的成员, A.this.v表示类A的成员。
6、创建内部类实例的方法
1)在外部类中创建:内部类名 name = this.new 内部类名();
2)在非外部类中创建:外部类名.内部类名 name = new 外部类名().new 内部类名();