如果一个类的内部包含着另外一个类,里面的类被称为内部类,外面的类被称为外部类
1.成员内部类【掌握】
1>概念:和成员变量或者成员方法平级的内部类
2>语法
访问权限修饰符 class 外部类类名 {
//外部类的成员变量
//外部类的成员方法
访问权限修饰符 class 内部类类名 {
//内部类的成员变量
//内部类的成员方法
}
}
总结:
a.实例化内部类对象:
Out.In in = new Out().new In();
其中,Out.In中的Out是为了标明In这个内部类存在于哪个外部类中【必须先有外部类才有成员内部类】
b.成员内部类的访问权限修饰符四种都可以使用【一般类只能使用public和default】
判断题:可以修饰类的修饰符只有public和default
c.成员内部类编译生成的class文件命名格式:外部类类名$内部类类名.class,例如:Out$In.class
d.优点:内部类可以随意访问外部类中的成员变量和成员方法而不需要创建外部类的对象
2.局部内部类【方法内部类】
1>概念:是和局部变量平级,存在于方法中的内部类
2>语法
访问权限修饰符 class 外部类类名{
//外部类的成员变量
//外部类的成员方法
访问权限修饰符 返回值类型 方法名(参数列表) {
class 局部内部类类名{
//内部类成员变量
//内部类成员方法
}
}
}
总结:
a.局部内部类和局部变量有相同的作用域
b.和局部变量类似,不能使用访问权限修饰符修饰局部内部类
c.局部内部类编译生成的class文件命名格式:外部类类名$1内部类类名.class,Out$1In.class
d.在局部内部类中无法访问与其平级的局部变量,如果要访问,则必须为不同的命名,而且这个变量实质上一个常量
e.外部类中的成员方法如果要传参,则形参必须使用final修饰
3.静态内部类
1>使用static修饰的成员内部类
2>语法
访问权限修饰符 class 外部类类名 {
//外部类的成员变量
//外部类的成员方法
访问权限修饰符 static class 内部类类名 {
//内部类的成员变量
//内部类的成员方法
}
}
总结:
a.实例化对象
Out.In in = new Out.In();
将Out.In当做一个整体,直接new出内部类的对象【通过类名访问static,生不生成外部类的对象都没有关系】
b.静态内部类相当于是静态成员变量,可以使用四种访问权限修饰符
c.静态内部类编译生成的class文件命名格式和成员内部类一样
d.在静态内部类中只能访问外部类中的静态成员变量
4.私有内部类
1>概念:被private修饰的成员内部类
2>语法
访问权限修饰符 class 外部类类名 {
//外部类的成员变量
//外部类的成员方法
private class 内部类类名 {
//内部类的成员变量
//内部类的成员方法
}
}
总结:
a.如果一个内部类是私有的,那么他只能在当前的外部类中被访问
5.匿名内部类【重点】
1>概念:没有名字的类
正因为没有名字,所以匿名内部类只能使用一次,通常用来简化代码,使用匿名内部类有一个前提条件:必须继承一个父类或者实现一个接口
总结:
a.匿名内部类没有名字
b.匿名内部类其实是指定类的子类或者执行接口的实现类
c.匿名内部类编译生成的class文件的命名格式:外部类类名$1.class【类比局部内部类】