第四周:内部类
概念:将一个类定义在另一个类中或方法里面,这样的类称为内部类。 //在A类中定义一个B类,B就属于A的内部类
分类:成员内部类、局部内部类、匿名内部类、静态内部类
访问特点:
1.内部类可以直接访问外部类的成员,包括私有成员;
2.外部类要访问内部类的成员则必须建立内部类的对象;
共性:
1.内部类仍然是一个独立的类,在编译之后内部类会被编译成独立的.class文件,但前面会有外部类的类名和$符号;
//例如:外部类$内部类.class
2.内部类不能用普通的方式访问,内部类是外部类的一个成员,因此内部类可以自由的访问外部类的成员变量,不管有无private;
详细区别:
1.成员内部类
成员内部类相当于外部类的一个成员;被定义在类(外部)中方法外;
创建对象的格式为:
外部类名.内部类名 对象名 = 外部类名.内部类对象;
// Outer.Inter 对象名 = new Outer.Inter;
成员内部类之所以可以直接访问内部类的成员,是因为内部类中有一个外部类对象的引用:外部类名.this;
成员内部类可以用的修饰符:final、abstract、public、private、protected、static;
2.静态内部类
静态内部类就是在成员内部类的基础上加静态修饰符static;被定义在类(外部)中方法外;
在外部类中访问静态内部类有两种场景;
1.在外部类中访问静态内部类中非静态成员:外部类名.内部类名 对象名 = 外部类名.内部类对象;需要通过创建对象访问;
2.在外部类中访问静态内部类中的静态成员:外部类名.内部类名 对象名 = 外部类名.内部类对象;也可以用:外部类名.内部类名.成员;
3.局部内部类
局部内部类就是定义在局部位置的类,也就是定义在类中方法内的类;
tips:
1.方法内部类只能在定义该内部类的方法内实例化,不可以在此方法外对其实例化;
2.方法内部类对象不能使用该内部类所在方法的非final局部变量;
可以用于局部内部类的修饰符有:final、abstract;
静态方法中的方法内部类只能访问外部的静态成员;
4.匿名内部类
匿名内部类是内部类的简化写法,是建立一个带内容的外部类或者接口的子类匿名对象;
前提:
内部类可以继承或实现一个外部类或者接口;
格式:
new 外部类名或者接口名( ){ 方法重写 };
通常在方法的形式参数是接口或者抽象类、且该接口中的方法不超过三个时可以将匿名内部类作为参数传递;
总结
从位置上讲:可以分为:成员内部类和局部内部类,静态内部类同属成员内部类,都在成员位置;