一、内部类
1、内部类编译之后的类文件名称
OuterClass$InnerClass.class
2、内部类定义的位置。内部类的分类
- 根据内部类定义的位置划分
类体
方法体(局部内部类)
代码块 - 根据是否被static修饰划分
静态内部类
非静态内部类
3、构建(实例化)
局部内部类的实例化只能在定义它的方法体中进行。
在外部类中的非static方法中,是可以调用内部类的构造方法实例化内部类,内部类必须在外层类实例化以后方可实例化
-
在static方法中,不能直接new内部类,要使用这种方式使用
OuterClassName.InnerClassName in = outerClassInstance.new InnerClassName()
4、内部类访问外部类的属性和方法
属性
(1)若内部类在类体或代码块中,可以直接访问外部类的属性,并且不需要声明为final类型。(内部类可以访问外部类的私有属性)
(2)若内部类在方法中,可以直接访问该方法中的属性。
注意
局部类的方法只可以引用定义为 final 的局部变量方法
(1)与外部类同名的方法调用。调用格式OuterClassName.this.OuterMethodName
"this"代表外部类的引用。
(2)与外部类不同名的方法调用。直接调用
注意:
内部类可以直接访问外部类的私有属性、私有方法。
内部类中声明的所有静态域都必须是 final。即:static final int a = 0
5、外部类访问内部类的属性和方法
访问静态属性或方法
调用格式InnerClasName.attribute 或 InnerClasName.method
访问实例属性或方法
必须用内部类的对象进行访问
调用格式new InnerClass().attribute 或 new InnerClass().method
补充:关键字static和内部类
- 内部类可以被static修饰。可以把内部类理解为外部类的属性,所以用static修饰就不奇怪了。
- 非静态内部类中声明的所有静态域都必须是 final。即:
static final int a = 0
且不能有 static 方法 - 在静态内部类中无第二条的限制
-
局部内部类及其属性、方法不能被static修饰,如图
二、匿名内部类
1、匿名内部类的构造方式
构造方法的小括号后面跟了一个大括号,如ClassName className = new ClassName(){};
注意:
- 匿名内部类不能是抽象类,因为系统在创建匿名内部类的时候,会立即创建内部类的对象。因此不允许将匿名内部类定义成抽象类。
- 匿名类中可以有初始化块,因为匿名内部类没有类名,所以没有构造方法
2、方法调用
-
使用匿名类作为某个接口的实现类,从而调用特定的方法。这里面存在一个问题,如何调用匿名类中自定义的方法呢? 使用匿名对象调用自定义的方法,如图2