Java中的 内部类(吐血总结)

1.内部类分类

1)普通内部类

类的实例相关,可以看成是一个实例变量。内部类的类名由 “外部类.内部类” 确定。

普通内部类不能声明 static相关的变量或方法。内部类可以直接访问外部类的所有成员(包括 private成员),隐式或显式(外部类.this)。而外部类可以 new 内部类,实例相关的可以直接 new,static 相关(类相关)需要使用实例的引用去 引用.new。内部类 class 前可以添加 private 与 protected 表示只对其外部类或其子类有访问权限。

final class Demo {
    private int m = 4;

    private Demo() {
        System.out.println("Demo initial");
    }

    private class Inner {
        private int i = 23;

        Inner() {
            System.out.println("Inner initial");
        }
        private void f() {
            System.out.println("f method" + " i:" + this.i + " m:" + Demo.this.m);
        }
    }

    public static void main(String[] args) {
        Demo demo = new Demo();
        System.out.println("Dispatch Inner class");
        Demo.Inner inn = demo.new Inner();
        inn.f();
    }

}
/* out:
Demo initial
Dispatch Inner class
Inner initial
f method i:23 m:4

*///~

 2)局部内部类

方法和作用域中的内部类称为局部内部类,只在其词法作用域中可被访问。可以重载构造器。

3)匿名内部类

匿名内部类引用外部类的变量必须是 final的原因:匿名内部类没有完整的类结构,无法通过指向外部类的引用来访问外部类成员,而是使用值 copy来访问拷贝的外面成员的值。因此必须需要该值被 final 修饰。

匿名内部类没有具名构造器,new Wrapper(x) {} 可以将值传递给基类的构造器。

4)嵌套类

如果不需要内部类对象与其外部类对象之间有联系,那么可以将内部类声明为 static,称之为静态内部类或嵌套类。特点是:创建嵌套类的实例不需要其外围类的实例;不能从嵌套类的实例中访问非静态的外围类的实例;嵌套类不会随外部类加载而初始化。接口内部的类自动是 public static 的,可以将嵌套类放入接口中,从而使得他们可以被该接口的不同实现所共用。

final class Demo {
    private int m = 4;
    private static int n = 6;

    private Demo() {
        System.out.println("Demo initial");
    }

    static class Inner {
        private int i = 23;

        Inner() {
            System.out.println("Inner initial");
        }
        private void f() {
            System.out.println("f method" + " i:" + this.i + " n:" + Demo.n);
        }
    }

    public static void main(String[] args) {
//        Demo.Inner inn = new Inner(); // Inner initial
//        inn.f(); // f method i:23 n:6
        new Demo(); // Demo initial
    }

}
/* out:
Demo initial

*///~

2.作用

内部类是一个独立的实体,可以用来实现闭包;能与外部类通信;内部类与接口使得多继承更完整。

3.使用

猜你喜欢

转载自www.cnblogs.com/lemos/p/9275755.html