566 次浏览
  • 内部类:定义在类结构的中的另一个类//编译后,每个内部类都会生成对应.class
  • 四种内部类
    • 实例内部类 //没有使用 static 修饰的
    • 静态内部类 //使用 static 修饰的
    • 局部内部类 //在方法中定义
    • 匿名内部类 //没有名称的局部内部类 ,适合只需要使用一次
      • 定义时会立即创建一个该类实例,定义后即消失,不能重复使用
      • 必须继承一个父类或者 实现一个接口,但都只能继承或者实现一个
      • 不能自定义构造器,不能是抽象类
      • 匿名内部类访问的局部变量只能是final(Java8开始,匿名内部类访问的局部变量自动使用final修饰)
  •  特点:
    • 实例内部类不能含有 static 的变量和方法
    • 静态内部类(嵌套类)不能访问外部类的非 static 成员
    • 局部内部类及匿名内部类对象不能使用该内部类所在方法的非 final 局部变量
  • 定义格式:
    // 外部类class Outer {String str1 = "Outer 实例变量";static String str2 = "Outer 类变量";// 实例内部类class Inner1 {String str1 = "Inner1 实例变量";final static String str2 = "Inner1 类变量"; // 实例内部类中不能定义类成员,除非使用 final 修饰public void doWork() {String str1 = "Inner1 局部变量";System.out.println(str1); // Inner1 局部变量System.out.println(this.str1); // Inner1 实例变量System.out.println(Outer.this.str1); // Outer 实例变量}}// 静态内部类static class Inner2 {String str1 = "Inner2 实例变量";static String str2 = "Inner2 类变量"; public void doWork() {String str1 = "Inner2 局部变量";System.out.println(str1); // Inner2 局部变量System.out.println(this.str1); // Inner2 实例变量// System.out.println(Outer.this.str1); // 无法访问外部类的非静态成员System.out.println(Outer.str2); // Outer 类变量}}public void doWork() {final String STR3 = "方法中局部变量";// 局部内部类class Inner3 {String str1 = "Inner3 实例变量";// static String str2 = "Inner3 类变量"; // 局部内部类中不能定义类成员public void innerDoWork() {String str1 = "Inner3 局部变量";System.out.println(str1); // Inner3 局部变量System.out.println(this.str1); // Inner3 实例变量System.out.println(STR3); // 被局部内部类访问的局部变量必须使用final修饰// System.out.println(Outer.this.str1); // 无法访问外部类的非静态成员System.out.println(Outer.str2); // Outer 类变量}}new Inner3().innerDoWork(); // 只能在局部内部类所在的方法中创建对象}}// 测试类class InnerClassDemo {public static void main(String[] args) {// 通过外部类对象创建实例内部类对象Outer.Inner1 in1 = new Outer().new Inner1();in1.doWork();// 创建一个静态内部类对象不需要外部类对象// 直接调用静态内部类的构造器创建对象,需用完整的类名Outer.Inner2 in2 = new Outer.Inner2(); in2.doWork();new Outer().doWork();}}

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注