定义和分类
- 内部类就是在一个类的内部又完整地嵌套了一个类结构
- 内部类的分类方式关键是 : 位置。根据位置的不同,可以分为两个大类,四个小类。
- 在外部类的局部位置上(局部位置指的是方法内、代码块内)
- 局部内部类 : 存在明确的类名
- 匿名内部类 : 没有明确的类名(非常关键的)
- 在外部类的成员位置上
- 成员内部类 : 普通的一个类,无 static 修饰的
- 静态内部类 : 使用 static 进行修饰的
局部内部类
- 可以直接访问外部类的所有成员,包括私有的;
- 局部内部类的地位相当于一个局部变量,因此不能添加访问修饰符,但可以使用
final
进行修饰;
- 作用域:仅仅在定义它的方法或代码块中有效;
- 局部内部类访问外部类的成员:直接访问即可;
- 外部类访问局部内部类的成员:创建对象 -> 通过对象进行访问;
- 注意:需要在局部内部类的作用域中才可以;
- 如果外部类和局部内部类的成员重名时,默认遵循就近原则。如果就是想访问外部类的成员时,使用
外部类名.this.成员
的方式。
package com.northcastle.A_jubu_innerClass;
public class JubuInnerClass {
// 1.外部类的属性
private String field01 = "外部类的私有属性field01";
public String field02 = "外部类的共有属性field02";
// 2.外部类的构造器
public JubuInnerClass() {
}
public JubuInnerClass(String field01, String field02) {
this.field01 = field01;
this.field02 = field02;
}
// 3.外部类的方法
public void method01(){
System.out.println("== 外部类的共有方法 : method01 ");
}
private void method02(){
System.out.println("== 外部类的私有方法 : method02 ");
}
// * 包含内部类的方法
public void method03(){
System.out.println("== 外部类的方法03 begin : 此方法包含一个局部内部类 == ");
System.out.println();
// 下面开始编写 局部内部类的代码
class innerClass{
// 1.局部内部类 的 属性
private String field01_inner = "局部内部类的私有属性";
public String field02_inner = "局部内部类的共有属性";
private String field02 = "局部内部类的和外部类重名的属性";
// 2.局部内部类的 构造器
public innerClass() {
}
public innerClass(String field01_inner, String field02_inner, String field02) {
this.field01_inner = field01_inner;
this.field02_inner = field02_inner;
this.field02 = field02;
}
//3.局部内部类的方法
public void method01_inner(){
System.out.println("--> 这是局部内部类的方法 method01_inner : begin <--");
System.out.println("直接访问外部类的私有成员 field01 : "+field01);
System.out.println("直接访问外部类的方法method01()、method02 :");
method01();
method02();
System.out.println("--> 这是局部内部类的方法 method01_inner : end <--");
}
public void method02_inner(){
System.out.println("--> 这是局部内部类的方法 method02_inner 演示内部类如何访问同名的外部类的属性field02 begin <--");
System.out.println("外部类的属性 field02 : "+JubuInnerClass.this.field02);
System.out.println("--> 这是局部内部类的方法 method02_inner 演示内部类如何访问同名的外部类的属性field02 end <--");
}
} // innerClass end
// 外部类访问内部类 : 创建内部类的对象,通过对象进行访问
innerClass innerClass = new innerClass();
innerClass.method01_inner();
System.out.println();
innerClass.method02_inner();
System.out.println();
System.out.println("== 外部类的方法03 end : 此方法包含一个局部内部类 == ");
}
}
package com.northcastle.A_jubu_innerClass;
public class Application {
public static void main(String[] args) {
//本代码演示使用内部类的情况
JubuInnerClass jubuInnerClass = new JubuInnerClass();
jubuInnerClass.method03();
}
}
匿名内部类
- 匿名内部类是定义在类的局部位置,如方法中、代码块中,且没有明确的类名;
- 是一个内部类,本质还是一个类,同时还是一个对象。
- 匿名内部类可以访问所有的外部类的成员,包括私有的;