顾名思义,内部类的意思就是在类中再写一个类
内部类有:成员内部类、静态内部类、局部内部类和匿名内部类四种
成员内部类:
1). 在类的内部定义,与实例变量、实例方法同级别的类。
2). 属于外部类的一个实例部分,创建内部类对象,必须依赖外部类对象。
3). Outer out = new Outer();
Outer.Inner in = out.new Inner();
4). 当外部类、内部类存在重名属性时,有限访问内部类属性,通过外部类类名.this.外部类实例属性
5). 成员内部类不能定义静态成员。(比如内部类是一间锁着的屋子,而打开这房间的钥匙放在外部类对象手中,所以要想创建内部类就先要创建外部类对象,也就是拿着房间钥匙的人,而静态成员是再类加载的时候就存在的,可以通过类名.成员名访问的,所不行。)
public class TestInternal {
public static void main(String[] args) {
Outer out = new Outer();
Outer.Inner in = out.new Inner();
in.print();
}
}
class Outer{
private int a = 10;
class Inner{//成员内部类
int b = 20;
public void print(){
int c = 30;
System.out.println(Outer.this.a);//访问外部类实例变量
System.out.println(this.b);//访问内部类实例变量
System.out.println(c);//访问内部类方法变量
}
}
}
静态内部类:
1). 不依赖外部类对象,可直接创建或通过类名访问,也可声明静态成员。
2)与静态属性和静态代码块等级相同。
3). Outer.Inner.静态成员
Outer.Inner in = new Outer.Inner();
4)作用:可以为外部类提供一些必要的初始行为
public static void main(String[] args) {
//Outer.Inner in = new Outer.Inner();
Outer.Inner.print();
}
}
class Outer{
int i = 0;
static int a = 20;
static class Inner{
static int b = 10;
public static void print(){
//System.out.println(Outer.this.i);//静态不能访问非静态
System.out.println(b);
System.out.println(Outer.a);
}
}
}
局部内部类:
1). 定义在外部类的方法中,作用范围和创建对象的范围仅限当前方法中。
2). 局部内部类访问外部类局部变量时,因无法保障变量的生命周期与自身相同,所以修饰为final。
(JVM栈中的局部变量在使用完之后就会释放内存空间,Heap堆中的对象在内存满了之后会JVM - GC垃圾收集器进行回收(非及时,也可手动回收(不建议)),方法区中的存储的类的信息会在类卸载之后释放空间(存在时间长),而常量就存储在方法去中的运行时常量池中)
3). 隐藏类的信息、限制类的使用范围。
class Outer{
Printable p = null;
//外部类实例方法
public void m1() {
/*final*/int b = 20; //Cannot refer to a non-final variable b inside an inner class defined in a different method
class Inner implements Printable{
@Override
public void print() {
//b = 30;//变量b必须是final修饰的常量
System.out.println(b); //20 局部内部类访问外部类的局部变量,必须要加final(JDK8隐式存在final,JDK7中会编译错误,需要手动加final)
}
}
p = new Inner();
}
}
//父类、接口
interface Printable{
public void print();
}
匿名内部类:
1)没有类名的局部内部类,正因为没有名字,所以匿名内部类只能使用一次,它通常用来简化代码编写
2). 必须继承一个父类或实现一个接口。
3). 定义类、实现类、创建对象的语法合并,只能创建一个该类的对象。
4). 优:减少代码量,书写的思路流畅。
5). 劣:可读性较差。
currentTeacher = new 父类名或接口名() { };