概念
内部类是包含在类中的类,所以内部类也称为“嵌套类”,包含内部类的类称为外部类。内部类可以看作是外部类的一个成员,所以内部类也被称为“成员类”。
特点
- 内部类可以拥有自己的成员变量与成员方法,通过建立内部类对象,可以访问其成员变量或者调用成员方法。通过建立内部类对象,可以访问其成员变量或者成员方法。
- 在外部引用内部类时,则必须在内部类名前冠以其所属外部类的名称才能正常使用。在new运算符创建内部类时,也要在new前面冠以对象变量。
- 内部类中不能定义静态成员
- 内部类可以定义在外部类的方法外面,也可以定义在外部类的方法体
- 在方法体外面定义的内部类的访问类型可以是public,protecte,默认的,private等4种类型,创建内部类的实例对象时,一定要先创建外部类的实例对象,然后用这个外部类的实例对象去创建内部类的实例对象
- 方法内部定义的内部类前面不能有访问类型修饰符,就好像方法中定义的局部变量一样,但这种内部类的前面可以使用final或abstract修饰符。这种内部类对其他类是不可见的,其他类无法引用这种内部类,但是这种内部类创建的实例对象可以传递给其他类访问。
成员内部类
成员内部类可以无条件访问外部类的所有成员属性和成员方法(包括private成员和静态成员)。如果要访问外部类的同名成员,需要使用下面的形式进行访问:
- 外部类.this.成员变量
- 外部类.this.成员方法
如果在外部类想要访问成员内部类的成员,必须先创建一个成员内部类的对象,在通过指向这个对象的引用来访问。创建成员内部类的对象,前提是必须存在一个外部类的对象。
例如使用下面两种方式创建内部类的对象:
第一种:Outter out = new Outter(); Outter.Inner in = out.new Inner(); //通过Outter对象来创建
第二种:Outter.Inner in = outter.getInnerlnstance();
内部类可以拥有private权限、protected权限、public权限以及包访问权限
public class Outter{
private int age; //声明外部类的私有成员变量
public class Student{ //声明内部类
String name; //声明内部类的成员变量
public Student(String n,int a){ //定义内部类的构造方法
name = n;
age = a;
}
public void output(){ //内部类的成员方法
System.out.println("姓名"+this.name+"年龄"+"age");
}
}
public void output(){ //外部类的成员方法
Student stu = new Student("张三",24);
stu.output();
}
public static void main(String[] args){
Outter out = new Outter();
out.output(); //用out调用外部类的方法
}
}
局部内部类
局部内部类就像是方法里面的局部变量一样,是不能有public、private、protected以及static修饰符修饰的。
匿名内部类
匿名内部类是指可以利用内部类创建没有名称的对象,他一步完成了声明内部类和创建该类的一个对象,并利用该对象访问到类的成员。一般使用匿名内部类的方法来编写时间监听代码。
匿名内部类是唯一一种没有构造器的类,也是不能有访问修饰符和static修饰符的。
静态内部类
静态内部类是不需要依赖于外部类的,这点和类的静态成员属性有点类似,并且它不能使用外部类的非静态成员变量或方法