内部类
内部类
定义在其他类内部的类。由于内部类的上级是外部类,所以内部类可以比外部类多使用三个修饰符:private,protected,static。
在JVM看来,内部类也是一些独立的类,在编译的时候会将每个内部类编译成OuterClass$InnerClass.class类似的文件,等级和外部类一样。不过在每一个内部类中保存了一个外部类的对象引用。这样在内部类中就可以访问外部类的数据,甚至是私有的数据。
内部类的分类
1.非静态内部类
2.静态内部类
3.局部内部类
4.匿名内部类
1.非静态内部类
非静态内部类在外部类看来和普通的非静态成员没有什么不同,外部类怎么对待其他的非静态成员也就怎么对待非静态内部类。还有就是不要在外部类的静态方法中使用非静态的内部类。毕竟静态和非静态的归属不一样,一个是属于类的一个是属于对象的。
1.1非静态内部类在外部类内使用
使用非静态内部类和使用其他普通类没有什么不同,用new来创建成员变量。然后就没有然后了...
1.2非静态内部类在外部类外使用
首先非静态内部类只能在访问控制符对应的访问权限内被使用,也就是说如果内部类是private的,那么外类部外是无论如何也不能使用的。
由于非静态内部类和非静态成员变量一样是依附于具体的对象的,所以要先有外部对象才能有非静态的内部类对象,就像这样Out.In in = new Out().new In();
2.静态内部类
同理,静态内部类也可以看成普通的静态成员,外部类怎么对待其他静态的成员也就对待静态的内部类。还有就是在静态内部类中不能使用外部的非静态成员。同理,一个属于类一个属于对象,注定不能在一起使用。
2.1静态内部类在外部类内使用
使用静态内部类和使用其他普通类没有什么不同,用new来创建成员变量。然后也没有然后了...
2.2静态内部类在外部类外使用
首先静态内部类只能在访问控制符对应的访问权限内被使用,也就是说如果内部类是private的,那么外部类外是无论如何也不能使用的。
因为静态内部类是属于类的,所以创建静态内部类对象的时候就不用先创建外部类的对象了,可以像这样子Out.StaticIn in = new Out.StaticIn();
直接创建。
3.局部内部类
定义在方法内部的类,只有在方法内部有效。讲真,感觉这个内部类使用到的机会应该是很少的....
4.匿名内部类
匿名内部类适合那种只需要使用一次的类。
定义匿名内部类的格式就像这样new 接口() | 父类构造器([参数]) {}
。从这个定义中,可以看出匿名内部类一般是用来继承一个类,或者实现一个接口。因为系统在创建匿名内部类的时候,会立即创建匿名内部类的对象,所以匿名内部类中不能有抽象的方法(有抽象方法就不能被实例化),和构造器(因为匿名类没有类名)。
还有被匿名内部类使用的外部局部变量必须使用final修饰(在Java8中会自动加上final)。