在java中,一个类的定义位于另一个类的内部,那么这个存在于类中的类称为内部类,也称为嵌套类,包裹内部类的称为外部类.
如果有多层嵌套,比如a类中有内部类b,b内部类中还有c内部类,那么通常将最外层的类称为顶层类或者顶级类
内部类可以分为两大块:
1.成员内部类
2.局部内部类
其中成员内部类包含实例内部类和静态内部类,
实例内部类是指没有用 static 修饰的内部类,有的地方也称为非静态内部类。
1.在外部类的静态方法和外部类以外的其他类中,必须通过外部类的实例创建内部类的实例;
2.在实例内部类中可以访问外部类的所有成员,如果是多层嵌套,那么内部类就可以访问所有外部类成员;
3.在外部类中不能直接访问内部类的成员,必须通过内部类的实例去访问;
4.外部类实例和内部类实例是一对多的关系,一个内部类实例只对应一个外部类实例,而一个外部类实例可以对应多个内部类实例;
5.实例内部类不能定义static,除非同时使用final和static修饰
而静态内部类则是使用static修饰的内部类。
1.创建静态内部类的实例不需要创建外部类的实例。
2.静态内部类中可以定义静态成员和实例成员。外部类以外的其他类需要通过完整的类名访问静态内部类中的静态成员,如果要访问静态内部类中的实例成员,则需要通过静态内部类的实例。
3.静态内部类可以直接访问外部类的静态成员,如果要访问外部类的实例成员,则需要通过外部类的实例去访问。
4.外部类可以通过静态内部类的类名直接访问静态内部类的静态成员,如果要访问静态内部类的实例成员,则需要通过静态内部类的实例去访问。
成员内部类一方面作为外部类的成员;可以调用外部类的结构;也可以被4种不同的权限修饰,
另一方面作为一个类,类内可以定义属性、方法、构造器等;可以被final修饰,表示此类不能被继承,当然不使用final就可以被继承;可以被abstract修饰
内部类的特点:
内部类在编译之后会编译成独立的.class文件,但却是外部类的类名加$符号为前缀的文件名;
例如:AnonymousClassesDemo为外部类类名
内部类不能用普通的方式访问,但是内部类是外部类的一个成员,所以内部类可以自由访问外部类的成员变量,其成员变量为private的都可以访问
内部类声明成静态的,就不能随便访问外部类的成员变量,只能访问外部类的静态成员变量。
外部类访问内部类的方法是,通过内部类的类名访问内部类。
例如:OuterClass1为内部类的类名
而外部类以外的其他类则需要通过内部类的完整类名访问内部类
例如:Outclass2.InnerClass2为完整的内部类类名
匿名内部类:
匿名内部类是指没有类名的内部类,必须在创建时使用new语句来声明类
实现方式:
1.继承一个类,重写其方法
2.实现一个接口或多个,实现其方法
特点:
1.可以访问外部类的所有成员,但是位于一个方法中,只能访问方法中final类型的局部变量和参数
2.允许使用非静态代码块进行成员初始化操作
3.其非静态代码块会在父类的构造方法之后被执行