内部类
定义:定义在类结构中的另一个类。
类中能定义的成员:
1):成员变量
2):方法
3):内部类
为什么使用内部类?
1):增强封装,把内部类隐藏在外部类之内,不允许其他类访问。
2):内部类能提高代码的可读性和维护性,把小型类嵌入到外部类中结构上代码更靠近。
3):内部类可以直接访问外部类的成员。
内部类根据使用不同的修饰符或者定义的位置不同分成四种:
① 实例内部类:内部类没有使用static修饰。(说明内部内属于外部类的对象,不属于外部类本身)
1):创建实例内部类前,必须存在外部类对象,通过外部类对象创建内部类对象(当存在内部类对象时,一定存在外部类对象)。
例如:class External{
Class Interior{
}
}
通过外部内对象创建内部类对象:
External.Interior a = new External().new Interior();
2):实例内部类的实例自动持有外部类的实例的引用,内部类可以直接访问外部类成员。
内部类的成员修饰符的四种修饰符的权限都是可以在本类中直接调用的。
3):外部类中不能直接访问内部类成员,必须通过内部类的实例访问。
4):实例内部类中,不能定义静态成员和方法,只能定义实例成员。
5):如果实例内部类和外部内部类存在同名的字段或方法abc,那么在内部类中:
this . abc表示访问内部类成员;
外部类 . This . abc表示访问外部类成员。
② 静态内部类:内部类使用了static修饰。
1): 静态内部类的实例不会自动持有外部类的特定实例的引用,在创建内部类的实例时,不必创建外部类的实例。
例如:class External {
static class Interior {
}
}
通过外部内对象创建内部类对象:
External.Interior a = new External.Interior();
2):静态内部类可以直接访问外部类的静态成员,如果要访问外部类的实例成员,必须通过外部类的对象访问。
3):静态内部类中可以定义静态成员和实例成员。
4):测试类可以通过完整的类名直接访问静态内部类的静态成员。
③ 局部内部类:在方法中定义的内部类。破坏封装,打死都不直接用.
重点:局部内部类访问的局部变量必须使用final修饰(在Java8中自动隐式加上final,但是依然是常量,不能改变值。)
④ 匿名内部类:适合于仅使用一次的内部类,属于局部内部类的特殊情况。
参考:..\workspace\project\src\类和对象\匿名内部类实例\Text.java
在开发中,经常有这样的类,只需要定义一次,使用一次就可以丢弃了。此时:就不应该白白定义在一个文件中。
特点:
1):匿名内部类没有构造器,但是会调用父类构造器。
2):匿名类尽管没有构造器,但是可以在匿名类中提供一段实例初始化的代码块,JVM在调用父类构造器后会执行该段代码。
格式:new 父类名(实参列表)/接口()
注意:匿名内部类必须要继承一个父类或者实现一个接口,但最多只能一个父类或实现一个接口。
1):内部类除了可以继承之外,还可以实现接口。
应用场景:
最多的情况,在处理事件机制的时候会使用到. 在后续的过程中,大量运用到.
编译之后: 对于每个内部类来说Java编译器会产生独自的 .class文件
成员内部类:外部类名$内部类名.class
局部内部类:外部类名$数字内部类名.class
匿名内部类:外部类名$数字.class
内部类看做是外部类的一个成员,好比字段,那么内部类可以使用:private、缺省、protected、和public修饰