java中嵌套类型(nested type),也就是所谓的内部类(inner class),主要有四种:
- 静态内部类型,在类内部定义为static成员类型,如
static class,静态内部类需要注意以下几点:- 不管有没有static关键字,interface/annotation/enum都是静态类型;
- 静态内部类不能定义在任何非静态内部类中;
- 静态内部类的程序可以访问它所在的外部类的所有静态属性和方法,包括私有的静态属性和方法;
- 静态内部类其实就是顶层类,它不与任何对象关联;
- 静态内部类可以被声明为private的,但是interface里定义的方法仍然只能是public的。
- 非静态内部类,只能是class,注意:
- 一个非静态内部类的实例总是与外部类的实例
outerClassInstance相关联; - 非静态内部类的程序可以访问它所在的外部类的所有属性和方法,包括私有的方法;
- 不可以包含任何static属性,方法;
- java为非静态内部类设计了一些特殊语法,使用
OuterClassName.this形式引用外部类的实例对象,其相关用法举例如下:- OuterClassName.this.fieldName
- OuterClassName.this.anyMethod()
- OuterClassName.this.new InnerClassName()
- outerClassInstance.new InnerClassName()
- 内部类与外部类属性名相同时,访问外部类的实例属性,只能以
OuterClassName.this.fieldName方式访问; - 使用
OuterClassName.super形式来访问外部类的超类。
- 一个非静态内部类的实例总是与外部类的实例
- 局部类(local class),是定义在java代码块里的类,特点:
- interface/annotation/enum不能定义为局部类;
- 局部类可以访问代码块内可见范围内的所有final局部变量,java 8中变量可以不显式声明为final的,但实际是不能修改变量的引用;
- 局部类不能声明为private/protected/public/static,这些修饰符针对类成员,不能声明局部变量和局部类。
- 匿名类(annonymous class),是没有名称的局部类。
- 匿名类没有名称,所以在匿名类内是不能为它定义构造函数的,这是匿名类最大的限制;
- 可以使用初始化块来代替构造函数;
- 匿名类语法:
- new class-name ( [ argument-list ] ) { class-body }
- new interface-name () { class-body }
上面提到java为非静态内部类设计了一些特殊语法,应该尽量少用。
jvm中非静态内部类的实现说明
package com.example.test.javap;public class OuterClass { class InnerClass { private int var = 3; private int test() { return var; } } public static void main(String[] args) { OuterClass example = new OuterClass(); InnerClass innerClass = example.new InnerClass(); System.out.println(innerClass.test()); }} |