内部类
概念
在一个类中定义的类叫做内部类,包含这个内部类的类叫做外部类。
public class test {
private int id;
private String name;
class MyInner{//内部类
}
}
为什么使用内部类
避免名字的泛滥和对外部不可见,内部类可以直接使用外部类的私有成员。
内部类分类
1.成员内部类:
(1) 普通成员内部类
class 外部类{
class 内部类类名 {
内部类成员
}
}
说明:
① 内部类可以直接访问外部类的所有成员,包括私有成员
②在外部类中访问内部类的成员,必须创建对象
③在外部类以外想要访问内部类的数据,必须以特定格式进行创建, 外部类名.内部类名 内部类对象名 = new 外部类名().new 内部类名();
④在外部类中可以通过创建对象的方式访问内部类中私有成员,但是在外部类以外只能访问非私有的
⑤成员内部类在使用的过程中要注意在哪里访问内部类中的数据,根据位置的不同创建对象的方式也是不同的。
⑥如果内部类与外部类中有重名的变量,在当前内部类中包含两个this,指向内部类的变量通过this.调用,指向外部类的变量通过外部类名.this.调用。
(2) 私有成员内部类
public class Teacher {
private class Student{
}
}
①在外部类中创建内部类对象可以访问私有成员变量
② 在外部类以外不能直接访问(不能直接创建)私有成员内部类
③可以直接调用外部类中定义的公共的访问私有成员内部类的方法间接的访问内部类
(3) 静态成员内部类
public class Teacher {
static class Student{
}
}
①静态内部类中不能访问外部类中非静态的变量
②静态内部类中的普通方法可以访问内部类中的所有成员,静态方法只能访问内部类中的静态成员。
③是否能在外部类中通过类名的方式访问静态内部类的成员,要看当前内部类中的成员是否是静态的
④在外部类中访问静态内部类中的非静态成员,必须创建对象进行访问
⑤在外部类以外访问静态内部类,需要以 "外部类名.内部类名 内部类对象名 = new 外部类名.内部类名();"的方式创建对象来访问内部类成员,不能访问私有的,可以访问静态的。
2.局部内部类(定义在方法中的内部类)
①方法中的局部变量,外界都没有办法访问到,所以方法中的内部类,外界也没有办法访问到。
②方法中的内部类可以访问成员变量,也可以访问方法内的局部变量,也可以访问本类中的变量。
③在外部类中访问局部内部类,因为内部类在方法调用完毕后就随着方法一起消失了,只有在方法内部创建内部类对象,进行调用,外界调用局部内部类所在的方法,间接的创建局部内部类对象,间接访问内部类中的成员。
④如果外部类中和方法中还有方法中的内部类中有重名的变量,则不能访问到方法中的变量。
注:
①局部内部类访问方法局部变量和方法参数问题:
必须要使用final来修饰方法参数和局部变量 ,但是jdk1.8中没有强制添加final关键字。
为什么:因为即使是内部类,生命周期也比局部变量的生命周期长,添加final的意义是增长局部变量的生命周期。
3.匿名内部类(没有名字的内部类)
new 父类名称/父类接口的名称(){
//重写抽象类中的方法
@Override
public void show() {
System.out.println("...");
}
}.成员方法;