序
类成员包括:字段、方法、内部类
内部类被看成是 字段级别。
内部类
什么是内部类:定义类结构中的另一个类。
为什么使用内部类:
1 增强封装性:将内部类隐藏在外部类中。防止其他类访问内部类。
2 提高可读性和可维护性。
3 内部类可以直接访问外部类的成员变量和方法。
根据修饰符或者定位四种内部类:
① 实例内部类:内部类没有使用static修饰
② 静态内部类:内部类使用static修饰
③ 局部内部类:在方法中的内部类
④ 匿名内部类:适合于仅使用一次的类,属于局部内部类的特殊情况
对于每个内部类来说:java编译器会生成独立的.class文件
成员内部类:外部类名字$内部类名字
局部内部类:外部类名字$数字 内部类名字
匿名内部类:外部类名字$数字
静态内部类
使用static 修饰内部类,说明静态内部类属于外部类,不属于外部类对象
特点:
1 静态内部类的实例不会自动持有外部类的特定实例的引用,在创建内部类的实例时,不必创建外部类的实例。
外部类名.内部类名 A.B b =new A.B();
2 静态内部类可以直接访问外部类的静态成员,如果访问外部类的实例成员,必须通过外部类的实例去访问;
3 在静态内部类中可以定义静态成员和实例成员;
4 测试类可以通过完整的类名直接访问静态内部类的静态成员;
外部类.内部类.静态成员 Outter.Inner.age
实例内部类
没有使用static 修饰内部类,说明内部类属于外部类对象,不属于外部类本身
特点:
1 创建内部类对象必须通过外部类对象创建;
Outer.Inner inn = new Outer().new Inner();
2 内部类自动持有外部类的实例引用,内部类可以直接访问外部类成员;
3 外部类不能直接访问内部类成员,必须通过内部类实例访问;
4 实例内部类中不能定义静态成员
5 如果实例内部类和外部类存在同名字段或方法abc,那么在内部类中:
abc 表示局部成员
this.abc表示访问内部类成员
外部类.this.abc表示外部类成员
局部内部类
在方法中定义的内部类,其可见范围是当前方法和局部变量是一个级别。
特点:
1 不能使用public private protected static修饰符
2 局部内部类只能在当前方法中使用
3 局部内部类和实例内部类一样,不能包含静态成员
4 局部内部类和实例内部类,可以访问外部的所有成员
5 局部内部类访问的是局部变量,必须使用final修饰
在JAVA8中,会自动隐式final,但是依然是常量,不能改变值
匿名内部类
是一个没有名称的局部内部类,适合只使用一次的类。
特点:
1 匿名内部类本身没有构造器,但是会使用父类的构造器。
2 匿名类尽管没有构造器,但是可以在匿名类中提供一段实例初始化代码块,JVM在调用父类构造器后,会执行该代码块
3 内部类处理可以继承类之外,还可以实现接口